简介
在使用STM32的PWM做为调制信号时,遇到开关调制信号关闭后其信号不确定的问题,影响信号的调制,收集了些资料在这归纳整理。
方法
当IO设置成PWM模式以后GPIO_ResetBits等设置语句就不管用了,如果不考虑时间点,调用TIM_CtrlPWMOutputs(TIMx,DISABLE);或TIM_Cmd(TIMx,DISABLE);定会产生关闭PWM后端口的电平不确定的情况。有2种办法可以解决:
1、如果使用TIM_CtrlPWMOutputs(TIMx,DISABLE);或TIM_Cmd(TIMx,DISABLE);应该在需要关闭时,先开放更新中断,然后在更新中断中调用其中一个函数,这样才能保证关闭的动作与PWM输出周期同步;
2、如果不使用中断,可以在关闭PWM输出后,把对应的引脚配置为推挽输出或开路输出,然后再使用GPIO_ResetBits语句。
代码片
//初始化配置
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //当定时器计数值小于CCR1_Val时为高电平 (对应关闭PWM后端口的电平值)
//PWM1 Mode configuration: Channel2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//跳变值
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
//在禁止定时器前,用软件强制定时器更新,可初始化电平
TIM_GenerateEvent(TIMx,TIM_EventSource_Update);
TIM_Cmd(TIMx,DISABLE);
- 1
- 2
- 3
实测OK。