在项目中使用了PWM来驱动喇叭来报警,但关闭警报后有概率性IO会在高电平状态,致命烧坏电感或发烫,反复出现,并经过多次查找,最终发现单独关闭定时器enable并不代表PWM就关闭了,还需要配套关闭PWM的enable。具体过程记录下来,给大家在做MCU开发的朋友们做个借签。
先说一下硬件和代码的设计。
原理图如下:
使用PWM0驱动Q1, L1, 及蜂鸣器J2。
代码如下:
分析,每次喇叭响完后,代码都是通过T0EN=0把定时器关闭,反复测试发现有一定概率IO是停在高电平状态,示波器抓了图如下,
后续加了P16D=0把IO强制拉低, 客户又反复几次退回,问题依然存在,此时有些迷茫,再经过FAE的帮助,并查看了规格书如下,PWM也对应有个PWMxEC的开关,可以控制PWM的工作与否,如下:
与是,在代码上加入PWM0EC=0后,问题真正的才算解决了,如下:
总结,Timer与PWM是串行关系,Timer关闭只能关闭计算的变化,PWM单元关闭才能确保最终IO输出电平的确定性。 特此分享给朋友们在用到PWM功能时,留意些细节,防止走弯路,希望能帮到部分同行。