msp430单片机用定时器A测量方波相位差的程序如何编写?真的很急!拜托了!

msp430单片机用定时器A测量方波相位差的程序如何编写?真的很急!拜托了!,第1张

这个简单,把两个方波进行异或,用430单片机的定时器A测量异或后的方波的脉冲宽度,在对测量数据进行简单的计算就可得到相位差。。。具体程序如下:

P1SEL

|=

BIT2

//设置P1.2端口为功能模块使用

TACTL

|=TACLR

TACTL

=

TASSEL_2+TAIE+MC1

//定时器A时钟信号选择SMCLK

8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式

CCTL1

=CM0+SCS+CAP+CCIE

//输入上升沿捕获,同步,capture模式

CCI0A为捕获信号源,中断使能

//TACCTL1

&=~CCIFG

//清CCR2

的标志位

//中断允许

_EINT()

LPM0

}

#pragma

vector=TIMERA1_VECTOR

//定时器A中断处理

__interrupt

void

timer_a(void)

{

switch(TAIV)

//向量查询

{

case

2:

//捕获中断

if(CCTL1&CM0)

//上升沿

{

CCTL1=(CCTL1&(~CM0))|CM1

//更变设置为下降沿触发

start=TACCR1

//记录初始时间

overflow=0

//溢出计数变量复位

}

else

if(CCTL1&CM1)

//下降沿

{

CCTL1=(CCTL1&(~CM1))|CM0

//更变设置为上升沿触发

end=TACCR1

//用start,end,overflow计算脉冲宽度

TACTL

&=~TAIE

//不使能中断

CCTL1

&=~CCIE

P1SEL

&=~BIT2

_DINT()

LPM0_EXIT

}

break

case

10:

//定时器溢出中断

overflow++

break

//溢出计数加1

default:break

}

}

然后再对得到的start,end,overflow处理计算即可。。。

这个简单,把两个方波进行异或,用430单片机的定时器A测量异或后的方波的脉冲宽度,在对测量数据进行简单的计算就可得到相位差。。。具体程序如下:

P1SEL |= BIT2//设置P1.2端口为功能模块使用

TACTL |=TACLR

TACTL = TASSEL_2+TAIE+MC1 //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式

CCTL1 =CM0+SCS+CAP+CCIE //输入上升沿捕获,同步,capture模式 CCI0A为捕获信号源,中断使能

//TACCTL1 &=~CCIFG//清CCR2 的标志位

//中断允许

_EINT()

LPM0

}

#pragma vector=TIMERA1_VECTOR //定时器A中断处理

__interrupt void timer_a(void)

{

switch(TAIV) //向量查询

{ case 2://捕获中断

if(CCTL1&CM0) //上升沿

{

CCTL1=(CCTL1&(~CM0))|CM1 //更变设置为下降沿触发

start=TACCR1 //记录初始时间

overflow=0//溢出计数变量复位

}

else if(CCTL1&CM1) //下降沿

{

CCTL1=(CCTL1&(~CM1))|CM0 //更变设置为上升沿触发

end=TACCR1 //用start,end,overflow计算脉冲宽度

TACTL &=~TAIE //不使能中断

CCTL1 &=~CCIE

P1SEL &=~BIT2

_DINT()

LPM0_EXIT

}

break

case 10: //定时器溢出中断

overflow++

break //溢出计数加1

default:break

}

}

然后再对得到的start,end,overflow处理计算即可。。。

单片机MSP430入门理论⑨--定时器模块-定时器A④

上期大概给大家汇总介绍了,定时器模块中定时器A的CCTLx捕获/比较控制寄存器,CCTLx是用来设置捕获模式,捕获的输入端,捕获模式,OUT输出,捕获标志等

本期将继续介绍定时器A最后一个中断向量寄存器,然后实践一下程序该怎么写

1.0 TAIV 中断向量寄存器

上图先简单说明下,TATV中断向量寄存器,看上图,TATV的值为0A(十进制的10)时,就表明目前触发的是溢出定时器中断标志TAIFG,属于优先级最低的中断,当TATV的值为02时,就说明目前触发的是最高等级的中断,比较捕获寄存器1

TAIVx bit 3-1 

Timer_A 有两个中断向量,一个单独分配给捕获比较寄存器CCR0,另一个作为共用的中断向量,用于定时器和其他捕获比较寄存器

CCR0中断向量具有最高的优先级,因为CCR0能用于定义是增计数和增减计数模式的周期。因此他需要最快速度的服务,CCIFG0在被中断服务时能自动复位

CCR1-CCRx和定时器共用另一个中断向量,属于多源中断,对应的中断标志CCIFG1-CCIFGx和TAIFG1在读中断向量字TAIV后,自动复位。如果不妨问TAIV寄存器,则不能自动复位,须用软件清除。如果相应的中断允许位复位(不允许中断),则将不会产生中断请求,但中断标志扔存在,这时须用软件清除。

关于中断挂起和返回不包括处理约需要11-16个时钟周期

实例1:定时器A自动溢出

利用TemerA直接计数产生溢出,然后中断处理。

ACLK=TACLK=32768HZ,MCLK=SMCLK=default DCO~800kHZ

时间关系没来的及验证,大家可以按照上面的试一下


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7790371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存