[求助] 想用msp430 g2553 TimerA测输入方波的周期,用了下面的代码不成功,请求帮助!

hzlxlzh   2015-4-7 16:02 楼主
#define uchar            unsigned char
#define uint             unsigned int
uint a[10],n=0,overfloat=0;

int main(void)
{   uint heartrate,i;
   
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
    P1DIR &=~BIT2;
    P1REN |= BIT2;
    P1SEL |= BIT2;                 //输入捕捉端口(P1.2)
    TACCTL1 = CAP+CM_1+CCIS_0+SCS+CCIE;              // 输入捕捉,上升沿触发(upCM_1,downCM_2,updownCM_3),同步捕捉,CCR0 中断使能
    TACTL = TASSEL_2 + MC_2 + TAIE + TACLR;        // 选择SMCLK为时钟,连续增计数模式 ,溢出中断使能
    _EINT();                                  //开全局中断

    IO_Init();
    LCD_Init();
    uchar LCDBuf1[]={"heart rate:"};
   
    while(1)
      {  
        LCD_Write_Command(0x01);
        if(n>0&&n%2==1)
           heartrate=(2000000*60)/(65535*overfloat+(a[n]-a[n-1]));
              for(i=0;i<80;i++)
               {   
                   LCD_Disp_string(0,0,LCDBuf1);
     LCD_Write_Command(0x80+0x0c);  
                    Disp(heartrate);
                   if(heartrate==0)
   LCD_Disp_string(0,2,message[3]);
            else if(heartrate<=60)
   LCD_Disp_string(0,2,message[0]);
                   else if(heartrate<=120)
   LCD_Disp_string(0,2,message[1]);
                   else
                        LCD_Disp_string(0,2,message[2]);
               }
}
}
#pragma vector=TIMER0_A1_VECTOR  //捕获中断
__interrupt void Timer0_A1(void)
{
  switch(TA0IV)
  {
   case 2:
    {
      if(n%2==0)
        overfloat=0;
      a[n]=TAR;//CCR1
      if(n==9)
        n=0;
      else
        n++;
      break;
    }
   case  4:              break;                          // CCR2 not used
   case 10: overfloat++; break;              // TimerA溢出中断;
  }
}




以上是刚刚编好的程序,是用来测心率的,但运行时出了问题,给P1.2输入一个稳定的方波,会测出多个不同的心率值且相差十几到三十几左右,方波频率越大相差越大,比如170次每分钟,会显示一百五十多,一百七十多,二百二十多,不知道为什么,程序哪里出来问题,程序中心率计算用的思路是,输入脉搏方波信号,把定时器A设置为上升沿中断,定时器A中计数器设置为连续增计数模式,计数时钟周期为1/1000000秒,当输入方波信号上升沿时,定时器捕获中断,计数器的初值a[N-1]被保存并起动计数,当计数器计数到65536溢出时,计数器自动清零重新开始计数,当输入第二个方波信号上升沿时,定时器再次捕获中断,并保存定时器的终值a[n],单片机能记下一个脉搏周期内计数器的初值a[n-1]和终值a[n], 以及计数器溢出次数over—flow。代入下面的公式可算出脉搏的周期
T= [65536 * overflow +(a[n]-a[n-1])]/1000000

回复评论 (7)

2推荐 shower.xu 

1、你不清中断标志位的么?
2、计算过程要确保没有数据溢出
3、为什么不在上一次输入捕获时清零计时器和溢出次数,下一次捕获中断时(溢出次数*计数周期+当前计数值)不更好计算
点赞  2015-4-7 16:12
引用: shower.xu 发表于 2015-4-7 16:12
1、你不清中断标志位的么?
2、计算过程要确保没有数据溢出
3、为什么不在上一次输入捕获时清零计时器和溢出次数,下一次捕获中断时(溢出次数*计数周期+当前计数值)不更好计算

谢谢,已经解决,你提的第二点正中问题
点赞  2015-4-7 20:50
引用: shower.xu 发表于 2015-4-7 16:12
1、你不清中断标志位的么?
2、计算过程要确保没有数据溢出
3、为什么不在上一次输入捕获时清零计时器和溢出次数,下一次捕获中断时(溢出次数*计数周期+当前计数值)不更好计算

关于你提到的第一和第三点因为我是初学定时器A,不太理解,方便的话可以详细解释一下吗,谢谢!
点赞  2015-4-7 20:54
引用: shower.xu 发表于 2015-4-7 16:12
1、你不清中断标志位的么?
2、计算过程要确保没有数据溢出
3、为什么不在上一次输入捕获时清零计时器和溢出次数,下一次捕获中断时(溢出次数*计数周期+当前计数值)不更好计算

第三点想了想明白了
点赞  2015-4-7 20:56
引用: shower.xu 发表于 2015-4-7 16:12
1、你不清中断标志位的么?
2、计算过程要确保没有数据溢出
3、为什么不在上一次输入捕获时清零计时器和溢出次数,下一次捕获中断时(溢出次数*计数周期+当前计数值)不更好计算

希望你能把第一点详细解释一下吗?谢谢!
点赞  2015-4-7 20:59
不要在意第一条,那个是我错了,太久没接触430了
点赞  2015-4-7 21:23
引用: shower.xu 发表于 2015-4-7 21:23
不要在意第一条,那个是我错了,太久没接触430了

好的,谢谢
点赞  2015-4-7 21:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复