HOME> 2010世界杯> Christopher's Blog

Christopher's Blog

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 可在嵌入式控制系统中实现高效的模拟量输出控制。