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 | 频率低反而振动效果好 |
4.4 实际项目中的避坑指南
最后,分享几个我踩过的坑,希望能帮你省点时间。
- 我曾经把PWM频率设到100Hz,结果电机低速时一顿一顿的,像在跳舞。后来改成10kHz,问题立刻消失。
- 我曾经用软件延时生成PWM,结果CPU占用率飙到80%,其他任务全卡死。后来换成硬件定时器,CPU占用率降到2%。
- 我曾经没加死区时间,导致H桥上下管直通,MOS管瞬间冒烟。嗯,那味道至今难忘。
- 注意:PWM频率越高,电机电感对电流的平滑效果越好,但驱动芯片的开关损耗也越大。你需要根据实际温升来权衡。
你想想看,PWM调速其实没那么复杂。核心就三件事:生成信号、调占空比、选频率。把这三点搞明白,电机控制就算入门了。
下一节,咱们会把这些知识串起来,讲完整的运动学模型。到时候你会发现,前面这些基础,全都能用上。