TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F4152定时器A 捕捉功能

现在 想用MSP430F4152 TIMERA  捕捉P.12端口的脉冲宽度,现在是在捕捉到第一个脉冲上升源后进入 LPM3,等待下一个下降源后唤醒,计算两个源之间的时间,目前的问题是唤醒不能可靠唤醒,上升源和下降源直接的时间不对,想请教一下 在进入LPM3低功耗模式后,捕捉模式是否可以有效唤醒?时间差是否会准确?谢谢!

初始化如下

P1DIR &=~(BIT2); // P1.2(TA1)设为输入(可省略)

P1SEL |= BIT2; // P1.2设为第二功能(TA1) //设置这个位后 P1.2的中断功能就失效
TACTL = TASSEL_1 +ID_0+ MC_2 + TAIE + TACLR; // TA连续计数,开始计时,SMCLK,开中断
TACCTL1 = CAP + CM_1 + SCS + CCIE; //CCIxA and CCIxB are connected to external pins or internal signals //Key=0; //

#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
LPM3_EXIT;
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //上升沿
{ CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发
// start=TAR; //记录初始时间
start=0;
// overflow=0; //溢出计数变量复位
temp=temp+temp_add;
if(fangxiang==0) //反转
F_zong=F_zong+temp_add;
if(plus_UP==1)
{
start=TAR;
// start=TACCR1;
TAR=0;
// TACTL = TACTL| TACLR;
TACCR1=0;
plus_UP=0;
 
maikuan= overflow<<16+start; 
overflow=0; 
flow_N[N_count]=maikuan;
N_count++;
if(N_count>7)
N_count=0;
}//temp++;
}
else if (CCTL1&CM1) //下降沿
{ CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发
end_D=TAR; //用start,end,overflow计算脉冲宽度
TAR=0;
// end_D=TACCR1;
// TACCR1=0;
temp=temp+temp_add;
if(fangxiang==0) //反转
F_zong=F_zong+temp_add;
if(N_count==0) F_count=0;
if(plus_UP==0)
{
 
plus_UP=1; 
overflow= overflow<<16;
maikuan= overflow+start; 
overflow=0; flow_F[F_count]=maikuan;
F_count++;
if(F_count>7)
F_count=0;
}
 
} break;
case 10: //定时器溢出中断
overflow++;
if(overflow>30); //时钟连续溢出30次 ,脉宽滑差值赋值0 shunshi_C=0;
// time_over++;
break; //溢出计数加1
default:break;

}

灰小子:

看你的程序,定时器使用了SMCLK时钟。
lpm3的时候,SMCLK会被关闭的。
建议使用ACLK

michael ouyang:

回复 灰小子:

我用的是ACLK,注释有错误,再有就是有脉冲信号来的时候,如果唤醒后 时间好像也不对。谢谢!

Susan Yang:

回复 michael ouyang:

LPM3下ACLK是可以工作的,是可以正常进行信号捕获的。您现在精度要求如何,如果精度要求高则建议使用LPM1

michael ouyang:

回复 Susan Yang:

我现在需要的只是脉冲的上升源时记下这个时候的TAR并把TAR清0,进入LPM3,如果下一个上升源来的时,这个时候唤醒,并记录下这个时后的TAR,计算出这两次的TAR差值,目前的调试情况看,这个TAR有时候值很小,和实际的时间差 差很多;我想咨询一下,TAR在进入LPM3后是正常的累加吗?如果我 想计算出两个脉冲信号的宽度,用什么方法最合适,谢谢!

灰小子:

回复 michael ouyang:

 进入低功耗模式定时器也是正常累加的,只要定时器的时钟没被关闭。

你要捕获的脉冲周期是多少?定时器要选一个合适的时钟才可以。定时器太快,可能一个脉冲会垮多个定时器计数周期。定时器太慢对脉冲的计时精度就比较低。

michael ouyang:

回复 灰小子:

脉冲宽度最快的5毫秒,最宽的有10多秒钟,

michael ouyang:

回复 michael ouyang:

发现一个这样的问题,在进入__interrupt void timer_a(void)后 如果不加LPM3_EXIT,脉宽时间是对的,但是加LPM3_EXIT这个后TAR值就很小的,把这个移到中断程序的最后也是这个现象,想请教一下,这个LPM3_EXIT推出LPM3模式是否会影响到定时器的定时?谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F4152定时器A 捕捉功能
分享到: 更多 (0)