[MSP430] 捕获测量频率的问题

[复制链接]
 楼主| mosesren 发表于 2015-7-30 14:21 | 显示全部楼层 |阅读模式
用G2553做一个等精度测频的小模块,我采用了时钟的外部捕获,分别捕获两次下降沿并计算他的时间差来得到频率 但是这样做的精度老是不高,1K都有十几个HZ的误差。求大手帮助如何提高精度~
 楼主| mosesren 发表于 2015-7-30 14:23 | 显示全部楼层
void main(void) {
        WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
        if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) {
                                while (1)
                                        ; // If calibration constants erased, trap CPU!!
                        }
                        BCSCTL1 = CALBC1_1MHZ; // Set range
                        DCOCTL =  CALDCO_1MHZ; // Set DCO step + modulation
                        LCD_init();
                        IE_init();
                        _EINT();
                while(1){
                        if(flag==1)
                    {  _DINT();
                                flag=0;
                     count++;
                    if(count==1)
                    {
                            time_0=TA0CCR0;
                    }
                    else{
                                time_1=TA0CCR0;
                                count=0;
                            x=1000000/(time_1-time_0);
                                LCD_write_string(0,0,"The fra is :");
                                LCD_write_char(1,6,x%10000%1000%100%10+'0');
                                LCD_write_char(1,5,x%10000%1000%100/10+'0');
                                LCD_write_char(1,4,x%10000%1000/100+'0');
                                LCD_write_char(1,3,x%10000/1000+'0');
                                LCD_write_char(1,2,x/10000+'0');
                                _delay_cycles(2000);
                                TA0CTL=MC_2+TACLR;
                             }
                    _EINT();}
                    }
                     }
#pragma vector=TIMER0_A0_VECTOR  //TIMERA0CRRO中断服务程序;
__interrupt void A0CCRO_VECTOR(void)
{      flag=1;
}


void IE_init()
{
        P1REN|=BIT1;
        P1OUT|=BIT1;
        P1SEL|=BIT1;
        TA0CCTL0=CM_2+SCS+CCIS_0+CAP+CCIE;
        TA0CTL=TASSEL_2+MC_2+TACLR;
}
主要代码都在这里了
dirtwillfly 发表于 2015-7-30 15:49 | 显示全部楼层
只根据一个周期的时间来计算频率,肯定误差会比较大的。
建议用十个或者二十个周期的平均值来计算频率
 楼主| mosesren 发表于 2015-7-30 19:26 | 显示全部楼层
dirtwillfly 发表于 2015-7-30 15:49
只根据一个周期的时间来计算频率,肯定误差会比较大的。
建议用十个或者二十个周期的平均值来计算频率 ...

我不知道为什么好像测了一次就不继续测了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部