关于STM32F4停止PWM输出后对应IO电平不定的问题
问题
最近在使用STM32F4作主控芯片控制焊接过程过程中发现,IGBT驱动电路本因在输出报警之后停止输出(比较值设定为零,定时器关闭),却偶尔出现报警之后持续输出的问题。后经检查发现,在报警之后定时器是可以关闭,但是复用的IO口电平却不可控,偶尔为无效电平(低电平),偶尔又持续输出有效电平(高电平)。
下图为通过示波器显示的报警之后IO电平状态。
解决
通过查询F4的数据手册可知,在定时器TIM捕获/比较模式寄存器1(TIMx_CCMR1)的4:6位 OC1M中可用于选择PWM的输出极性,(我这里用的是PWM的输出通道)详情如下图
为了解决PWM输出关断之后对应IO输出电平不定的问题,根据上面文档的说明,在PWM关断前将PWM强制设置为无效电平,再下次开启的时候,重新设置为PWM模式进行正常的驱动输出。
标准库中提供了函数TIM_ForcedOC1Config()用来控制输出的有效性,不过也仅限于设定为有效输出和无效输出两个模式。可通过直接调用这个函数设置PWM输出无效。
重设PWM模式则需要参考数据手册将(IMx_CCMR1)的4:6位 OC1M设置为110或者111,具体更加你你所配置的PWM模式设定。程序参考如下
/*--------------------lan: 定时器恢复pwm1模式--------------------*/
uint16_t tmpccmr1 = 0;
tmpccmr1 = TIM1->CCMR1;
/* Reset the OC1M Bits */
tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC1M;
/* Configure The Forced output Mode */
tmpccmr1 |= ((uint16_t)0x0060);
/* Write to TIMx CCMR1 register */
TIM1->CCMR1 = tmpccmr1;
/*-----------------------------end---------------------------*/
通过关断PWM前设置为PWM输出无效,之后重新配置PWM输出模式,可有效解决笔者的问题。