关于主从定时器单脉冲模式下产生的异常脉冲分析
(一)异常描述
在维护温控代码的时候,发现其控制MOS斩波用的是主从定时器触发模式的单脉冲模式,这种方法当时确实是吸引到我了(这种配置通常用于需要精准控制PWM输出的场合)。我又拿着示波器去测了一下PWM的输出情况。发现当业务逻辑不需要控制MOS时,每当接收到过零信号触发后,PWM仍然有接近0%的脉冲输出。
1.1异常复现
我重新拿了一块板卡,将其定时器的配置,以及相关逻辑进行了移植。同时我又使能了一路定时器输出PWM波用于模拟过零信号,该过零信号是用来周期性的触发从定时器的。经过测试验证,发现异常是可以复现的。
(二)异常分析
需要的知识储备:主从定时器(触发模式、复位模式)、单脉冲模式。
2.1 分析过程
① 该脉冲为周期性的,是在检测到零点信号的上升沿时触发的。查看代码定时器的配置为触发模式(触发通道TI1FP1)、上升沿触发,单脉冲模式、向下计数、CCR 初始值为0。在输入信号的上升沿时确实也触发了从定时器的单脉冲输出,这块逻辑应该是正确的。
② 改为向上计数会怎么样呢?随后我进行了测试。发现改为向上计数可以解决这个问题。
③ 因为从模式是触发模式嘛,那保持原代码不变,在触发后不需要输出的时候,将从模式改为复位模式理论上也是行的通的,于是我又进行了验证,在程序运行过程中切换到了复位模式,发现此方法也是可以的。
2.2 深入分析
① 为什么将向下计数改为向上计数可以解决?
参考手册中说“在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果 TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式 下不能产生0%的PWM波形。”
也就是说,向下计数,在PWM模式1,当TIMx_CNT≤TIMx_CCRx时参考信号OCxREF为高。代码是向下计数且CCR初始值为0,计数器从自动重转载值(ARR)开始递减至0时,也就是1与0之间的瞬间,触发了比较事件,导致有效电平持续了一个时钟周期。
(三)解决措施
方案A: 将向下计数改为向上计数。
方案B: 在恰当的时候将从定时器的触发模式改为复位模式,需要输出时再切换回触发模式。【推荐】
(四)小结
温控驱动的这份代码应该有五六年历史了,这个bug之所以没有被前辈们发现是因为这个接近0%的脉冲(大约1us的时间)实际上并未将晶闸管打开,没有产生异常输出,在实际需要控温的时候,PID经过计算又会对CCR值重新进行赋值。所以这个bug被雪藏了这么久,直到遇见了我,哈哈哈。
浙公网安备 33010602011771号