单片机选择的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;这个误差是哪里的?是在因为在定时器中断中执行的上述语句的问题吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
if(TIM3CH4_CAPTURE_STA&0X4000)
{
TIM3CH4_CAPTURE_STA|=0X8000;
TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
}else
{
TIM3CH4_CAPTURE_STA=0; //Çå¿Õ
TIM3CH4_CAPTURE_VAL=0;
//TIM_SetCounter(TIM3,0);
TIM3CH4_CAPTURE_First=TIM_GetCapture4(TIM3);
TIM3CH4_CAPTURE_STA|=0X4000;
}
}
如果大家觉得有问题欢迎指正
我个人是不喜欢外部中断的,您说的定时器肯定丢是什么原因?定时器中断执行语句需要时间吗
捕获上升沿
一周热门 更多>