3. PWM调速原理
在机器人电机控制中,直流有刷电机是最常见的执行元件之一。要让电机以期望的速度旋转,最直接的方法是调整其电枢两端的平均电压。然而,直接使用可变电阻或线性稳压器来调压,不仅效率低下,还会产生大量热量。PWM(脉冲宽度调制)技术通过高速开关电源电压,以数字方式实现高效的模拟电压控制,是电机调速的核心手段。本章将深入剖析PWM信号的生成机制、占空比与平均电压的数学关系,并详细讲解如何基于STM32定时器配置PWM输出,为后续的PID闭环调速打下坚实的硬件基础。
3.1 PWM信号生成机制与核心参数
PWM信号本质上是一种周期固定、高电平宽度可调的方波。STM32微控制器内部通过定时器(Timer)的数字计数器来精确产生这种波形。定时器内部有一个自由运行的计数器(CNT),它按照预分频后的时钟频率不断递增。当计数器值达到预设的自动重装载值(ARR)时,计数器清零并重新开始计数,从而形成一个固定的PWM周期。与此同时,定时器还有一个比较寄存器(CCR),当计数器的值小于CCR时,输出引脚保持高电平;当计数器的值大于或等于CCR时,输出引脚翻转为低电平。通过改变CCR的值,即可调整高电平持续的时间,也就是改变占空比。
PWM频率 = 定时器时钟频率 / ((PSC+1) × (ARR+1))
占空比 = CCR / (ARR+1) × 100%
分辨率 = 1 / (ARR+1) × 100%
例如,STM32F103系列微控制器的主频为72MHz。若设置预分频器PSC为71,则定时器计数频率为1MHz(即每微秒计数一次)。若设置ARR为999,则PWM周期为1000微秒,即1kHz。此时,若CCR设置为500,则占空比为50%,电机获得约一半的电源电压。若CCR设置为750,则占空比为75%。这种数字化的控制方式具有极高的精度和稳定性,且几乎不产生额外功耗。
3.2 占空比与平均电压的数学关系及电机响应
直流电机的转速近似正比于其电枢两端的平均电压。PWM调速的核心思想是利用电机的机械惯性(转动惯量)和电枢绕组的电感滤波效应,使得电机对高频开关信号不敏感,而只对平均电压产生响应。设电源电压为V_supply,占空比为D(0≤D≤1),则电机电枢两端的平均电压V_avg = D × V_supply。例如,12V电源下,D=0.3时,平均电压为3.6V;D=0.8时,平均电压为9.6V。
然而,实际电机电流并非完全平滑。由于电枢电感的存在,电流在PWM导通期间上升,在关断期间通过续流二极管下降,形成锯齿波状的纹波电流。纹波的大小与PWM频率、电枢电感L和电源电压有关。提高PWM频率可以减小纹波,但频率过高会增加MOSFET的开关损耗。对于大多数直流电机,1kHz到20kHz的PWM频率是常见选择。低于20kHz的频率可能会产生人耳可闻的啸叫,因此许多机器人项目选择20kHz以上的超声波频率。
| 占空比 D | 平均电压 (12V电源) | 电机状态 | 应用场景 |
|---|---|---|---|
| 0% | 0V | 停止 | 刹车/待机 |
| 25% | 3V | 低速转动 | 缓慢移动/对准 |
| 50% | 6V | 中速转动 | 常规巡航 |
| 75% | 9V | 高速转动 | 快速行进 |
| 100% | 12V | 全速转动 | 冲刺/爬坡 |
3.3 STM32定时器输出PWM配置实战
在STM32标准外设库或HAL库中,配置PWM输出通常需要以下步骤。以STM32F103C8T6(Blue Pill)为例,我们使用TIM2的通道1(PA0引脚)输出PWM信号。
- 使能定时器时钟和GPIO时钟:通过RCC寄存器开启TIM2和GPIOA的时钟。
- 配置GPIO为复用推挽输出:将PA0设置为AF_PP(复用推挽),以连接到TIM2_CH1。
- 配置定时器时基:设置PSC和ARR,确定PWM频率。
- 配置PWM模式:设置计数模式为向上计数,输出比较模式为PWM1(即CNT<CCR时输出有效电平)。
- 使能输出比较预装载:允许在更新事件时更新CCR值,避免在计数过程中修改导致波形异常。
- 使能自动重装载预装载:确保ARR修改在周期结束后生效。
- 使能PWM输出和定时器:最后启动定时器。
// 以HAL库为例的PWM初始化代码片段
TIM_HandleTypeDef htim2;
TIM_OC_InitTypeDef sConfigOC;
void MX_TIM2_Init(void) {
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 72MHz/(71+1) = 1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 1kHz PWM
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim2);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 初始占空比50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
// 动态修改占空比
void set_motor_speed(uint16_t duty_cycle) {
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty_cycle);
}
HAL_TIM_PWM_Start后,使用__HAL_TIM_SET_COMPARE是安全的,因为它内部会处理预装载同步。
3.4 案例拆解:基于PWM的电机开环调速与问题排查
背景与目标:我们正在调试一台两轮差速机器人底盘,要求电机在空载时达到3000 RPM的额定转速。电源为12V直流,电机额定功率10W,电枢电阻2Ω,电感0.5mH。我们使用STM32输出20kHz的PWM信号驱动一个半桥MOSFET电路。
初始现象:当设置占空比为50%时,使用光电编码器测得实际转速仅为1200 RPM,远低于理论预期的1500 RPM(因为12V×0.5=6V,空载转速约1500 RPM)。同时,用手触摸MOSFET散热片,发现温度明显偏高。
分析判断过程:首先,我们检查了PWM波形,使用示波器观察PA0引脚,波形频率准确为20kHz,占空比稳定为50%。接着,我们测量了电机电枢两端的电压波形,发现电压并非平滑的6V,而是存在明显的尖峰和振铃。进一步检查发现,驱动电路缺少续流二极管,或者续流二极管的反向恢复时间过长,导致在MOSFET关断瞬间,电机电感产生的高压反电动势击穿了MOSFET的寄生二极管,造成额外的功率损耗和电压降。
实际操作步骤:
- 在电机两端并联一个快恢复二极管(如FR107)或肖特基二极管(如SS34),阴极接电源正极,阳极接电机与MOSFET的连接点。
- 在MOSFET的栅极和源极之间增加一个10Ω电阻和10nF电容组成的RC吸收电路,抑制栅极振荡。
- 将PWM频率从20kHz降低到10kHz,观察是否因开关损耗过大导致电压跌落。
结果对比:增加续流二极管后,电机电枢电压波形变得平滑,平均电压接近6V。在50%占空比下,实测转速恢复到1480 RPM,MOSFET温度显著下降。将PWM频率调回20kHz后,转速依然稳定,说明之前的电压跌落主要是续流问题而非开关损耗。
风险与代价:续流二极管的选型至关重要。若选择普通整流二极管(如1N4007),其反向恢复时间过长,在20kHz下无法有效工作,反而会引入更大的开关噪声。必须选择快恢复或肖特基二极管。此外,RC吸收电路会增加轻微的静态功耗,但换取了更稳定的开关波形。
3.5 总结复盘与工程要点
PWM调速是电机控制的基础,其本质是“数字控制模拟输出”。本章的核心知识点可以归纳为:PWM频率由PSC和ARR决定,占空比由CCR决定,平均电压等于占空比乘以电源电压。在STM32配置中,务必注意预装载功能的启用,以保证波形更新平滑。在硬件层面,续流二极管是驱动电路不可或缺的元件,它直接关系到系统的效率和可靠性。
在实际工程中,建议先用示波器验证PWM波形是否正确,再连接电机。测量电机电枢电压时,应使用低通滤波探头或测量平均电压档位,否则会看到方波而非平滑直流。此外,当电机负载变化时,电源电压可能会被拉低,导致实际平均电压低于理论值。因此,在闭环控制中,通常需要采样电源电压进行补偿,或者采用电流环来间接控制转矩。
- PWM频率 = 定时器时钟 / ((PSC+1) × (ARR+1))
- 占空比分辨率 = 1/(ARR+1),ARR越大,控制越精细。
- 电机平均电压 = 占空比 × 电源电压,但需考虑MOSFET压降和续流二极管损耗。
- STM32配置顺序:时钟→GPIO→时基→PWM模式→使能输出。
- 硬件上必须配备续流二极管,否则MOSFET易损坏。