3. PWM调速原理

在机器人电机控制中,直流有刷电机是最常见的执行元件之一。要让电机以期望的速度旋转,最直接的方法是调整其电枢两端的平均电压。然而,直接使用可变电阻或线性稳压器来调压,不仅效率低下,还会产生大量热量。PWM(脉冲宽度调制)技术通过高速开关电源电压,以数字方式实现高效的模拟电压控制,是电机调速的核心手段。本章将深入剖析PWM信号的生成机制、占空比与平均电压的数学关系,并详细讲解如何基于STM32定时器配置PWM输出,为后续的PID闭环调速打下坚实的硬件基础。

STM32 PWM电机调速信号链路与核心参数 STM32 定时器 TIM2/TIM3/TIM4 PSC / ARR / CCRx PWM 信号生成 频率 f = 72MHz/(PSC+1)(ARR+1) 占空比 D = CCRx/(ARR+1) 电机驱动电路 MOSFET H桥 死区时间 / 电流续流 直流电机 电枢电感 L 反电动势 EMF PWM波形 (D=25%) T_on T_off V_avg = D × V_supply 关键参数配置表 参数 公式/值 说明 PSC 71 72MHz→1MHz ARR 999 1kHz PWM频率 CCR 0~999 占空比控制 分辨率 0.1% 10位精度

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信号。

  1. 使能定时器时钟和GPIO时钟:通过RCC寄存器开启TIM2和GPIOA的时钟。
  2. 配置GPIO为复用推挽输出:将PA0设置为AF_PP(复用推挽),以连接到TIM2_CH1。
  3. 配置定时器时基:设置PSC和ARR,确定PWM频率。
  4. 配置PWM模式:设置计数模式为向上计数,输出比较模式为PWM1(即CNT<CCR时输出有效电平)。
  5. 使能输出比较预装载:允许在更新事件时更新CCR值,避免在计数过程中修改导致波形异常。
  6. 使能自动重装载预装载:确保ARR修改在周期结束后生效。
  7. 使能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);
}
经验提醒:在修改CCR值(占空比)时,务必确保定时器已使能自动重装载预装载功能。否则,如果在计数器计数过程中直接写入CCR,可能导致输出波形出现一个异常宽或窄的脉冲,引起电机抖动。在HAL库中,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的寄生二极管,造成额外的功率损耗和电压降。

实际操作步骤:

  1. 在电机两端并联一个快恢复二极管(如FR107)或肖特基二极管(如SS34),阴极接电源正极,阳极接电机与MOSFET的连接点。
  2. 在MOSFET的栅极和源极之间增加一个10Ω电阻和10nF电容组成的RC吸收电路,抑制栅极振荡。
  3. 将PWM频率从20kHz降低到10kHz,观察是否因开关损耗过大导致电压跌落。

结果对比:增加续流二极管后,电机电枢电压波形变得平滑,平均电压接近6V。在50%占空比下,实测转速恢复到1480 RPM,MOSFET温度显著下降。将PWM频率调回20kHz后,转速依然稳定,说明之前的电压跌落主要是续流问题而非开关损耗。

风险与代价:续流二极管的选型至关重要。若选择普通整流二极管(如1N4007),其反向恢复时间过长,在20kHz下无法有效工作,反而会引入更大的开关噪声。必须选择快恢复或肖特基二极管。此外,RC吸收电路会增加轻微的静态功耗,但换取了更稳定的开关波形。

常见误区:很多初学者认为PWM频率越高越好。实际上,频率过高会导致MOSFET开关损耗急剧增加,尤其是在大电流电机驱动中。同时,频率过高也会加剧电磁干扰(EMI)。选择PWM频率时,应权衡纹波电流、开关损耗和噪声要求。对于大多数小型机器人电机,10kHz~20kHz是黄金区间。

3.5 总结复盘与工程要点

PWM调速是电机控制的基础,其本质是“数字控制模拟输出”。本章的核心知识点可以归纳为:PWM频率由PSC和ARR决定,占空比由CCR决定,平均电压等于占空比乘以电源电压。在STM32配置中,务必注意预装载功能的启用,以保证波形更新平滑。在硬件层面,续流二极管是驱动电路不可或缺的元件,它直接关系到系统的效率和可靠性。

在实际工程中,建议先用示波器验证PWM波形是否正确,再连接电机。测量电机电枢电压时,应使用低通滤波探头或测量平均电压档位,否则会看到方波而非平滑直流。此外,当电机负载变化时,电源电压可能会被拉低,导致实际平均电压低于理论值。因此,在闭环控制中,通常需要采样电源电压进行补偿,或者采用电流环来间接控制转矩。

本节要点速查:
  • PWM频率 = 定时器时钟 / ((PSC+1) × (ARR+1))
  • 占空比分辨率 = 1/(ARR+1),ARR越大,控制越精细。
  • 电机平均电压 = 占空比 × 电源电压,但需考虑MOSFET压降和续流二极管损耗。
  • STM32配置顺序:时钟→GPIO→时基→PWM模式→使能输出。
  • 硬件上必须配备续流二极管,否则MOSFET易损坏。