电机驱动原理:直流电机工作原理、H桥电路、电机调速方法
各位同学,今天我们来聊聊电机驱动最核心的几个知识点。说实话,我刚开始做嵌入式的时候,觉得电机驱动不就是给个电压让它转嘛。直到第一次把MOS管烧冒烟了,才老老实实回来补基础。
直流电机、H桥、调速方法,这三块是电机控制的基石。你想想看,不管你是做四轴飞行器、智能小车,还是工业伺服,底层原理都离不开它们。咱们一个一个来拆解。
直流电机工作原理
直流电机为什么能转?说白了就是「电生磁,磁生力」。电机内部有定子(永磁体或电磁铁)和转子(线圈绕组)。当你给线圈通电,它就成了一个电磁铁。定子的磁场和转子的磁场相互作用,产生转矩,转子就转起来了。
这里有个关键点——换向器。转子每转半圈,电流方向就得换一次,否则转子会被卡在某个位置不动。这就是为什么直流电机需要电刷和换向片。嗯,我在一个项目中用过无刷直流电机(BLDC),那又是另一套玩法,但基础原理是一样的。
核心公式:
- 转速 n = (U - I×R) / (Ke×Φ) —— 电压越高,转速越快
- 转矩 T = Kt×I —— 电流越大,力气越大
- 反电动势 E = Ke×n —— 转速越高,反电动势越大
你可能会问:为什么电机堵转时电流特别大?因为转速为零,反电动势为零,电源电压全部加在线圈电阻上。我曾经调试一个直流电机驱动板,堵转电流飙到额定电流的8倍,直接把电源拉保护了。所以,堵转保护一定要做。
H桥电路
直流电机只能正转?当然不是。H桥电路就是用来控制电机正反转的。为什么叫H桥?你看它的电路拓扑,四个开关管(MOS管或三极管)摆成H形,电机在中间横杠上。
H桥有四种工作状态,我整理了一个表格,方便你对照:
| 工作模式 | Q1 | Q2 | Q3 | Q4 | 电机状态 |
|---|---|---|---|---|---|
| 正转 | ON | OFF | OFF | ON | 正转(电流从左到右) |
| 反转 | OFF | ON | ON | OFF | 反转(电流从右到左) |
| 刹车(能耗制动) | OFF | OFF | ON | ON | 电机两端短路,快速停转 |
| 滑行(自由停止) | OFF | OFF | OFF | OFF | 电机惯性自由旋转 |
致命陷阱:千万不要让Q1和Q2同时导通,或者Q3和Q4同时导通!这叫「直通短路」,电流会直接从VCC灌到GND,MOS管瞬间烧毁。我曾经在调试时因为软件时序问题,让上下管同时导通了0.5ms,结果MOS管直接炸裂。所以,一定要加死区时间(Dead Time)。
电机调速方法
调速是电机控制的核心需求。直流电机调速有三种主流方法,我按实际工程中的使用频率排序:
- PWM调压调速 —— 最常用,效率高
- 电枢串电阻调速 —— 老式方法,效率低
- 调磁调速 —— 用于弱磁升速场景
咱们重点讲PWM调速,因为这是本课程的核心。PWM调速的原理很简单:用固定频率的方波控制MOS管的导通和关断。通过改变占空比,改变电机两端的平均电压。
关键公式:
Uavg = D × VCC
其中 D 是占空比(0~1),VCC 是电源电压。
占空比50%时,平均电压就是电源电压的一半。电机转速也差不多是一半。
PWM频率怎么选?我一般遵循这个原则:
| 应用场景 | 推荐PWM频率 | 说明 |
|---|---|---|
| 普通直流电机(玩具、小车) | 1kHz ~ 10kHz | 频率太低电机会抖动,有噪音 |
| 精密直流电机(伺服、机器人) | 10kHz ~ 50kHz | 频率高,电流纹波小,控制更平滑 |
| 有刷电机(大功率) | 500Hz ~ 2kHz | 频率太高,MOS管开关损耗大 |
我的经验:对于大多数小功率直流电机,我习惯用10kHz左右的PWM频率。这个频率人耳基本听不到,电机运行也平稳。如果电机发出尖锐的啸叫声,说明PWM频率落在了人耳敏感区(2kHz~5kHz),适当调高或调低就能解决。
PWM调速的代码实现,以STM32为例,配置定时器输出PWM:
// 以STM32 TIM2 通道1为例,输出PWM控制电机
// 假设定时器时钟为72MHz,预分频器72-1,自动重载1000-1
// 则PWM频率 = 72MHz / 72 / 1000 = 1000Hz
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 1. 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 2. 配置定时器
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重载值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 3. 配置PWM通道
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 4. 使能定时器
TIM_Cmd(TIM2, ENABLE);
// 5. 运行时修改占空比
void set_motor_speed(uint16_t duty_cycle) {
// duty_cycle范围:0~1000,对应0%~100%
TIM_SetCompare1(TIM2, duty_cycle);
}
嗯,这里要注意一点:PWM调速虽然简单,但实际工程中要考虑电机电感和电流纹波。电感越大,电流越平滑,但响应速度会变慢。我做过一个项目,电机电感很小,PWM频率又偏低,结果电流纹波大得离谱,电机发热严重。后来把频率从1kHz提到20kHz,问题就解决了。
调速方法对比
三种调速方法各有优劣,我直接给你结论:
| 调速方法 | 效率 | 调速范围 | 成本 | 适用场景 |
|---|---|---|---|---|
| PWM调压 | 高(>90%) | 宽(0~100%) | 低 | 绝大多数现代应用 |
| 串电阻 | 低(发热严重) | 窄(只能降速) | 极低 | 老式设备、临时调试 |
| 调磁 | 中 | 窄(只能升速) | 高 | 需要弱磁升速的场合 |
说白了,现在做电机控制,99%的情况都用PWM。串电阻调速我只有在实验室临时测试时用过,调磁调速在永磁电机上基本用不到。
避坑指南
最后,分享几个我踩过的坑:
- 死区时间不够:我曾经在H桥驱动中只设了100ns死区,结果MOS管开关速度太快,上下管还是瞬间导通了。建议死区时间至少设为MOS管开关时间的3~5倍。
- PWM频率与电机谐振:有一次电机在某个转速下剧烈抖动,查了半天发现是PWM频率的谐波和电机机械谐振频率重合了。解决办法是微调PWM频率,避开谐振点。
- 电源滤波不足:电机启动瞬间电流很大,会把电源电压拉低,导致MCU复位。一定要在电机电源入口加足够大的电解电容(建议1000μF以上)。
好了,直流电机的工作原理、H桥电路和调速方法就讲到这里。这些是电机控制的底层逻辑,后面讲PWM部署时,你会反复用到这些知识。