PWM,全称是脉宽调制。顾名思义,它的核心思想就是用数字信号来模拟出模拟信号的效果。虽然输出端看上去是一个高低电平的方波信号,但通过控制方波的占空比,我们就能得到一个可等效为某个电压或功率的“平均值”。
简单来说,PWM 就是让单片机用逻辑电平去假装自己会输出模拟电压的一种手段。
模拟与数字的碰撞
先说说模拟信号和数字信号的区别。
模拟信号就像水龙头的水流,可以连续变化,理论上可以取任意值,比如9V电池的电压,实际可能略低于或高于9V,而且会随时间或环境变化。
模拟电路的输出通常与输入成线性关系,比如老式收音机的音量旋钮,扭一下电阻变,电流跟着变,音量就大了或小了。

听起来简单直观,但模拟电路有个让人头疼的问题:不稳定。温度变化、元件老化都会让电路漂移,想保持精准往往得用复杂昂贵的方案,体积大、功耗高,还容易受噪声干扰。
相比之下,数字信号就简单粗暴多了,只有0和1两种状态,比如0V和5V。数字电路抗噪能力强,信号要么是开,要么是关,噪声得大到离谱才能把1变成0。PWM的巧妙之处就在于,它用数字信号的开关动作,模拟出类似模拟信号的效果,兼顾了数字电路的稳定性和模拟电路的灵活性。
PWM的本质:占空比与平均值
PWM的核心思想是用一串方波的开和关,来控制输出的平均值。
想象一下,你用一个开关控制一盏9V的灯泡。如果开关每秒钟打开50毫秒,关闭50毫秒,循环10次(频率10Hz),灯泡感受到的平均电压就是4.5V,看起来就像接了个4.5V的电池。这种开关的占空比(duty cycle)就是50%,也就是开关打开时间占整个周期的比例。调整占空比,比如10%或90%,就能得到0.9V或8.1V的平均电压,模拟出不同的输出效果。

这就像你在烧开水时,控制火的大小。你不可能精确地调火苗到1/3或2/3,但可以通过快速开关火源,控制加热时间来达到类似效果。PWM的原理就是这么简单,但要让它好用,还得注意频率选择。比如灯泡的例子,如果频率太低,比如5秒开5秒关,灯会一闪一闪,看着难受。只有把频率提高到比如1kHz甚至更高,灯才会看起来稳定地变暗或变亮,因为人眼或负载的响应速度跟不上这么快的开关变化。
嵌入式中的PWM
现在很多单片机,比如STM32、GD32,都有内置的PWM模块,硬件支持让开发变得轻松不少。配置PWM通常就几步:设置定时器的周期(决定频率),调整占空比(控制输出强度),选好输出引脚,启动定时器,启用PWM功能。听起来简单,但实际开发中还是有些需要注意。

比如频率选择。太低的话,负载可能会有明显的闪烁或抖动,比如电机驱动可能会发出嗡嗡声;太高的话,开关损耗会增加,影响效率。一般来说,1kHz到200kHz是常见范围,具体得看应用场景。像LED调光,几十kHz就够了,但音频应用可能需要更高的频率来避免噪声。
再比如占空比的分辨率。假设你的定时器是16位的,最大计数值是65536,理论上可以把占空比调得非常精细。但实际中,受限于时钟频率和目标输出频率,分辨率可能没那么高。举个例子,如果主频是72MHz,想输出1kHz的PWM,定时器周期就是72000个时钟tick,分辨率还算可以。但如果频率提到100kHz,周期就只有720个tick,调占空比的步进就粗糙了,控制精度会下降。这时候得权衡频率和精度的关系。
PWM的优势与局限
PWM不仅能做功率控制,在通信场景中也有独特优势。 由于PWM信号始终保持数字特性,抗干扰能力非常强。普通的模拟信号可能轻微噪声就导致失真,而PWM信号只有当干扰强到足以改变电平状态时才会出错。

这也是为什么有些通信系统会用PWM来传输信息。接收端只需通过一个RC或LC滤波网络,就能把PWM信号还原成模拟波形。