一、PWM基础概念:什么是PWM、占空比与频率、PWM在电机控制中的作用
各位同学,咱们今天聊点实在的。PWM这东西,说白了就是“开关的艺术”。你想想看,一个开关要么开要么关,但如果你开关的速度足够快,就能让负载“以为”自己得到了一个中间电压。这就是PWM最核心的思想。
我记得刚入行那会儿,带我的老工程师跟我说:“小子,你要是搞懂了PWM,电机控制你就入门了一半。”当时我还不太信,后来做了几个项目才明白——这话一点不夸张。
1.1 什么是PWM?
PWM,全称Pulse Width Modulation,脉冲宽度调制。名字挺长,但本质很简单:用数字信号模拟模拟量。
举个例子。你有一个12V的电源,想给电机5V的电压。直接降压?可以,但效率低、发热大。用PWM呢?你把12V的电源以极快的速度开关,让“开”的时间占40%,“关”的时间占60%。平均下来,负载感受到的就是12V × 40% = 4.8V。接近5V,而且效率极高。
核心要点:PWM不是真的改变了电压幅值,而是通过时间上的“通断比例”来等效出一个平均电压。
我在做第一个直流电机驱动板时,就犯过一个低级错误——以为PWM频率越高越好,结果把MOS管烧了。嗯,这里要注意,频率不是越高越好,后面我会细说。
1.2 占空比与频率
这两个参数是PWM的灵魂。咱们一个一个说。
占空比(Duty Cycle)
占空比,就是高电平时间占整个周期的百分比。公式很简单:
占空比 = T_on / (T_on + T_off) × 100%
比如一个周期是1ms,高电平0.4ms,低电平0.6ms,占空比就是40%。
占空比决定了等效电压的大小:
- 0% → 一直关,输出电压0V
- 100% → 一直开,输出电压等于电源电压
- 50% → 一半时间开,一半时间关,等效电压 = 电源电压 × 50%
我的习惯:在调试阶段,我一般先用50%占空比做测试。这个点最安全,也最容易观察波形是否正常。等确认硬件没问题了,再往两端调。
频率(Frequency)
频率 = 1 / 周期。单位是Hz。
频率的选择直接影响电机运行的品质。选低了,电机会抖动、有噪音;选高了,开关损耗大、驱动芯片发热。
我曾经在一个无刷电机项目里,把PWM频率设成了2kHz。结果电机低速运行时嗡嗡响,像蚊子叫。后来改成16kHz,问题就解决了。为什么?因为16kHz已经超出了人耳的敏感范围,听不到了。
| 频率范围 | 典型应用 | 优缺点 |
|---|---|---|
| 1kHz ~ 5kHz | 大功率直流电机 | 开关损耗低,但可能有 audible noise |
| 10kHz ~ 20kHz | 通用电机控制 | 人耳听不到,平衡了损耗和性能 |
| 20kHz ~ 100kHz | 精密伺服、BLDC | 响应快,但MOS管发热明显 |
| > 100kHz | 数字电源、高频变换器 | 需要专门的栅极驱动和低寄生参数设计 |
避坑指南:我曾经在一个项目里,为了追求“静音”,直接把频率设到了40kHz。结果MOS管温度飙到85°C,差点炸管。后来查资料才发现,我那款MOS管的开关损耗在40kHz时已经超过了导通损耗。所以频率不是越高越好,要看器件的datasheet。
1.3 PWM在电机控制中的作用
PWM在电机控制里,可以说是“万能工具”。我总结了三个核心作用:
- 调速:改变占空比 → 改变平均电压 → 改变电机转速。这是最基础的应用。
- 调力矩:对于电流环控制,PWM占空比直接影响绕组电流,进而控制输出力矩。
- 能量管理:通过PWM控制开关管的通断,实现能量的高效传输,减少热损耗。
你想想看,如果没有PWM,我们只能用线性稳压器或者电阻分压来调速。那效率低得可怜,大部分能量都变成热量散掉了。PWM的效率可以做到90%以上,这就是它被广泛使用的原因。
下面这张图,是我自己画的一个PWM在电机控制系统中的位置示意:
从这张图你能看到,PWM是整个控制链条里的“翻译官”——把控制器的数字指令,翻译成功率级的开关动作。没有它,MCU再聪明也驱动不了电机。
1.4 一个简单的例子:直流电机开环调速
咱们写个最简单的代码,看看PWM怎么控制电机转速。假设你用STM32的定时器输出PWM:
// 伪代码:直流电机PWM调速
void motor_set_speed(uint8_t duty_percent) {
// 限制占空比范围 0~100
if(duty_percent > 100) duty_percent = 100;
// 计算比较值(假设ARR=999,即10位分辨率)
uint16_t ccr = (uint16_t)(duty_percent * 10.0f);
// 写入比较寄存器
TIM1->CCR1 = ccr;
}
int main() {
// 初始化定时器:频率20kHz,ARR=999
timer_pwm_init(20000, 999);
// 让电机以50%占空比运行
motor_set_speed(50);
while(1) {
// 主循环做其他事情
}
}
这段代码很简单,但背后涉及的东西不少。比如为什么ARR设成999?因为20kHz的频率下,周期是50μs,如果定时器时钟是20MHz,那么计数值就是20MHz × 50μs = 1000,ARR = 1000 - 1 = 999。这些计算在后面章节会反复用到。
我的建议:刚开始学PWM时,别急着调参数。先用示波器看波形,确认频率和占空比都对了,再连电机。我见过太多人上来就接电机,结果波形不对,电机乱转,还以为是代码写错了。
1.5 本章小结
咱们这一章聊了三个核心概念:
- PWM的本质:用数字开关模拟模拟量,核心是“时间比例”
- 占空比和频率:占空比决定等效电压,频率决定运行品质
- PWM在电机控制中的作用:调速、调力矩、能量管理,是控制链条的核心环节
这些东西看起来基础,但我在实际项目中见过太多因为PWM参数没选好导致的问题。比如电机抖动、噪音大、MOS管过热、甚至炸板。所以别小看这些基础概念,后面每一章都会用到它们。