中级会员
 
- 积分
- 294
- 金钱
- 294
- 注册时间
- 2014-8-1
- 在线时间
- 6 小时
|
如何利用定时器的捕获功能测量频率,主要还是研究溢出中断和捕获中断的数据处理。官方给的历程误差太大了,不值得参考!
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
cnt_num++; //溢出中断
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// TIM_ITConfig( TIM2, TIM_IT_Update , ENABLE);
}
if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET)
{
new_data = TIM_GetCapture2(TIM2); //硬件级别的保存
// new_data = TIM2->CNT;
// TIM2->CNT=new_data;
OFnum=cnt_num;
cnt_num=0;
if(new_data < old_data)
{
data = old_data - new_data;
Frequency = 72000000.0 / (OFnum*65536 - data);
}
else
{
data =new_data - old_data;
Frequency = 72000000.0 / (OFnum*65536 + data);
}
old_data = new_data;
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
}
}
如果你定时的初始化时按照历程来的,可以负责任的告诉你,不行,其中应该改动的是
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger); //不在是复位,复位的话,捕获的时候也会产生更新中断会干扰溢出时候的更新中断的计数
不过遗憾的是,这次计数98%的时候得出的频率误差是0.04Hz以内,没有平均,也没有1S内计数。已经很不错了,但是2%的数据波动,我认为原因是第
二次捕获的时候,还没来得级进中断处理的时候,恰好又发送了溢出中断,导致OFnum多加了一次,打个比方,第二次上升沿保存的是65530,此时的
CNT还在计数,它刚好要进入中断的时候,溢出中断抢先一步,OFnum多了1, 高手们看看。帮本科生做毕设做出的问题觉得有兴趣的可以看看!
|
|