什么是PWM?
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)
- STM32:使用定时器(如TIM1、TIM2)配置PWM模式,通过改变
场景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%占空比
- ESP32:通过
场景3:音频信号输出
- 原理:高频PWM(如50kHz以上)经低通滤波后可生成模拟音频信号。
- 硬件平台示例:
- STM32:利用DAC外设结合PWM实现音频输出,或使用定时器的高速PWM通道(如TIM8)。
// 高频PWM配置示例(假设时钟源为24MHz) htim.Init.Prescaler = 0; // 无预分频 htim.Init.Period = 239; // 周期240个时钟周期 → 1MHz频率
- STM32:利用DAC外设结合PWM实现音频输出,或使用定时器的高速PWM通道(如TIM8)。
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 可在嵌入式控制系统中实现高效的模拟量输出控制。