前阵子接了个小项目,需要同时输出6路不同的PWM,频率、占空比还得各自独立可调。翻了一下板子上的定时器资源,标准定时器加高级定时器满打满算五个,直接开PWM模式只能输出四路,再怎么挤也腾不出第六路。后来翻手册的时候瞄到OCxM的Toggle模式,试了一圈发现问题全解了——不仅六路能出,各路频率和占空比还能单独调,CPU负载也比较低。这篇就把这段时间折腾翻转模式的经验整理出来,从原理、公式到实操和避坑,给正在纠结定时器不够用的朋友一个完整的参考。
1. 翻转模式到底是什么:一种被很多人忽略的PWM生成方式
先说结论:STM32定时器的翻转模式(Toggle Mode)不是用来替代PWM模式的,而是一种在定时器资源有限、需要多路可控PWM时的备用方案,也可以用来生成带相位偏移的信号。它的本质很简单:计数器值和比较寄存器(CCR)匹配时,输出引脚的电平自动翻转一次。
1.1 翻转模式的核心动作与电平变化
在标准PWM模式中,定时器根据计数周期和比较值,硬件自动决定引脚在高电平和低电平之间切换,输出的是连续PWM波形。而在翻转模式下,定时器只负责“电平翻转”这个动作:计数器从0递增到ARR,过程中每当计数器的值等于CCR,引脚输出状态就翻转一次。计数周期结束后,计数器回到0再开始下一轮。
举个例子,假设定时器时钟不分频,ARR设置为999,CCR设置为499。计数器从0计数到499时,引脚翻转一次;继续计数到999后溢出归零,又翻转一次(严格来说是更新事件时计数器溢出,翻转与更新事件的关系下文细说)。这样一个个上去