智能车制作
标题:
输入捕捉不准
[打印本页]
作者:
zhengz
时间:
2009-9-14 15:56
标题:
输入捕捉不准
大家好,我最近编了一个输入捕捉测脉冲频率的小程序,发现测的脉冲的频率不太准,比如,如果是1hz,我测得是频率是0.965左右,如果是100hz,测得的频率是99.58hz左右,如果是1000hz,测得的频率是995.5左右,大家帮忙分析下,是什么原因呢,程序如下:
#include <hidef.h> /* common defines and macros */
#include <mc9s12hy64.h>
#pragma LINK_INFO DERIVATIVE "mc9s12hy64"
void timer0_init(void)
{
TIM0_TIE=0x10; //允许C4I中断
TIM0_TSCR2_PR=0x02; //时钟=M Clock/4=2MHz
TIM0_TIOS =0xEF; //ch2设置为输入捕捉
TIM0_TSCR1_TEN = 1; //启用定时器
TIM0_TCTL3=0x02; //捕捉上升沿
TIM0_TFLG1=0xFF; //写1清除标志,其实是让寄存器中的值变成0
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 12 void timer0overflow(void)
{
if(!flg)
{
rising_1=TIM0_TCNT;
TIM0_TSCR2_TOI=1;
TIM0_TFLG1_C4F=1; //写1清除C2F标志
flg=1;
}
else
{
rising_2=TIM0_TCNT;
TIM0_TSCR2_TOI=0;
TIM0_TFLG1_C4F=1; //写1清除C2F标志
{
if(rising_2 < rising_1)
{
new_rising=rising_2+0xFFFF;
period=((float)new_rising-(float)rising_1);//单位为微秒
for(u=1;u<P;u++)
{ period=period+0xFFFF; }
}
else
{
period=((float)rising_2-(float)rising_1);
for(u=1;u<P;u++)
{ period=period+0xFFFF; }
}
TIM0_TCNT=0;
frequency=2000000.0/period; //Hz
t=frequency*24;
flg=0;
P=0;
}
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 16 void timeroverflow(void)
{
TIM0_TFLG2_TOF=1;
P++;
}
#pragma CODE_SEG D EFAULT
作者:
marui
时间:
2009-9-16 13:48
可以在软件中通过调整时间来抵消误差,以前我做过测频的东西也不准,调整一下就行了。
作者:
zhengz
时间:
2009-9-16 16:38
你是说要人为的加些延迟进去,是吗
作者:
chiusir
时间:
2009-9-17 19:17
是你的定时不准确吧。
作者:
zhengz
时间:
2009-9-18 09:06
我没用定时器啊,只是用的计数器捕捉脉冲下降沿嘛
作者:
chiusir
时间:
2009-9-19 09:11
那你的频率从何谈起?频率是“1秒”钟内脉冲发生的次数,这个“1秒”就是你要确定的时间槛。搞定时间槛频率测量就准确了!
作者:
zhengz
时间:
2009-9-19 10:29
哦,我没有用到定时,我就是采样两个相邻脉冲的下降沿,计算时间差,求得的脉冲频率,不是定时1s采样的脉冲个数,所以时间槛跟我的程序没关系啊
作者:
chiusir
时间:
2009-9-19 23:45
那你的时间差计算的准确吗?如果准确就没问题的。
作者:
chenrunshe_007
时间:
2009-9-20 01:31
可能是你没有把中断里面的运行语句耗得时间算进去所以有点误差,要不就真的是你的板本身的工艺所决定的精度不可能达到100%,有95%以上就不错了
作者:
liang88889999
时间:
2009-9-20 16:44
定时不准确吧。
作者:
xueyaping
时间:
2010-12-13 12:46
顶
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2