PWM(脉宽调制)的详细解释与系统设计应用
1. 基本概念与信号形式
PWM(Pulse Width Modulation) 是一种通过数字信号控制模拟量输出的技术,其核心是周期性开关信号。通过调整信号的脉冲宽度(占空比)和频率,可以模拟出不同幅度的模拟电压或电流。
信号形式:PWM信号是方波,包含高电平(On-Time)和低电平(Off-Time)交替的周期性脉冲。
关键参数:
周期(Period):单个脉冲完整循环的时间(T = 1/frequency)。
频率(Frequency):单位时间内脉冲的重复次数(Hz)。
占空比(Duty Cycle):高电平持续时间占总周期的比例(例如50%占空比表示高电平和低电平各占周期的一半)。
脉冲宽度(Pulse Width):高电平持续时间(=占空比 × 周期)。
动态特性:
占空比决定平均电压值。例如,5V电源下,PWM信号的平均电压 = 占空比 × 5V。
波形描述:
占空比0%:信号始终为低电平,平均电压为0V。
占空比50%:高、低电平各占周期的一半,平均电压为2.5V。
占空比100%:信号始终为高电平,平均电压等于电源电压。
不同频率下表现:高频PWM(如20kHz)更适合模拟平滑信号(如LED调光),低频PWM(如1kHz)在电机控制中更易观察到脉冲变化。
2. PWM 如何控制模拟量输出?
PWM 通过数字开关(0或1)生成离散脉冲,配合低通滤波器(如RC电路)将脉冲转换为模拟电压。例如:
LED调光:占空比50%时,LED亮度约为最大值的一半。
电机速度控制:占空比越低,电机的平均驱动电压越小,转速越慢。
数学表达:
\[平均电压 \ V_{avg} = V_{CC} \times \frac{Duty}{100\%} ,其中 \ V_{CC} \ 是电源电压。
\]
3. 典型应用场景与硬件平台配置
场景1:电机速度控制(如直流电机、舵机)
原理:通过PWM信号的占空比调节电机的平均驱动电压,控制转速或角度。
硬件平台示例:
STM32:使用定时器(如TIM1、TIM2)配置PWM模式,通过改变CCR(捕获/比较寄存器)值调整占空比。// STM32代码示例(基于HAL库)
TIM_HandleTypeDef htim;
htim.Instance = TIM2;
htim.Init.Prescaler = 83; // 预分频器(假设时钟源为72MHz)
htim.Init.Period = 999; // 自动重载值(周期为 (Prescaler+1)*(Period+1)/时钟源 = 1ms,频率1kHz)
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
__HAL_TIM_SetCompare(&htim, TIM_CHANNEL_1, 500); // 50%占空比
Arduino:使用analogWrite()函数,直接指定占空比(0-255)。例如:analogWrite(3, 128); // 在引脚3输出50%占空比的PWM信号(频率默认为490Hz)
场景2:LED调光
原理:占空比控制亮度,需搭配滤波电容或电阻消除闪烁。
硬件平台示例:
ESP32:通过ledcSetup()和ledcAttachPin()配置PWM通道,支持高分辨率(如8-16位)和多通道同步。// ESP32代码示例(使用LED Control库)
ledcSetup(0, 5000, 8); // 通道0,5kHz频率,8位分辨率(0-255)
ledcAttachPin(2, 0); // 将GPIO2连接到通道0
ledcWrite(0, 128); // 50%占空比
场景3:音频信号输出
原理:高频PWM(如50kHz以上)经低通滤波后可生成模拟音频信号。
硬件平台示例:
STM32:利用DAC外设结合PWM实现音频输出,或使用定时器的高速PWM通道(如TIM8)。// 高频PWM配置示例(假设时钟源为24MHz)
htim.Init.Prescaler = 0; // 无预分频
htim.Init.Period = 239; // 周期240个时钟周期 → 1MHz频率
4. PWM 的核心配置步骤(以 STM32 为例)
选择定时器:根据引脚映射和功能需求选择(如通用定时器TIM2或高级定时器TIM1)。
设置时钟源与预分频器:
时钟源(如APB1或APB2)决定定时器的最大频率。
预分频器(Prescaler)将时钟源分频至合理范围。
配置自动重载寄存器(ARR):
决定周期值:Period = ARR + 1。
频率计算:
\[ \ f = \frac{f_{\text{时钟源}}}{(Prescaler+1) \times (ARR+1)} \
\]
设置比较寄存器(CCR):
占空比 = $\ \frac{CCR}{ARR+1} \times 100% \ $。
启用PWM输出模式:
配置PWM模式(如PWM模式1或PWM模式2),并启动定时器。
5. 不同硬件平台的 PWM 能力对比
平台
最大频率
分辨率(位)
通道数
典型应用
STM32F4系列
1MHz+
16位
每定时器3-4通道
高精度电机控制、伺服驱动
Arduino Uno
490Hz-~10kHz
8位(0-255)
6个PWM引脚
基础LED调光、小电机控制
ESP32
1MHz+
8-16位可配置
16个PWM通道
精密控制(如无人机舵机)
6. PWM 的局限性与设计注意事项
局限性:
滤波需求:模拟输出需外接低通滤波器,否则高频开关可能引入噪声。
频率选择:
高频(如20kHz)适合LED调光(人眼无法感知闪烁),但会增加电磁干扰(EMI);
低频(如1kHz)适合电机控制,但可能产生可听噪音或机械振动。
驱动能力:直接PWM输出通常需外接晶体管或MOSFET(如电机驱动),以放大电流和电压。
设计技巧:
死区时间(Dead Time):在电机控制中,为避免上下桥臂直通,需在PWM信号中插入死区时间(例如STM32的互补输出PWM模式)。
占空比与负载匹配:高占空比可能导致驱动电路过热,需结合散热设计。
7. 波形描述与动态特性
波形示例:
占空比 50%:High: ---- ---- ----
Low: ---- ---- ----
占空比 25%:High: -- -- --
Low: ------ ------ ------
动态特性:
低占空比(如20%):设备(如电机)平均功率低,转速慢或亮度暗。
高占空比(如80%):设备平均功率高,转速快或亮度亮。
高频PWM(如20kHz):减少可见闪烁或音频噪声,提升控制精度。
8. 实际应用案例
案例1:Arduino控制LED亮度:
硬件:Arduino Uno + 220Ω电阻 + LED。
代码:analogWrite(9, 128) → 50%亮度。
观察:占空比从0%到100%时,LED亮度线性变化。
案例2:STM32控制直流电机:
硬件:STM32F4 + L298N电机驱动模块。
配置:定时器TIM3输出PWM信号至L298N的IN1/IN2引脚,通过调整CCR实现速度调节。
优势:支持可变频率(如1-20kHz),避免电机共振。
案例3:ESP32生成音频信号:
硬件:ESP32 + 低通滤波器(如RC电路)+ 扬声器。
配置:使用RMT模块生成高频PWM(如50kHz),经滤波后输出音频。
注意:需确保PWM频率高于音频最高频率的两倍(奈奎斯特采样定理)。
9. 总结
PWM 是嵌入式系统中数字控制模拟设备的核心技术,其优势包括:
高效节能:通过开关信号直接驱动负载,减少线性放大器的功率损耗。
灵活性:占空比可编程调整,适用于多种控制场景(如速度、亮度、音频)。
低成本:无需复杂模拟电路,仅需数字定时器和简单滤波。
局限性:
需外接滤波或驱动电路以适配负载;
高频可能增加EMI,影响系统稳定性。
通过合理选择硬件平台(如STM32的高精度定时器、ESP32的多通道PWM),并优化频率和占空比参数,PWM 可在嵌入式控制系统中实现高效的模拟量输出控制。