4、PWM调速原理:PWM信号生成、占空比与转速关系、频率选择

好,咱们接着聊电机控制。前面讲了电机怎么转、怎么测速,那问题来了——怎么让电机转得慢一点、快一点?

你可能会想,直接调电压不就行了?理论上没错。但实际项目中,你很难用一个可调电阻去精确控制大电流电机的电压。而且效率低、发热大。所以,工业界和机器人圈子里,大家普遍用PWM。

PWM,全称Pulse Width Modulation,脉冲宽度调制。说白了,就是让电压一会儿开、一会儿关。通过控制“开”的时间比例,来等效地调节电机两端的平均电压。

4.1 PWM信号是怎么生成的?

生成PWM信号,最常用的方式是用定时器+比较器。我早期做项目时,还傻乎乎地用延时函数去手动翻转IO口,结果CPU啥也干不了,全在那数数了。后来才明白,硬件定时器才是正道。

基本原理是这样的:

  • 定时器不断计数,从0计到某个最大值(比如ARR,自动重装载值)。
  • 同时有一个比较寄存器(CCR),存着你设定的阈值。
  • 当计数值小于CCR时,输出高电平;大于等于CCR时,输出低电平。
  • 计数值溢出归零,重新开始。这样周期就固定了。

嗯,这里要注意:你改变CCR的值,就改变了高电平的持续时间,也就是占空比。

以STM32为例,一段典型的PWM初始化代码长这样:

// 假设定时器TIM2,通道1输出PWM
TIM_HandleTypeDef htim2;
TIM_OC_InitTypeDef sConfigOC = {0};

htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;      // 72MHz / (71+1) = 1MHz
htim2.Init.Period = 999;        // 1MHz / (999+1) = 1kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim2);

sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500;          // 占空比 500/1000 = 50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

你看,Prescaler和Period决定了频率,Pulse决定了占空比。改Pulse,电机转速就变了。

4.2 占空比与转速的关系

占空比,就是高电平时间占整个周期的百分比。比如50%占空比,就是一半时间开、一半时间关。

那占空比和转速是什么关系?

我直接说结论:在大多数直流电机上,占空比与转速近似成正比

为什么会这样?因为电机绕组有电感,电流不会瞬间跳变。PWM开关频率足够高时,电流会平滑地维持在某个平均值附近。这个平均值正比于占空比乘以电源电压。

举个例子:

  • 占空比0%:平均电压0V,电机不转。
  • 占空比25%:平均电压3V(假设12V供电),电机慢转。
  • 占空比50%:平均电压6V,电机中速。
  • 占空比75%:平均电压9V,电机较快。
  • 占空比100%:平均电压12V,电机全速。

不过,这里有个坑。我曾经在调试一款小型扫地机器人时发现,占空比低于10%时,电机根本不转。为什么?因为电机启动需要克服静摩擦力和惯性,电压太低,转矩不够。这叫“死区效应”。

注意: 占空比与转速并非严格的线性关系。低速时存在死区,高速时受反电动势影响,曲线会略微弯曲。实际项目中,建议做一次标定,测出占空比-转速曲线,再去做闭环控制。

4.3 频率怎么选?

频率选择,是PWM调速里最容易忽略、但影响最大的参数。

频率太低,电机运转会一抖一抖的,甚至发出“嗡嗡”的噪音。频率太高,MOS管开关损耗剧增,驱动器发热严重。

我个人习惯,扫地机器人的电机PWM频率,一般选在10kHz ~ 20kHz之间。

为什么是这个范围?

  • 低于5kHz:人耳能听到开关噪声,很烦。而且电机电流纹波大,转矩脉动明显。
  • 高于20kHz:超出人耳听觉范围,安静了。但开关损耗开始显著增加,驱动芯片温度上升。
  • 高于50kHz:除非你用GaN或SiC器件,否则普通MOS管发热会非常严重,得不偿失。

我建议你根据电机类型来选:

电机类型 推荐PWM频率 说明
普通直流有刷电机 10kHz ~ 20kHz 兼顾噪音和效率,最常用
直流无刷电机(BLDC) 20kHz ~ 50kHz 需要更平滑的电流控制
步进电机 20kHz ~ 40kHz 细分驱动时常用
微型振动电机 100Hz ~ 1kHz 频率低反而振动效果好
小技巧: 如果你不确定选多少,先上15kHz试试。这是很多商业扫地机器人驱动板的默认值。我在项目里也一直用这个频率,很少出问题。

4.4 实际项目中的避坑指南

最后,分享几个我踩过的坑,希望能帮你省点时间。

  • 我曾经把PWM频率设到100Hz,结果电机低速时一顿一顿的,像在跳舞。后来改成10kHz,问题立刻消失。
  • 我曾经用软件延时生成PWM,结果CPU占用率飙到80%,其他任务全卡死。后来换成硬件定时器,CPU占用率降到2%。
  • 我曾经没加死区时间,导致H桥上下管直通,MOS管瞬间冒烟。嗯,那味道至今难忘。
  • 注意:PWM频率越高,电机电感对电流的平滑效果越好,但驱动芯片的开关损耗也越大。你需要根据实际温升来权衡。

你想想看,PWM调速其实没那么复杂。核心就三件事:生成信号、调占空比、选频率。把这三点搞明白,电机控制就算入门了。

下一节,咱们会把这些知识串起来,讲完整的运动学模型。到时候你会发现,前面这些基础,全都能用上。