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

2019-03-24 10:21发布

#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条回答
hzlxlzh
2019-03-25 11:06
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章