PWM波形生成
PWM(脉冲宽度调制)是一种通过调节脉冲的占空比来控制模拟信号的技术,广泛应用于电机调速、LED调光、电源控制等领域。
1. PWM核心参数
- 频率(Frequency):
每秒内脉冲重复的次数,单位Hz。- 电机控制:1kHz~20kHz(避免可闻噪声)。
- LED调光:100Hz~1kHz(高于人眼闪烁感知频率)。
- 音频生成:20Hz~20kHz(需匹配音频范围)。
- 占空比(Duty Cycle):
高电平时间占整个周期的百分比,范围0%~100%。- 占空比 = (高电平时间 / 周期时间) × 100%
- 分辨率(Resolution):
占空比可调节的最小步长,由计数器位数决定。- 8位分辨率:256级(步长0.39%)。
- 16位分辨率:65536级(步长0.0015%)。
2. PWM生成原理
(1) 硬件PWM(基于定时器)
- 核心组件:
- 计数器:递增或递减计数,产生周期性基准。
- 比较寄存器(CCR):设置占空比阈值。
- 自动重载寄存器(ARR):设置周期长度。
- 工作流程:
- 计数器从0开始递增,达到CCR值时输出电平翻转。
- 计数器达到ARR值时复位,并触发更新事件,开始新周期。
- 频率计算:
频率定时器时钟源频率预分频系数值
- 占空比计算:
占空比值值
配置示例(STM32定时器):
1
2
3
4
5
6
7
8
9
10
11
12
13
14TIM_HandleTypeDef htim;
htim.Instance = TIM1;
htim.Init.Prescaler = 79; // 预分频系数80(80MHz/80=1MHz)
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 999; // ARR=999 → 频率=1MHz/(999+1)=1kHz
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // CCR=500 → 占空比50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
(2) 软件PWM(GPIO模拟)
实现方式:
使用定时器中断或延时函数,手动控制GPIO电平翻转。代码示例(Arduino):
1
2
3
4
5
6
7
8
9
10void setup() {
pinMode(9, OUTPUT);
}
void loop() {
digitalWrite(9, HIGH);
delayMicroseconds(200); // 高电平时间200μs
digitalWrite(9, LOW);
delayMicroseconds(800); // 低电平时间800μs → 周期1ms,占空比20%
}局限性:
- 精度低(受中断延迟和代码执行时间影响)。
- 占用CPU资源,难以生成高频PWM(通常<10kHz)。
3. PWM模式类型
模式 | 描述 | 应用场景 |
---|---|---|
边沿对齐 | 计数器单向递增或递减,脉冲边沿对齐周期边界 | 通用控制(如LED调光) |
中心对齐 | 计数器先递增后递减,脉冲中心对齐周期边界 | 电机驱动(减少谐波噪声) |
互补输出 | 主通道与互补通道输出反相PWM,插入死区时间防止短路 | H桥电机驱动 |
多通道同步 | 多个PWM通道共享ARR,相位可调 | RGB LED颜色混合 |
4. 关键电路设计
(1) 驱动能力增强
- MOSFET/晶体管驱动:
PWM信号通过MOSFET(如IRF540N)或驱动芯片(如L298N)放大电流,驱动电机或大功率负载。 - RC滤波转换模拟信号:
对PWM输出进行低通滤波,得到平滑的模拟电压:
占空比
- 滤波器截止频率:,需远低于PWM频率。
(2) 死区时间(Dead Time)
作用:防止H桥上下管同时导通造成短路。
实现:在互补PWM的上升沿和下降沿之间插入延迟(通常50ns~1μs)。
STM32配置示例:
1
2
3TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
sBreakDeadTimeConfig.DeadTime = 0x80; // 死区时间=0x80*T_dts
HAL_TIMEx_ConfigBreakDeadTime(&htim, &sBreakDeadTimeConfig);
5. 高级应用技巧
(1) 提高分辨率
- 时钟预分频优化:
降低定时器时钟频率(增大预分频系数),以增加ARR值,但会降低PWM频率。 - 微步进PWM:
结合多个PWM相位差,合成更高分辨率信号(如两路90°相位差PWM叠加)。
(2) 动态调整PWM
呼吸灯效果:
线性或非线性改变CCR值,实现亮度渐变。
1
2
3
4for (int i=0; i<1000; i++) {
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, i);
HAL_Delay(1);
}
(3) 多设备同步
- 使用主从定时器模式,确保多个PWM信号相位一致。
6. 常见问题与解决
Q1:PWM输出有毛刺?
- 原因:GPIO切换速度过快或负载电感产生尖峰。
- 解决:增加RC滤波、使用肖特基二极管续流。
Q2:如何测量PWM参数?
- 使用示波器直接观测波形,或通过输入捕获模式测量频率/占空比。
Q3:高精度PWM如何实现?
- 选择高位定时器(如32位ARR)、降低时钟分频,或使用专用PWM芯片(如LT6992)。
通过合理配置定时器和外围电路,PWM可实现从简单控制到高精度驱动的广泛应用。硬件PWM效率高且稳定,而软件PWM适用于资源受限的场景。