STM32 PWM 输出:占空比、频率与死区时间的工程配置
在 STM32 上做电机调速、舵机控制或者 LED 调光,绕不开 PWM。PWM 看起来只是“定时器输出方波”,但工程上真正容易踩坑的从来不是“能不能输出”,而是频率算错、占空比跳变、互补输出没有死区导致上下管直通。这篇文章把这三个量一次讲清楚。
一、三个基本量:频率、占空比、极性
PWM 输出由定时器产生,三个寄存器决定一切:PSC(预分频)、ARR(自动重装载)、CCR(比较值)。
输出频率 = 定时器时钟 / ((PSC + 1) × (ARR + 1))。比如定时器时钟 72MHz,想得到 20kHz 的 PWM(高于人耳听觉,电机驱动常用),可以取 PSC = 71、ARR = 49:72MHz / (72 × 50) = 20kHz。
占空比 = CCR / (ARR + 1)。CCR 写 25,ARR 是 49,占空比就是 50%。注意分母是 ARR + 1,不是 ARR,差这 1 在小 ARR 时误差很明显。
极性决定有效电平是高还是低。OCxM 选 PWM 模式 1 时,CNT 小于 CCR 输出有效电平;模式 2 则相反。驱动共阳 LED 和驱动 N 沟道 MOS 管,极性要求正好相反,选错模式会出现“占空比越大灯越暗”这种反直觉现象,先确认硬件再选模式。
二、频率与分辨率的取舍
ARR 越大,占空比的调节步进越细,但频率越低;频率越高,ARR 越小,分辨率越差。20kHz 下 ARR = 49,占空比只能以 2% 为步进调节;如果应用要求 0.1% 的精细调节,就得降低频率或者提高定时器时钟。工程上先定频率下限(比如避开音频、满足电机电感续流),再看 ARR 够不够分分辨率,不够就换更高主频的定时器(高级定时器 TIM1/TIM8 挂在 APB2 上,时钟往往是 APB1 定时器的两倍)。
三、死区时间:互补输出的保命配置
用高级定时器做半桥、全桥驱动时,同一桥臂的上下管必须互补导通,中间留一段“两个都关断”的死区时间,否则上下管同时导通就是电源短路。死区由 BDTR 寄存器的 DTG 位段配置,单位不是纳秒而是定时器时钟周期,具体换算要查手册的死区时间表——DTG 不同取值区间的步进是不一样的,直接按“写多少就是多少纳秒”去算一定会错。
死区设太小等于没设,设太大则输出波形失真、有效占空比被吃掉一部分。经验值是按开关管的开通/关断时间(td(on)、td(off))留 1.5~2 倍余量,板子回来后用示波器实测上下管栅极波形确认没有交叠,再定最终值。
四、四个常见坑
第一,改 ARR 忘同步改 CCR。运行时想改频率直接写 ARR,CCR 还是旧值,占空比会跟着变。正确做法是按比例同步更新 CCR,或者先关输出、改完再开。
第二,CCR 写得比 ARR 大。CCR 超过 ARR 后输出恒为有效电平,PWM 退化成直流电平,电机全速、灯全亮,还以为是驱动写错了。写 CCR 前先钳位到 ARR。
第三,重映射后引脚没输出。TIM3_CH1 默认在 PA6,重映射到 PB4 后如果只改了 AF 配置、没开 GPIOB 时钟和复用功能,引脚就是死的。用示波器量不到波形时,先查 RCC 时钟开了没有,再查引脚复用对不对。
第四,PWM 模式下用 update 事件触发 DMA 搬运 CCR。想做呼吸灯、波形渐变时,把 DMA 目标设为 CCR 寄存器、触发源选定时器更新事件,可以不占用 CPU 实现占空比连续变化;但要注意 DMA 传输完成后的循环模式配置,否则只渐变一次就停住。
五、上板前的检查清单
频率是否符合要求(示波器实测,不是算出来就行);占空比 0% 和 100% 两个端点是否正常;互补输出死区是否实测无交叠;极性与硬件驱动是否一致;ARR/CCR 更新是否同步。五项都过,PWM 这一块才算真正调通。
- 点赞
- 收藏
- 关注作者
评论(0)