在调试时,发现当实时修改频率脉宽的时候,经常会出现频率不输出的情况。
旧代码:
直接使用了初始化函数重新对TIMER进行了初始化
#define Pulse_Prescale ((60000/Parameter.Pulse_Freq)-1)
#define Pulse_Duty ((Parameter.Pulse_Freq*Parameter.Pulse_Width)*12/100)
//初始化:
TIM1_PWM_Init(1200-1,Pulse_Prescale);
TIM_SetCompare1(TIM1,Pulse_Duty);
//重新设置
if(重新设置)
{
TIM1_PWM_Init(1200-1,Pulse_Prescale);
TIM_SetCompare1(TIM1,Pulse_Duty);
}
故障现象:
在重新设置频率和脉宽之后,偶尔能够修改成功,大部分时候会变成恒高或者恒低输出。
分析可能原因:
在设置过程中,可能计数器的值已经超过了后面设置的比较值,且预分频很慢的情况下,会导致一直在累加。
由于本程序不需要快速设置,并且设置的频率都在1秒内,所以修正了重新设置的程序,不再采用初始化的代码,而是直接更新prescale和duty的值。
if(重新设置)
{
TIM_Cmd(TIM1,DISABLE);
delay_ms(1500); //延时等待上一次输出完毕
TIM_PrescalerConfig(TIM1,Pulse_Prescale,TIM_PSCReloadMode_Immediate);
TIM_SetCompare1(TIM1,Pulse_Duty);
TIM_Cmd(TIM1,ENABLE);
}
修改后,能够正确输出新设置的PWM脉冲,频率和脉宽都正常。