[求助] 430定时器捕获模块测频率问题

zh3872730   2012-7-21 17:26 楼主
各位 我的程序出了点问题:
思路及代码:
用TA0做上升沿捕获 P1.1为输入端,用TB0做计时器,计时到1s则用TA0捕获到的上升沿个数作为频率,用LCD输出。
#include
#include"nokia_5110.h"
#include"nokia_5110.c"
#define uchar unsigned char
unsigned int ci=0,s=0,n1=0,n0=0,s0,s1,s2,s3;
unsigned const char pinlv[][32]={
//频
{0x40,0x7C,0x40,0x7F,0x48,0x48,0x40,0xF2,0x12,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00,0x90,0x8E,0x40,0x4F,0x20,0x1E,0x80,0x4F,0x20,0x18,0x07,0x10,0x20,0x4F,0x80,0x00},
//率
{0x00,0x14,0xA4,0x44,0x24,0x34,0xAD,0x66,0x24,0x94,0x04,0x44,0xA4,0x14,0x00,0x00,0x08,0x09,0x08,0x08,0x09,0x09,0x09,0xFD,0x09,0x09,0x0B,0x08,0x08,0x09,0x08,0x00},
};
unsigned const char di[24]=
//第
{0x04,0xD3,0x52,0x56,0x52,0xF4,0x53,0x52,0x56,0x72,0x02,0x00,0x08,0x09,0x05,0x03,0x01,0x0F,0x01,0x01,0x09,0x09,0x07,0x00};

unsigned const char miao[24]=
//秒
{0x12,0xD2,0xFE,0x91,0x40,0x38,0x00,0xFF,0x00,0x04,0xB8,0x00,0x01,0x00,0x0F,0x00,0x08,0x08,0x04,0x04,0x02,0x01,0x00,0x00};
int i,j;
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  BCSCTL1&=~XT2OFF;    //打开外部晶振XT2(6MHz)
  BCSCTL2|=SELS;       //SMCLK选择外部晶振
  IFG1&=~OFIFG;                   //清除振荡错误标志
    while((IFG1&OFIFG)!=0)
    {
        for(i=0;i<0xff;i++);
        IFG1&=~OFIFG;               //清除振荡错误标志
    }
  LCD_Init();
  LCD_clear();
  display_chinese(0,0,pinlv[0]);    //LCD模块
  display_chinese(1,0,pinlv[1]);    //LCD模块
  for(i=0;i<2;i++)            //LCD模块
     {
          set_pos(28,4+i);    //设置显示的地址
          for(j=0;j<12;j++)
          {
               write_data(di[j+i*12]);
          }
     }  
  for(i=0;i<2;i++)            //LCD模块
     {
          set_pos(60,4+i);    //设置显示的地址
          for(j=0;j<12;j++)
          {
               write_data(miao[j+i*12]);
          }
     }
  display_char(7,1,'.');    //LCD模块
  display_char(11,1,'k');   //LCD模块
  display_char(12,1,'H');   //LCD模块
  display_char(13,1,'z');   //LCD模块
  P1DIR=0X00;                                //P1.1输入
  P1SEL |= 0x02;                             // Set P1.1 to TA0
  CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.1)
                                            // + Capture Mode + Interrupt
  TACTL = TASSEL_2 + MC_2;                  // SMCLK + Continuous Mode
  TBCCTL0 = CCIE;                           //TIMERB0计时1秒
  TBCCR0=50000;                             //6MHz/8/50000/15=1s
  TBCTL=TBSSEL_2+MC_1+ID_3;
  _EINT();
while(1);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
  if(TACCTL0 & CCIFG)
    TACCTL0 &= ~CCIFG;
  s++;   //  s记录上升沿个数
}
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
  if(ci==15)
  {
     set_pos(44,4);                     //设置显示地址//LCD模块
     for(i=0;i<6;i++)                   //LCD模块
       write_data(font6x8[n1+16]);   //写入点阵数据
     set_pos(50,4);                     //设置显示地址
     for(i=0;i<6;i++)                   //LCD模块
       write_data(font6x8[n0+16]);   //写入点阵数据
     n0++;                   //LCD模块   n0为计时的个位    n1为计时的十位
     if(n0==10){n0=0;n1++;}             //进位
     if(n1==10)n1=0;
     s0=s/1000;                         //s0为频率个位  单位kHz
     s1=(s%1000)/100;                   //s1为十分位
     s2=(s%100)/10;                     //百分位
     s3=s%10;                           //千分位
     display_char(6,1,s0+48);           //LCD模块
     display_char(8,1,s1+48);           //LCD模块
     display_char(9,1,s2+48);           //LCD模块
     display_char(10,1,s3+48);          //LCD模块
    s=0;                                //记录上升沿个数清零
    ci=0;                               //ci=15时表示记时到1s 清零
  }
  ci++;
}

问题如下:
TB0计时一秒没有问题,LCD显示也没问题,可是TA0记录上升沿的个数不正确,有时1秒才一次,最多50次,测的是1kHz的方波,就是不对。
到底是捕获模块的哪里出了问题,求高手指点。

回复评论 (9)

自顶

请各位高人仔细看下程序,前面的数组是LCD显示用的。
拜托了
点赞  2012-7-21 17:31

再顶

都检查一天了,没办法,只能靠大家了
点赞  2012-7-21 17:32

失误

第一行代码没复制完全
是#include
点赞  2012-7-21 17:33

#include"msp430x16x.h"
后面两个头文件是LCD用的,与程序关系不大
点赞  2012-7-21 17:35
5110?学校发的那个?
点赞  2012-7-29 23:33
这个频率我怎么也测不出 求助
点赞  2012-8-3 21:29
看了半天也木有看出来~
点赞  2012-8-4 00:40
不好意思了各位,这个程序其实是对的,后来才发现的,大家可以拿去做参考,虽然写的有点乱。。。
点赞  2012-8-4 16:46
当时出错是因为测的是函数信号发生器的方波,其实不行,因为那个方波是正负N伏的,即+-nV,而捕获的上升沿是从0V左右变到3.3V才能捕获,所以出问题。。
我的程序是测1s内的上升沿来确定频率的,非常准确,和示波器测出来的误差不超过1%,测量范围也很广,算是贡献给大家了。。
明天就电设了,求加油。。
点赞  2012-8-4 16:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复