想用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-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
nemo1991
2楼-- · 2019-03-24 20:30
 精彩回答 2  元偷偷看……
hzlxlzh
3楼-- · 2019-03-25 01:33
nemo1991 发表于 2015-4-5 18:34
我觉得说的思路可以得啊。

那我的思路要改这个例程代码的哪里
nemo1991
4楼-- · 2019-03-25 06:10
hzlxlzh 发表于 2015-4-5 18:41
那我的思路要改这个例程代码的哪里

你先要学弟的知识:

1.定时其用法。启动、停止如何操作,如何读取数值。

2.想好边沿触发中断函数的处理逻辑,我觉得应该设置为双边沿触发,进入中断读取寄存器,判断电平。

3.g2不是做这个的最佳方案,建议使用带有capture功能的单片机。
hzlxlzh
5楼-- · 2019-03-25 07:46
 精彩回答 2  元偷偷看……
hzlxlzh
6楼-- · 2019-03-25 10:47
hzlxlzh 发表于 2015-4-5 19:18
G2的定时器A不带有捕获边沿触发中断的功能吗?但我看过g2553的头文件,里面好像有边沿捕获的定义

#define CM_0                (0*0x4000u) /* Capture mode: 0 - disabled */
#define CM_1                (1*0x4000u) /* Capture mode: 1 - pos. edge */
#define CM_2                (2*0x4000u) /* Capture mode: 1 - neg. edge */
#define CM_3                (3*0x4000u) /* Capture mode: 1 - both edges */

一周热门 更多>

相关问题

    相关文章