现在 想用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模式是否会影响到定时器的定时?谢谢!