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

2019-03-24 10:21发布

利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。     本例程用到了定时器ACCI1A端口(例如MSP430F14XP1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。在实际应用中可根据例程中的start,end,overflow三个变量来计算脉冲宽度。此功能模块在实际产品应用中体现出有较高的应用价值。2-例程#include <msp430x14x.h>unsigned int start,end;unsigned char overflow;void main (void){ WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗定时器 P1DIR = BIT0+BIT4;                        //设置P1.0方向为输出 P1SEL = BIT2;                             //设置P1.2端口为功能模块使用 TACTL = TASSEL0+TACLR+TAIE+MC1;           //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式 CCTL1 = MC0+SCS+CAP+CCIE;                 //输入上升沿捕获,CCI0A为捕获信号源 _EINT();                                  //中断允许 while(1);                                 //LOOP}#pragma vector=TIMERA1_VECTOR              //定时器A中断处理__interrupt void timer_a(void){ switch(TAIV)                              //向量查询 { case 2:                               //捕获中断       if(CCTL1&CM0)                     //上升沿        {           CCTL1=(CCTL1&(~CM0))|CM1;       //更变设置为下降沿触发           start=TAR;                      //记录初始时间           overflow=0;                     //溢出计数变量复位        }      else if (CCTL1&CM1)                //下降沿       {             CCTL1=(CCTL1&(~CM1))|CM0;       //更变设置为上升沿触发           end=TAR;                        //start,end,overflow计算脉冲宽度       }          break;   case 10:                              //定时器溢出中断      overflow++;      break;                             //溢出计数加1   default:break; }}//例程结束 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
hzlxlzh
1楼-- · 2019-03-25 12:54
nemo1991 发表于 2015-4-5 18:34
我觉得说的思路可以得啊。

这个程序我是能读懂和理解的,但加在我的程序里不成功,心率一直显示535
tiankai001
2楼-- · 2019-03-25 17:00
 精彩回答 2  元偷偷看……
hzlxlzh
3楼-- · 2019-03-25 22:17
tiankai001 发表于 2015-4-6 00:05
你实际模拟仿真测试一下,看看中断响应时的捕获的数据是否正确

TACCTL1 = CAP+CM_1+CCIS_0+SCS+CCIE;              // 输入捕捉,上升沿触发(upCM_1,downCM_2,updownCM_3),同步捕捉,CCR0 中断使能
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR;        // 选择SMCLK为时钟,连续增计数模式 ,溢出中断使能
_EINT();                                  //开全局中断
我现在不清楚我这样设置定时器A时,选择SMCLK为时钟,SMCLK的频率是多少,单片机是launchpad g2553
hzlxlzh
4楼-- · 2019-03-26 03:25
本帖最后由 hzlxlzh 于 2015-4-7 13:05 编辑

#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溢出中断;
  }
}
hzlxlzh
5楼-- · 2019-03-26 08:20
 精彩回答 2  元偷偷看……
数码小叶
6楼-- · 2019-03-26 14:17
hzlxlzh 发表于 2015-4-6 06:30
#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

我也看不出问题出哪了,你调试时,看下那几个量的值是多少,手工一步步算一下

一周热门 更多>

相关问题

    相关文章