【STM32】使用定时器实时修改PWM脉宽频率的问题

在调试时,发现当实时修改频率脉宽的时候,经常会出现频率不输出的情况。

旧代码:
直接使用了初始化函数重新对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脉冲,频率和脉宽都正常。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值