想用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
2019-03-24 16:37
我之前查到的测周期的思路,P1.0口输入脉搏方波信号,把定时器A设置为上升沿中断,定时器A中计数器设置为连续增计数模式,计数时钟周期为1/32768秒,当输入方波信号上升沿时,定时器捕获中断,计数器的初值a[N-1]被保存并起动计数,当计数器计数到65536溢出时,计数器自动清零重新开始计数,当输入第二个方波信号上升沿时,定时器再次捕获中断,并保存定时器的终值a[n],单片机能记下一个脉搏周期内计数器的初值a[n-1]和终值a[n], 以及计数器溢出次数over—flow。代入下面的公式可算出脉搏的周期
T= [65536 * overflow +(a[n]-a[n-1])]/32768

一周热门 更多>

相关问题

    相关文章