2、PWM应用场景:从电机到音频,PWM到底能干什么
说实话,PWM这玩意儿看着简单——不就是高低电平来回切换嘛。但它的应用范围,比你想象的要广得多。我做了十几年嵌入式,几乎每个项目里都能看到PWM的影子。今天咱们就聊聊最常见的几个场景。
你想想看,一个方波信号,通过调节占空比和频率,就能控制电机转速、调节灯光亮度、驱动舵机角度、甚至生成音频信号。是不是挺神奇的?
核心思路:PWM的本质是用数字信号模拟模拟量。占空比决定“量”,频率决定“质”。不同场景对这两个参数的要求天差地别。
2.1 电机调速——最经典的应用
电机调速是PWM最老牌的应用场景。我记得刚入行时,第一个项目就是做直流电机驱动板。那时候还不太懂,直接用50Hz的PWM去驱动,结果电机嗡嗡响,转速还上不去。
后来才明白,电机调速的关键在于频率选择。频率太低,电机会抖动、发出噪音;频率太高,驱动管的开关损耗会急剧增加。
| 电机类型 | 推荐PWM频率 | 注意事项 |
|---|---|---|
| 直流有刷电机 | 1kHz ~ 20kHz | 低于20kHz可能听到啸叫 |
| 直流无刷电机(BLDC) | 10kHz ~ 50kHz | 需要配合换相逻辑 |
| 步进电机 | 20kHz ~ 100kHz | 微步驱动时频率更高 |
| 伺服电机 | 50Hz(标准) | 脉宽范围1ms~2ms |
我的经验:做直流电机驱动时,我习惯把PWM频率设在16kHz左右。为什么?因为人耳对16kHz以上的声音不太敏感,这样电机就不会发出烦人的啸叫声。当然,如果你的电机驱动管是MOSFET,频率可以再高一些。
电机调速的原理其实很简单:占空比越高,平均电压越高,转速就越快。但要注意,电机是感性负载,电流不会突变。所以PWM频率不能太低,否则电流纹波会很大,电机发热严重。
2.2 LED调光——看似简单,坑不少
LED调光,说白了就是控制LED的亮度。很多人觉得这太简单了——调占空比不就行了?嗯,理论上没错,但实际做起来,坑还挺多的。
我曾经做过一个LED台灯项目,用100Hz的PWM调光。结果客户反馈说灯光“闪烁”,眼睛不舒服。我一开始还不信,100Hz人眼应该看不出来啊。后来用示波器一测,才发现是PWM分辨率太低,亮度变化时出现了明显的阶梯感。
避坑指南:LED调光时,PWM频率至少要高于100Hz,建议200Hz以上。但频率也不能太高——超过1kHz后,LED的开关损耗会增加,调光线性度会变差。另外,分辨率至少8位(256级),否则调光时会出现肉眼可见的跳变。
还有一个容易被忽略的问题:人眼对亮度的感知是非线性的。也就是说,50%的占空比看起来并不是50%的亮度。所以做LED调光时,通常需要做gamma校正。
// 简单的gamma校正示例
// gamma值取2.2,适用于大多数LED
uint8_t gamma_correction(uint8_t brightness) {
float normalized = brightness / 255.0f;
float corrected = powf(normalized, 2.2f);
return (uint8_t)(corrected * 255.0f);
}
2.3 舵机控制——50Hz的“老规矩”
舵机控制是个很有意思的场景。标准舵机用的是50Hz的PWM,周期20ms。控制信号是脉宽调制——1ms脉宽对应0度,1.5ms对应90度,2ms对应180度。
你可能会问:为什么是50Hz?其实这是历史遗留问题。早期的舵机都是模拟舵机,内部电路响应速度有限,50Hz是权衡后的结果。现在虽然有了数字舵机,但50Hz这个标准一直沿用下来。
| 脉宽 | 对应角度 | 占空比(50Hz) |
|---|---|---|
| 1.0 ms | 0° | 5% |
| 1.5 ms | 90° | 7.5% |
| 2.0 ms | 180° | 10% |
我的习惯:控制舵机时,我一般用定时器直接输出PWM,而不是用软件模拟。软件模拟的抖动太大,舵机容易抖动。另外,不同品牌的舵机对脉宽的响应范围略有差异,选型时一定要看数据手册。
2.4 开关电源——PWM的“高频战场”
开关电源是PWM的另一个重要应用场景。这里的PWM频率通常很高——几十kHz到几MHz。为什么?因为频率越高,变压器和电感就可以做得越小,电源的体积和成本都能降下来。
但高频也带来了新问题:开关损耗、EMI、驱动能力。我记得有一次做DC-DC转换器,选了100kHz的开关频率,结果MOSFET发热严重。后来换成50kHz,效率反而更高了。
开关电源中的PWM控制方式主要有两种:
- 电压模式控制:直接调节占空比来稳定输出电压。简单,但响应慢。
- 电流模式控制:同时检测电流和电压,响应快,但电路复杂一些。
关键参数:开关电源对PWM的分辨率要求很高。比如一个12位分辨率的PWM,占空比调节步长是1/4096,这对于精密电源来说可能还不够。我见过一些高端电源,用的是16位甚至更高分辨率的PWM模块。
2.5 音频信号生成——PWM的“跨界玩法”
用PWM生成音频信号,这个玩法有点“剑走偏锋”。原理很简单:用高频PWM(通常几百kHz)通过低通滤波器,还原出模拟音频波形。
说白了,这就是Class-D放大器的基本原理。我做过一个小项目,用STM32的定时器输出PWM,接一个RC低通滤波器,就能播放8kHz采样率的语音。效果嘛,听个响还行,音质就别指望了。
音频PWM的几个关键点:
- PWM频率:至少是音频最高频率的10倍以上。比如要还原20kHz的音频,PWM频率至少要200kHz。
- 分辨率:16位是底线,否则量化噪声会很明显。
- 滤波器设计:截止频率要选好,既要滤掉PWM载波,又不能衰减音频信号。
// 用PWM生成1kHz正弦波的示例(伪代码)
// 假设PWM频率为200kHz,采样点数为200
for (int i = 0; i < 200; i++) {
float angle = 2 * PI * i / 200;
uint16_t duty = (uint16_t)(2048 + 2047 * sin(angle));
set_pwm_duty(duty);
delay_us(5); // 200kHz对应的周期
}
注意:用PWM生成音频时,MCU的负担很重。高频PWM加上高分辨率,对定时器的要求很高。我建议用专门的PWM控制器或者带硬件PWM的MCU,别用软件模拟,否则CPU占用率会飙到100%。
2.6 各场景参数对比一览
说了这么多,咱们用一张表总结一下。这张表是我自己整理选型时用的,希望能帮到你。
| 应用场景 | 典型频率范围 | 分辨率要求 | 关键考量 |
|---|---|---|---|
| 电机调速 | 1kHz ~ 50kHz | 8~12 bit | 频率避免人耳可闻区,电流纹波 |
| LED调光 | 200Hz ~ 1kHz | 8~16 bit | 无频闪,gamma校正 |
| 舵机控制 | 50Hz(标准) | 8~12 bit | 脉宽精度,抖动控制 |
| 开关电源 | 50kHz ~ 2MHz | 10~16 bit | 开关损耗,EMI,效率 |
| 音频生成 | 200kHz ~ 1MHz | 12~16 bit | 载波频率,滤波器设计 |