msp430测量方波频率

2019-03-23 22:27发布

今天看了mcu工程师炼成记,写了个代码。我的思路是计算两次上升沿捕获到的定时器值的差,小于0就加上65536。通过这个差值,再乘以定时器时钟周期就是所测得的方波周期。测试时我用P1.0输出的aclk信号连接接受捕获信号的引脚P1.1进行测试,但是测试时发现差值一直变化非常大。我实在是没看出来。还麻烦大家看看哪有问题。备注都很清楚。谢谢大家!#include <msp430.h>
#define uint unsigned int
#define uchar unsigned char
uint new_cap=0;
uint old_cap=0;
uint cap_diff=0;
uint cap_diff2=0;
uint j=0;
uint i;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
for(i=0;i<20000;i++);//等晶振稳定震荡
P1DIR=0x41;//P1.0输出ACLK,P1.6为LED设置为输出
P1SEL=0X03;//P1.0输出ACLK信号,为第二功能。P1.1引脚作输入接受捕获信号,为第二功能。
CCTL0=CM_1+CCIS_0+SCS+CAP+CCIE;//上升沿捕获+P1.1捕捉CCI0A 输入+同步+捕获模式+开始中断
TACTL=TASSEL_2+MC_2;//SMCLK时钟+连续模式
_BIS_SR(LPM0_bits+GIE);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=0x40;//led翻转
j++;
if(j%2>=1)
old_cap=TACCR0;//第一次捕获上升沿时,定时器的值
if(j%2==0)
{
new_cap=TACCR0;//第二次捕获上升沿时,定时器的值
if(new_cap<old_cap)
cap_diff=65536+new_cap-old_cap;//两次相减得到一个周期内定时器的计数
else
cap_diff=new_cap-old_cap;//两次相减得到一个周期内定时器的计数
CCTL0&=~CCIE;//两次捕获完成之后关中断。方便调试
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
Li_Lei
2019-03-24 12:36
是这个意思,如果你的两个上升沿跨过了两个计数周期,那算法就不对了.
另外程序可以再优化成每次计算,
新数和上次求差
保存本次计数,下次才来就是旧数了

一周热门 更多>

相关问题

    相关文章