元器件 · 驱动器
A4988 步进驱动板
给步进电机线圈做恒流调节的廉价载板。本文讲怎么用万用表设定限流值、采样电阻的陷阱,以及什么时候该换用 TMC 驱动。
它是什么
A4988 载板是单片机和双极步进电机之间的邮票板。给它两信号——脉冲和方向——剩下全包:线圈按正确序列通电,关键进多少电流恒住。
第二项任务才是要紧的那项,也恰恰是大家会跳过的那项。步进电机的一相绕组是一个低电阻的电感,通常是 2 到 4 欧。把 24 V 加在 2.8 Ω 上,按欧姆定律就是 8.6 A,几秒钟就能烧毁一台 1.7 A 的电机。A4988 的做法是把电源每秒通断几万次,把平均电流维持在你设定的值上。
所以这块板上恰好只有一个可调项:设定限流值的微调电位器。调对了,驱动板的存在感几乎为零;调错了,你要么得到一台力弱到丢步的电机,要么得到一台热到烧掉的电机。
引脚
| 引脚 | 方向 | 作用 |
|---|---|---|
| VMOT | 电源进 | 8–35 V 电机电源。并 100 µF,贴着。 |
| GND(电机侧) | 电源 | 大电流回流 |
| VDD | 电源进 | 3–5.5 V 逻辑电源,几毫安 |
| GND(逻辑侧) | 电源 | 必须和电机电源共地 |
| 1A、1B | 出 | 一路线圈 |
| 2A、2B | 出 | 另一路线圈 |
| STEP | 进 | 上升沿 = 一微步 |
| DIR | 进 | 高低选方向 |
| ENABLE | 进 | **低有效。**接地通电。 |
| RESET | 进 | 必须高。跳线连 SLEEP。 |
| SLEEP | 进 | 驱动跑必须高 |
| MS1、MS2、MS3 | 进 | 微步分辨率;内部下拉 |
有两个引脚占了大多数“完全没反应”报告:ENABLE 悬空或为高(它是低有效的,所以必须拉低),以及 RESET 悬空(它必须为高,这也是每份接线指南都让你把 RESET 跳线到 SLEEP 的原因)。
接到 Arduino
Arduino 5V ──── VDD
Arduino GND ──── GND (logic) ──┬── GND (motor)
└── PSU −
PSU + (12–24 V) ──── VMOT ──┬── 100 µF electrolytic ──┘
Pin 3 ──── STEP RESET ──┬── SLEEP
Pin 4 ──── DIR
Pin 5 ──── ENABLE MS1, MS2, MS3 ──── 5 V (1/16 stepping)
Motor coil A ──── 1A, 1B
Motor coil B ──── 2A, 2B
无可商量的事项:
- 在 VMOT 与地之间并 100 µF 电解电容,而且要尽量贴近板子。这是板子一上电就死最常见的原因。
- **Arduino 与电机电源共地。**没有共地,STEP 信号就没有参考电位,驱动看到的是噪声。
- **带电时绝不要拔掉电机。**通电的线圈被中途切断,会产生一个无处可去的电压尖峰。
- 线圈的配对关系要紧,而同一对内部的极性不要紧。电机嗡嗡响却不转,说明配对错了;如果只是转向反了,把其中一对的两根线对调即可。
限流设置——数字
Vref = I_phase × R_sense × 8
在 VMOT 上电、电机断开的情况下,测微调电位器金属螺钉对地的电压。目标是电机额定电流的 70–85%:最后那两成电流换来的扭矩几乎没有,产生的热量却多得多。
| 目标电流 | R_sense = 0.1 Ω(R100) |
R_sense = 0.05 Ω(R050) |
|---|---|---|
| 0.6 A | 0.48 V | 0.24 V |
| 1.0 A | 0.80 V | 0.40 V |
| 1.2 A | 0.96 V | 0.48 V |
| 1.5 A | 1.20 V | 0.60 V |
| 1.7 A | 1.36 V | 0.68 V |
在算之前,先读底边那两个黑色贴片电阻上的丝印。在一块 R050 板上设成 1.2 V,等于要让一台额定 1.7 A 的电机流过 3 A。
要用陶瓷螺丝刀。金属螺丝刀在带电的板子上只要一搭到电位器的别的节点上,就是烧掉驱动芯片的常见方式。
你在物理上设定的,是电机能够输出的峰值扭矩——也就是步进电机正弦律里的 T_peak。设得太低,同样的负载下转子落后得更多、更早失步;设得太高,换来的却是不必要的发热。
微步
| MS1 | MS2 | MS3 | 分辨率 | 每转步数 |
|---|---|---|---|---|
| low | low | low | 整步 | 200 |
| high | low | low | 半步 | 400 |
| low | high | low | 1/4 | 800 |
| high | high | low | 1/8 | 1600 |
| high | high | high | 1/16 | 3200 |
三个都拉高是常规选择。值得说清楚为什么:细分不会让机器在带载时更准——负载造成的误差不会因为你把步子分得更细而改变。它真正做到的是消除转子在每一步上的振鸣,这正是尖叫着响的机器和嗡嗡低鸣的机器之间、表面上看得见步进波纹和看不见之间的区别。
代价是脉冲频率。在 80 步/mm 的轴上用 1/16 细分,要走到 100 mm/s 就需要每秒 8000 个脉冲。Arduino Uno 用位操作翻转来产生步进,大约在每秒 10000–15000 个脉冲时就到头了,这对 400 步/mm 的丝杠轴来说是一个真实的上限。
电流、热和电源预算
A4988 自身的耗散并不算大——真正难受的是热流密度,而不是总瓦数。在 1 A 时每相约 0.5 W,而封装里几乎没有铜箔可供热量扩散。实际中的限制是:
| 散热 | 安全持续电流 |
|---|---|
| 裸片静风 | 约 1.0 A |
| 粘散热片 | 约 1.2 A |
| 散热加动风 | 约 1.5 A |
| 再上 | DRV8825 或 TMC2209 |
热保护不会事先打招呼。驱动器停下,电机在半途停下,驱动器冷却后重新启动,而你观察到的是某个轴“莫名其妙”地丢掉一段位置。如果一个轴在长作业的后半段、或者在较热的房间里更容易出故障,在排除其它原因之前就按过热处理。
在电源这一侧,记住斩波器的行为相当于降压变换器:从 24 V 电源吸取的电流远小于相电流,所以要按功率来做预算,而不是把各相电流加起来。2.8 Ω 绕组、限流 1.2 A 时,每台电机大约耗散 8 W,而且只要通电就在耗散——包括静止不动的时候。见机器人电源预算。
能跑的最小代码
const int STEP_PIN = 3, DIR_PIN = 4, EN_PIN = 5;
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
digitalWrite(EN_PIN, LOW); // active low — energise the coils
digitalWrite(DIR_PIN, HIGH);
}
void loop() {
for (int i = 0; i < 3200; i++) { // one revolution at 1/16
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(2); // datasheet minimum is 1 us
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(300); // this delay is the speed
}
delay(1000);
}
台架测试可以,真机器上不行:步进频率会直接跳到全速,这一旦超过电机的牵入频率,结果就是嗡嗡响却不转动。凡是需要准确到达某个位置的地方,都要用 AccelStepper 或你自己写的运动曲线。你可以在步进模拟器里直接看到这种没有加斜坡的指令对转子做了什么。
实际设多少电流
电机铭牌额定按测试台散热假设——大铝板螺栓固定,25 °C 静风。你的机器暖屋打印支架。
一条好用的经验规则,连同它的推理过程一起给出,而不只是给个数字:
| 情况 | 限流设 | 为什么 |
|---|---|---|
| 扭矩裕量足,要静 | 额定 60–70% | 扭矩线性掉,热平方掉 |
| 常规机器 | 额定 70–85% | 常规答案 |
| 真扭矩受限 | 额定 90–100% | 散热加风才行 |
| 超额定 | 绝不 | 买不到扭矩,只买热 |
低端之所以比看上去更划算,原因就在第二列里。扭矩正比于电流,而发热正比于电流的平方。从 1.7 A 降到 1.2 A,牺牲了 29% 的扭矩,却去掉了一半的发热量:
1.7 A: P = 2 × 1.7² × 2.8 = 16.2 W per motor
1.2 A: P = 2 × 1.2² × 2.8 = 8.1 W per motor
选型算术说用 12% 可用扭矩,丢的 29% 本来没干活。
断电保持扭矩,以及多数作品忽略的那个引脚
ENABLE 这个引脚之所以存在,是因为步进电机只要静止不动,就会持续流过完整的设定电流。这一点和初学者接触过的所有其它电机都不同,并带来一些后果:
// Two energised NEMA 17s at 1.2 A dissipate ~16 W doing nothing at all.
digitalWrite(EN_PIN, HIGH); // active low, so HIGH = coils off
何时用:
- **在 X、Y 轴的两个动作之间。**绘图机或激光龙门在空闲时没有任何理由继续保持位置,而 16 W 的热量在一小时内灌进一个打印框架里,就足以引起问题。
- 绝不要在承重的 Z 轴上这么做,除非机构自锁。T8 丝杠不会反向驱动,所以断电是安全的;而皮带传动的 Z 轴一断电就会掉下来。
- **绝不要在运动中途做。**转子还在转,磁场却没有了,你等于扔掉了位置信息,而且无从得知扔掉了多少。先停下,再禁用。
让人意外的是:断电之后,转子会停在最近的定位点上——也就是完全没有电流时它所处的磁性静止位置——这个位置离它刚才被保持的位置最多可以差一个整步。在 80 步/mm 的皮带轴上,这就是 0.2 mm 的静默位移。所以要么每次禁用之后都重新回零,要么就得接受“空闲时禁用”和“亚零点几毫米精度”这两件事无法兼得。
SLEEP 是更彻底的一档:它连内部稳压器也关掉,耗电从毫安降到微安,但唤醒大约需要 1 ms,而且会把驱动器内部的步进位置复位到起始微步。最后这一点才是陷阱——从 SLEEP 唤醒可能让电机最多偏移一个整步。对几乎所有入门级机器来说,你要的是 ENABLE 这个引脚,而 SLEEP 只需要跳线拉高然后忘了它。
故障排查
| 现象 | 原因 | 解决 |
|---|---|---|
| 纹丝不动 | ENABLE 高或 RESET 悬空 | ENABLE 拉低;RESET 跳 SLEEP |
| 电机振动不转 | 线圈对跨接 | 万用表欧姆重配 |
| 上电即死 | VMOT 上没有大容量电容 | 100 µF 电解电容,贴近引脚 |
| 半路停凉了又走 | 热保护 | 降 Vref;散热加风 |
| 轻载虚丢步 | Vref 太低 | 重测;查采样电阻丝印 |
| 电机尖叫着发烫 | Vref 太高 | 重新计算——R_sense 用对了吗? |
| 只在高速时丢步 | 电源电压太低 | 提高 VMOT;加大电流救不了 |
| 只在加速时丢步 | 斜坡太陡 | 降低加速度,或者提高 Vref |
| 每步巨响 | 整步——MS 脚悬空 | MS1–MS3 拉高 |
| 台架好装框跪 | 限位或 STEP 线拾噪声 | 信号线远离电机线 |
A4988 还是替代?
| 驱动 | 电流 | 微步 | 噪声 | 选它的时机 |
|---|---|---|---|---|
| A4988 | 1 A / 散热后 1.5 A | 1/16 | 听得见 | 便宜、普及、文档充分 |
| DRV8825 | 1.5 A / 散热后 2.2 A | 1/32 | 听得见 | 你需要更大电流或更细的步距 |
| TMC2208 | 约 1.2 A | 1/256 | 接近静音 | 噪声很要紧 |
| TMC2209 | 约 1.7 A | 1/256 | 接近静音 | 噪声要紧,还想要无传感器回零 |
| L298N | 2 A | — | — | 直流电机。无恒流。 |
| TB6612FNG | 1.2 A | — | — | 直流电机,高效 |
L298N、TB6612FNG 行在因为手册都提步进,技术上都转。都不恒流,扭矩零头热量管够。直流电机驱动;驱动轮子用它们。
只要机器要待在你能听见它的地方,TMC 驱动就值回那多花的钱。做的是同一件事,但电流波形更平滑,装了它们的打印机会发出风扇声,而不是电机声。
用在哪
这款驱动器为绘图机项目的两个轴供电,把它正确设置好是精密运动路线图上的一个检查点。完整的接线与 Vref 实操步骤一步步讲清楚了整个流程。
探索关联图谱
用到它的搭建
包含 A4988 步进驱动板 的项目、学习路线和模拟器。
对比
替代方案
问题
A4988 步进驱动板 常见问题
A4988 的 Vref 怎么计算?
Vref 等于你想要的相电流乘以采样电阻阻值,再乘以 8。在采样电阻为 0.1 Ω 的板子上,目标 1.2 A 对应 1.2 × 0.1 × 8 = 0.96 V。测量时板子要通过 VMOT 上电、电机断开,测的是微调电位器滑动端与地之间的电压。关键细节在于采样电阻:载板出厂时要么是标 R100 的 0.1 Ω,要么是标 R050 的 0.05 Ω,用错了阻值,流过电机的电流就正好翻倍。
我的 A4988 为什么热到自动断电?
几乎都是限流设得太高。裸板 A4988 能持续承受约 1 A;加上散热片并有空气流动时,大约能到 1.5 A。超过这个值,它的热保护就会触发,电机在运动途中停下,等芯片冷却后又重新启动——看上去就像随机丢步。请对照你板上实际的采样电阻重新测量 Vref,贴上散热片,再用风扇对着吹。如果你确实需要超过 1.5 A 的电流,那 A4988 就是选错了零件。
A4988 和 DRV8825 有什么区别?
DRV8825 能承受更大的电流(裸板约 1.5 A,散热后 2.2 A),细分可达 1/32 而不是 1/16,电机电压上限也更高,为 45 V。它与 A4988 引脚兼容,可以直接插进同一个插座——但它的 Vref 公式不同,Vref 等于电流乘以 0.5,而且它的微调电位器旋转方向相反。不重新看公式就直接换上去,是烧毁电机的常见方式。
VMOT 上的电容真的必须加吗?
必须。在 VMOT 与地之间、紧贴板子的位置接一个 100 µF 电解电容,是硬性要求,而不只是建议。斩波器以陡峭的脉冲形式吸取电流,如果附近没有大容量电容,电源引线的电感就会把这些脉冲变成电压尖峰,超过芯片 35 V 的上限。那些一上电就烧的板子,通常就是死于这个原因。
MS1、MS2 和 MS3 不接的话会怎样?
它们内部有下拉电阻,所以悬空时选择的是整步——每转 200 步,电机每走一步都会发出清晰可闻的振鸣。把三个引脚都拉高就是 1/16 细分,这也是大多数作品的选择。它并不会让机器在带载时更准,但能消除振鸣,让机器更安静,也能改善加工表面质量。代价是你的单片机每毫米要发出的脉冲数变成原来的十六倍。
A4988 能驱动直流电机或舵机吗?
不能。它是双极步进电机驱动器:它需要两路线圈,并以特定的电流序列来驱动它们。直流电机需要 L298N 或 TB6612FNG 这样的 H 桥;业余舵机只需要 50 Hz 的 PWM 信号,根本不需要驱动器。A4988 的 STEP 和 DIR 接口对这两者都毫无意义。
延伸阅读