直流有刷电机基础与H桥驱动原理
各位同学,今天我们来聊聊电机控制里最基础、也最绕不开的一个话题——直流有刷电机和它的驱动方式。说实话,我入行那会儿,第一个接触的电机就是这种。它结构简单,控制起来也直观,但你要是真把它玩透了,后面学无刷电机、步进电机都会轻松很多。
直流有刷电机工作原理
直流有刷电机,说白了就是靠电刷换向的直流电机。你给它通上电,转子就会转。为什么?因为里面有两样东西:定子上的永磁体(或者励磁绕组),和转子上的线圈。电流通过电刷和换向器流进转子线圈,产生磁场,这个磁场和定子磁场一相互作用,就产生了转矩。
我打个比方:就像你拿两块磁铁,同极相斥,异极相吸。转子线圈每转到一个位置,换向器就自动切换电流方向,保证转矩方向始终一致。这就是它自己能一直转下去的秘密。
关键参数:
- 转速:和电压成正比。电压越高,转得越快。
- 转矩:和电流成正比。电流越大,力气越大。
- 反电动势:转子转动时,线圈切割磁感线会产生一个反向电压。转速越高,反电动势越大。
嗯,这里要注意一点:电机启动瞬间,转子还没转,反电动势为零。这时候电流会非常大,可能烧坏电机或驱动电路。我在项目中遇到过好几次,新手一上来就给电机满电压启动,结果MOS管直接冒烟。所以启动时一定要做限流或软启动。
H桥电路拓扑
直流有刷电机要正反转,怎么办?你想想看,改变电流方向就行了。H桥就是干这个活的。
H桥由4个MOS管组成,名字叫Q1、Q2、Q3、Q4。它们接成一个大写的"H"形,电机接在中间横杠上。Q1和Q3是上管,Q2和Q4是下管。每个MOS管都有一个续流二极管,保护管子不被反电动势击穿。
我个人习惯:选MOS管时,除了看耐压和电流,一定要关注Rds(on)(导通电阻)。这个值越小,管子发热越少。我早期吃过亏,选了个Rds(on) 100毫欧的管子,结果跑2A电流就烫得不行。后来换成20毫欧的,散热片都省了。
H桥的四种基本状态:
| 状态 | Q1 | Q2 | Q3 | Q4 | 电机行为 |
|---|---|---|---|---|---|
| 正转 | ON | OFF | OFF | ON | 电流从左到右,电机正转 |
| 反转 | OFF | ON | ON | OFF | 电流从右到左,电机反转 |
| 刹车(慢速) | OFF | ON | OFF | ON | 电机两端短路,产生制动转矩 |
| 刹车(快速) | ON | OFF | ON | OFF | 同样短路,但电流方向相反 |
| 滑行 | OFF | OFF | OFF | OFF | 所有管子关闭,电机自由转动 |
警告:绝对不能让Q1和Q2同时导通,也不能让Q3和Q4同时导通。这就是所谓的"直通"或"穿通"。一旦发生,电源直接短路,电流瞬间爆表,MOS管秒烧。我曾经调试时手抖了一下,代码里延时没写够,结果两个管子同时开了0.1毫秒,砰的一声,板子废了。从那以后,我写PWM驱动时一定会加死区时间。
正反转与刹车控制逻辑
控制正反转,其实就是控制H桥的导通组合。但实际工程中,不能直接从正转切到反转。为什么?因为电机有惯性。你正转着突然给它反转信号,电流会瞬间反向,产生巨大的冲击电流,可能烧驱动。
我建议的做法是:先让电机滑行(所有管子关断)或者刹车(上下管短路),等转速降下来,再切换方向。具体用哪种,看你的应用场景。
- 滑行:电机靠摩擦力自然减速。适合对停车位置没要求的场景。
- 刹车:电机两端短路,利用反电动势产生制动转矩。停车快,但会有电流冲击。
- 再生制动:把电机的动能转化成电能回馈给电源。效率高,但电路复杂。
我在做AGV小车项目时,用的是刹车+滑行组合。先刹车0.5秒让速度降下来,然后切滑行,最后再切反转。这样既保证了停车精度,又不会把MOS管烧掉。
PWM调速原理
直流有刷电机调速,最常用的方法就是PWM(脉宽调制)。说白了,就是给电机通一个方波信号,通过调节占空比来控制平均电压。
占空比 = 高电平时间 / 整个周期时间。占空比50%,平均电压就是电源电压的一半。占空比100%,就是满电压。
为什么不用直接调电压?因为线性调压效率低,发热大。PWM用的是开关方式,MOS管要么全开要么全关,损耗很小。你想想看,管子全开时电阻只有几十毫欧,全关时电流为零,都不怎么发热。只有开关切换那一下有损耗,但频率高了,这部分损耗也可以忽略。
PWM频率怎么选?
- 太低:电机能听到"嗡嗡"声,甚至能看到抖动。一般低于1kHz就会有明显噪音。
- 太高:MOS管开关损耗增加,驱动芯片发热。超过100kHz就不太划算了。
- 推荐:10kHz~20kHz。人耳听不到,开关损耗也小。我一般用16kHz,刚好避开音频范围。
代码实现其实很简单。以STM32为例,用定时器输出PWM:
// 假设定时器2,通道1,输出PWM
// 初始化代码略...
// 设置占空比50%
TIM2->CCR1 = 500; // 如果ARR=1000,占空比50%
// 调速函数
void motor_set_speed(uint16_t speed) {
// speed范围0~1000
if(speed > 1000) speed = 1000;
TIM2->CCR1 = speed;
}
嗯,这里有个坑:PWM频率和电机电感要匹配。电感大的电机,电流纹波小,可以用低频率。电感小的电机,电流纹波大,频率要高一些。我在做微型电机驱动时,电机电感只有几十微亨,PWM频率用到40kHz才把电流纹波压下去。
避坑指南:我曾经在调试时发现电机低速抖动严重。查了半天,发现是PWM分辨率不够。占空比从0变到1时,电机电压跳变太大。后来把定时器ARR设成10000,分辨率提高到0.01%,低速就平稳了。所以,如果你做低速控制,一定要提高PWM分辨率。
最后总结一下:直流有刷电机控制,核心就是H桥+PWM。H桥负责换向,PWM负责调速。两者结合,就能实现平滑的正反转和速度控制。下一章我们讲电流检测和闭环控制,到时候你会看到,有了反馈,电机控制才能真正做到精准。