This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

使用MSP430 的捕获功能记录的外部脉冲宽度与计算值相差很大

Other Parts Discussed in Thread: MSP430F1611, MSP430G2553

正在使用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;
}