教程 · 入门 · 阅读约 18 分钟
用 PWM 与 H 桥电路控制直流电机
学习如何用 PWM 和 H 桥控制一台有刷直流电机,内容涵盖转向控制、制动、电流限制、接线,以及怎样安全地选择电机驱动器。
单片机的引脚能描述电机应该怎么转,却没法安全地提供电机电流。一台有刷直流(DC)电机在启动或堵转时,可能吃掉正常电流的好几倍。H 桥电机驱动器就坐在控制器和电机之间:它用独立电源开关这股电流,并让控制器选择速度和方向。
本文搭的是循迹车、迷宫机器人和小型避障平台都会用到的电机级。具体引脚名随驱动器而变,电气上的决策则始终一样。
先弄懂 H 桥改变了什么
直流电机里电流方向反转,电机就反转。H 桥用四个电子开关围在电机周围。一对角上的开关驱动正向电流,另一对驱动反向。驱动板通过 IN1、IN2 这类逻辑引脚把这种切换暴露出来:
| IN1 | IN2 | 电机状态 |
|---|---|---|
| Low | Low | 滑行或刹车,取决于驱动器 |
| High | Low | 前进 |
| Low | High | 后退 |
| High | High | 刹车或滑行,取决于驱动器 |
永远不要假定两个低电平和两个高电平分别是什么意思。要读具体那颗驱动器的真值表。有些芯片还有 ENABLE、STANDBY 或 SLEEP 引脚,必须先拉有效,输出才会工作。
**脉宽调制(PWM)**通过快速通断来控制平均电压。25% 的占空比意味着每个周期通四分之一时间;它并不保证轴速就是四分之一,因为结果还取决于负载、电源电压、摩擦和电机的反电动势。
按电流选驱动器,而不是按电机尺寸
查出电机的额定电压、空载电流和堵转电流。堵转电流是给驱动器定型的关键数值,因为它是轴转不动时电机所索取的电流。如果拿不到数据手册,就在电机断开的情况下测绕组电阻,用 堵转电流 = 电源电压 / 绕组电阻 估算。表笔的电阻让这个估算只能作参考。
选一个电机电压范围覆盖你的电源、峰值电流能在启动中活下来的驱动器。然后再核对连续电流和散热条件。一块标着很大峰值数字的板子,可能只能短暂承受,或者需要相当强的散热。
还要把压降算进去。老式的双极晶体管驱动器可能在桥内损失可观的电压;现代 MOSFET 驱动器通常浪费的功率更少。对一台电池机器人来说,这个差别会影响转矩和续航。
把一台电机安全地接好
上电之前按这个顺序接线:
- 把电机电源接到驱动器的电机电源输入和地。
- 把电机接到驱动器的两个输出上,而不是接到单片机引脚。
- 把控制器地和驱动器地连起来,让逻辑信号共用一个参考。
- 把
IN1、IN2以及任何使能引脚接到合适的数字引脚。 - 电机走线尽量短,并且远离模拟传感器引线布设。
- 在接 3.3 V 的 ESP32 或树莓派之前,先确认驱动器对逻辑电压的要求。
首次上电时使用保险丝或限流的台式电源。按驱动器数据手册的建议加上就近的电源去耦。永远不要通过 Arduino 的 5 V 稳压器或 USB 接口给带载的电机供电——那就是被读成软件崩溃的欠压。
写一个小的电机函数
最干净的接口接受一个带符号的指令:正数前进,负数后退,零停止。在 Arduino 风格的板子上,一个最小实现是这样:
const int IN1 = 7;
const int IN2 = 8;
const int PWM_PIN = 5;
void setMotor(int command) {
command = constrain(command, -255, 255);
digitalWrite(IN1, command >= 0 ? HIGH : LOW);
digitalWrite(IN2, command >= 0 ? LOW : HIGH);
analogWrite(PWM_PIN, abs(command));
}
这个例子假设驱动器有一个独立的 PWM/使能输入。两输入的驱动器可能期望在一个输入上加 PWM、另一个输入保持方向状态。要跟着它的真值表走,而不是盲目照抄引脚逻辑。
换向前先短暂下发一次零指令。从全速瞬间反向会产生一个大的电流瞬变和机械冲击。一个简单的斜坡同时还能改善附着力:
for (int command = 0; command <= 180; command += 5) {
setMotor(command);
delay(15);
}
在真正的控制环里,把这个斜坡做成基于时间的,而不是用阻塞的 delay() 调用。
测试方向、速度、滑行和刹车
第一次测试时把轮子架空离开桌面。从低占空比开始,确认指令的方向,然后逐渐加大。记下能可靠起动电机的最低指令。静摩擦会造成一个死区,所以低于那个阈值的指令可能只是在嗡嗡响而不动。
接着比较几种停机方式。滑行是把桥断开或释放,让动量自己把电机慢下来。动态刹车是通过桥把电机端子短接,让旋转的电机把能量耗散掉、停得更快。刹车带来的电气和机械应力更大,所以要有意识地用。
最后把机器人放到地面上再重复一遍。空载能转的电机在真实负载下可能让控制器欠压。留意启动时的电源电压,并确认驱动器没有过热。
常见故障的诊断
- **电机一启动控制器就复位:**电源塌了,或者电机噪声传到了逻辑轨。电池电流要够、就近去耦、接地干净,必要时给逻辑单独一路稳压。
- **电机只往一个方向转:**检查驱动器上的两个逻辑输入,并确认待机或使能已经拉有效。
- **PWM 变了速度几乎不变:**检查所选引脚是否真的支持 PWM,以及驱动器是否在这个输入上接受 PWM。
- **驱动器发热:**把负载和堵转电流与连续额定值比较,检查压降,并查看传动机构是否有机械卡死。
- **传感器变嘈杂:**把电机线和传感器线分开,加上电机/驱动器厂家推荐的抑制措施,并且要先修好电气通路再去做测量滤波。
一台电机工作得可靠之后,把这一路复制一份就得到差速机器人。循迹模拟器演示两个带符号的轮指令如何变成转向,PID 控制器模拟器展示如何用反馈调节速度,而不是依赖原始占空比。
硬件标定旋钮要留着
两台标称完全相同的电机很少给出完全相同的速度。把每轮的缩放系数和最小起动指令保存在软件里。要去测量这种不一致,而不是用一个来源不明的固定偏移把它盖住。以后接上正交编码器闭环,就能随着电池电压和负载变化修正速度。
探索关联图谱
本教程所属的搭建
包含本教程的项目和学习路线。
延伸阅读