正在使用MSP430F1611芯片做捕获脉宽的实验,发现无论我的定时器时钟源设置为多少,实际测得的脉宽一直比理论值小65us,调试了两天,有时候测得数据还忽大忽小,希望有大神帮帮忙
下面是我的程序:
#include<msp430f1611.h> #define uchar unsigned char #define uint unsigned int uint width[10]={0,0,0,0,0,0,0,0,0,0}; uint i=0; uint cap_ave=0; uint cap_old=0; void main() { WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 P4SEL |=BIT0; //P4.0 作为捕获模块功能的输入端输入方波 P4DIR &=~BIT0; P5SEL |=BIT4+BIT5;//SMCLK,MCLK频率输出 P5DIR |=BIT4+BIT5; //-------开晶振 XT2---------BCSCTL1&=~XT2OFF; //打开 XT2 振荡器 BCSCTL1&=~XT2OFF; do { IFG1 &= ~OFIFG; // 清除振荡器失效标志 for (i=256;i>0;i--); // 延时,等待 XT2 起振 } while ((IFG1 & OFIFG) != 0); // 判断 XT2 是否起振 BCSCTL2 =SELM_2+SELS; //选择 MCLK=SMCLK 为 XT2 //-----------------------------TBCCTL0&=~(CCIS1+CCIS0); // 捕获源为 P4.0,即 CCI0A(也是 CCI0B) TBCCTL0|=CM_2+SCS+CAP+CCIE; //下降沿捕获,同步捕获,工作在捕获模式 //允许捕获比较模块提出中断请求 TBCTL|=ID_2+TBSSEL_2+TBCLR+MC_2;//8分频,选择时钟 MCLK,定时器清零, //定时器开始计数(连续计数模式 0~0xFFFF) _EINT(); while(1); } //―――――定时器 TB 的 CCR0 的中断:用于检测脉冲上升与下降沿―――― #pragma vector=TIMERB0_VECTOR __interrupt void TimerB0(void) { if(TBCCTL0&CM1) //捕获到下降沿 { TBCTL|=TBCLR; TBCCTL0=(TBCCTL0&(~CM1))|CM0;//改为上升沿捕获:CM1 置零,CM0 置一 } else if(TBCCTL0&CM0) //捕获到上升沿 { width[i++]= TBCCR0; //记录下结束时间 TBCCTL0 =(TBCCTL0&(~CM0))|CM1; //改为下降沿捕获:CM0 置零,CM1 置一 if(i==10) { for(uint x=0;x<i;x++) cap_ave +=width[x]; cap_ave /=i; i=0; cap_ave=0; } } else if(TBCCTL0&COV) TBCCTL0 &=~COV; TBCCTL0 &=~CCIFG; }