初级会员

- 积分
- 117
- 金钱
- 117
- 注册时间
- 2017-6-25
- 在线时间
- 29 小时
|
2金钱
单片机选择的stm32f103zet6,现在做一个频率采样的产品,为了测试程序,先用了一个定时器输出一个pwm,在用一个定时器去采集;计算频率的方法是测量两个上升沿的时间作为一个周期计算频率;
程序都是在原子哥的程序上修改的;仿真时发现频率有偏差;
下面是计算一个周期的时间的程序
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
if(TIM3CH4_CAPTURE_STA&0X40)
{
if((TIM3CH4_CAPTURE_STA&0X3F)==0X3F)
{
TIM3CH4_CAPTURE_STA|=0X80;
TIM3CH4_CAPTURE_VAL=0XFFFF;
}else TIM3CH4_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
if(TIM3CH4_CAPTURE_STA&0X40)
{
TIM3CH4_CAPTURE_STA|=0X80;
TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
}else
{
TIM3CH4_CAPTURE_STA=0;
TIM3CH4_CAPTURE_VAL=0;
TIM_SetCounter(TIM3,0);
TIM3CH4_CAPTURE_STA|=0X40;
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ
}
实际计算时发现两个上升沿的时间计数值:
在4M的采样频率时和我用定时器输出pwm的值差10,
在12M的时候差30,在1M的时候差3;这个误差是哪里的?是在因为在定时器中断中执行的上述语句的问题吗?
|
最佳答案
查看完整内容[请看2#楼]
终于找到问题在哪了,原子哥的程序中在初次捕获到上升沿时把定时器计数值清零了,这样损失了从进入中断到计数值清零的这段时间;我在测试程序中多设置了一个变量只用于记录初次捕获时的值,最后计算时减去这个值就刚刚好了;
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
if(TIM3CH4_CAPTURE_STA&0X4000)
{
TIM3CH4_CAPTURE_STA|=0X8000;
TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
...
|