2、PWM应用场景:从电机到音频,PWM到底能干什么

说实话,PWM这玩意儿看着简单——不就是高低电平来回切换嘛。但它的应用范围,比你想象的要广得多。我做了十几年嵌入式,几乎每个项目里都能看到PWM的影子。今天咱们就聊聊最常见的几个场景。

你想想看,一个方波信号,通过调节占空比和频率,就能控制电机转速、调节灯光亮度、驱动舵机角度、甚至生成音频信号。是不是挺神奇的?

核心思路:PWM的本质是用数字信号模拟模拟量。占空比决定“量”,频率决定“质”。不同场景对这两个参数的要求天差地别。

PWM应用场景知识图谱 PWM核心参数 频率(Hz) 占空比(%) 分辨率(bit) 电机调速 LED调光 舵机控制 开关电源 音频生成 不同场景对频率、占空比精度、分辨率的要求差异巨大 选型时必须先明确应用场景,再反推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 载波频率,滤波器设计