1. PWM 基础概念

1.1 什么是 PWM

PWM,全称 Pulse Width Modulation,中文叫脉冲宽度调制。说白了,就是用一串方波信号,通过改变高电平的宽度,来模拟一个连续变化的电压。

我刚开始接触电机控制时,总觉得这玩意儿有点绕。明明要的是 3.3V,为什么给一串 5V 的脉冲就能搞定?后来在实验室调一个直流有刷电机才真正明白——电机的响应速度没那么快,它看的是脉冲的「平均效果」。

你想想看,一个灯泡接 5V 电源,全亮。如果我用开关以极快的速度一开一关,开的时间占一半,关的时间占一半,灯泡看起来就是半亮。PWM 的原理,本质上就是这个开关动作的电子版。

核心理解:PWM 不是真的改变了电压幅值,而是通过调整高电平的持续时间,让负载感受到一个等效的平均电压。

1.2 PWM 的波形参数

一个标准的 PWM 波形,有三个关键参数。我在项目中吃过不少亏,都是因为对这三个参数理解不到位。咱们一个一个说。

频率(Frequency)

频率就是 PWM 信号每秒钟重复的次数,单位是 Hz。比如 10kHz 的 PWM,意味着每秒钟有 10000 个脉冲周期。

频率的选择很讲究。选低了,电机会发出刺耳的啸叫声——我最早做的一个风扇驱动项目,用了 200Hz 的 PWM,结果整个实验室的人都在找哪里来的蚊子声。后来才知道,人耳对 20Hz-20kHz 的声音敏感,PWM 频率最好避开这个范围,或者直接选 20kHz 以上。

但频率也不是越高越好。频率高了,开关损耗会增大,MOSFET 发热严重。我记得有一次调试一个 48V 的电机驱动器,把 PWM 频率从 10kHz 提到 40kHz,结果散热片烫得能煎鸡蛋。

频率范围 典型应用 注意事项
100Hz - 1kHz 大功率电机、加热控制 可能产生 audible noise
1kHz - 20kHz 通用直流电机、步进电机 人耳敏感区间需注意
20kHz - 100kHz 无刷直流电机、伺服电机 开关损耗显著增加

占空比(Duty Cycle)

占空比就是高电平时间占整个周期的比例,用百分比表示。50% 的占空比,意味着高电平和低电平各占一半时间。

占空比直接决定了电机的转速或力矩。我习惯用一个简单的公式来估算等效电压:

V_avg = V_supply × DutyCycle

举例:电源电压 12V,占空比 75%
V_avg = 12V × 0.75 = 9V

嗯,这里要注意——这个公式是理想情况。实际电路中,MOSFET 的导通压降、死区时间、线路阻抗都会让实际电压偏低。我曾经在一个精密位置控制项目里,因为没考虑 MOSFET 的压降,导致电机在低占空比下根本转不动,排查了两天才找到原因。

分辨率(Resolution)

分辨率决定了你能把占空比调到多精细。比如 8 位分辨率,意味着占空比可以分成 256 级;10 位就是 1024 级。

分辨率越高,电机控制越平滑。但高分辨率也有代价——需要更高的定时器时钟频率,或者更复杂的 PWM 生成逻辑。

我的经验:对于大多数直流电机控制,8 位分辨率(256 级)已经够用。如果是伺服电机或需要精细位置控制的场景,建议用 12 位以上。我做过一个机械臂项目,用了 16 位分辨率,结果发现电机本身的机械抖动比 PWM 的量化误差还大——有时候过高的分辨率只是心理安慰。

1.3 PWM 在电机控制中的作用

PWM 在电机控制里,主要干三件事。我画了一张图,帮你理清它们之间的关系。

PWM 在电机控制中的三大作用 PWM 信号 速度控制 调节占空比 → 改变平均电压 力矩控制 电流限幅 → 限制输出力矩 方向控制 H桥互补PWM → 正反转 开环/闭环调速 电流环 PI 调节 死区时间插入 💡 实际项目中,这三个作用往往同时存在 比如 FOC 控制中,PWM 同时承担了电压调节和换相逻辑 理解这三者的关系,是学好电机控制的第一步

速度控制

这是 PWM 最直接的应用。改变占空比,就是改变电机两端的平均电压,电机的转速随之变化。我在做电动工具项目时,就是用 PWM 加一个简单的 PID 闭环,把无刷电机的转速精度控制在 ±1% 以内。

力矩控制

很多人以为 PWM 只能控速度,其实它也能控力矩。通过限制 PWM 的占空比上限,或者配合电流采样做限流,就能控制电机的输出力矩。

我曾经犯过一个错误——在一个自动门项目中,只做了速度控制,没做力矩限制。结果门碰到障碍物时,电机还在拼命转,直接把齿轮箱打坏了。后来加了电流检测,一旦电流超过阈值就降低占空比,问题才解决。

方向控制

单靠一路 PWM 没法让电机反转。你需要 H 桥电路,配合两路互补的 PWM 信号来实现正反转。这个在后面的章节会详细讲,这里先记住一个概念:

重要提醒:H 桥的上下管绝对不能同时导通!否则就是短路,MOSFET 瞬间烧毁。我亲眼见过一个实习生调试时忘了加死区时间,上电 0.5 秒后管子直接冒烟。从那以后,我写 PWM 初始化代码时,第一件事就是检查死区配置。

1.4 一个简单的 PWM 生成示例

说了这么多理论,咱们看一段实际的代码。这是用 STM32 的定时器生成 PWM 的配置,我习惯用寄存器操作,因为更直观:

// 以 STM32F103 TIM2 为例,输出 20kHz PWM
// 系统时钟 72MHz,预分频 72-1,自动重载 50-1

TIM2->PSC = 72 - 1;          // 预分频:72MHz / 72 = 1MHz
TIM2->ARR = 50 - 1;          // 自动重载:1MHz / 50 = 20kHz
TIM2->CCR1 = 25;             // 占空比:25/50 = 50%

TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;  // PWM 模式 1
TIM2->CCER |= TIM_CCER_CC1E;                          // 使能输出
TIM2->CR1 |= TIM_CR1_CEN;                             // 启动定时器

这段代码配置了一个 20kHz、50% 占空比的 PWM 信号。如果你想调转速,只需要改 CCR1 的值就行。比如 CCR1 = 10,占空比就是 20%,电机转速会明显下降。

一个小技巧:调试 PWM 时,我习惯先用示波器看波形,确认频率和占空比正确,再接电机。千万别凭感觉直接上电——我曾经因为定时器时钟配置错了,实际频率只有预期的十分之一,电机抖得像筛子一样。

1.5 本章小结

PWM 的本质就是用数字信号模拟模拟量。三个参数——频率、占空比、分辨率——决定了 PWM 的质量。在电机控制中,PWM 负责速度、力矩和方向三个维度的调节。

记住一句话:PWM 不是目的,而是手段。我们真正关心的是电机转得稳不稳、力矩够不够、响应快不快。PWM 只是实现这些目标的一个工具。