A4988接Arduino驱动NEMA17:从接线到步数控制

2026-11-09 20:16:45 19阅读

玩 Arduino 的人几乎都绕不开步进电机,但一提驱动方案,很多人第一反应还是 ULN2003 加 28BYJ-48 那套大黄板。先把话说清楚:ULN2003 只是达林顿阵列,本质上是把线圈按节拍接通断开,连细分都谈不上,带 28BYJ-48 这种减速齿轮的小电机凑合,真上 NEMA17 这种体格的,它根本扛不住相电流。今天这篇只讲一个东西——A4988 驱动板怎么接 Arduino,从接线、限流一路讲到用代码控制步数和转速,全程围绕 NEMA17 展开。

A4988 到底强在哪

A4988 是 Allegro 出的一体化步进驱动芯片,板子上那颗黑色芯片就是它。参数先摆正:电机侧供电 8 到 35V,每相连续电流 1A,加散热片后峰值可以顶到 2A,细分支持全步、1/2、1/4、1/8 一直到 1/16。这些数字以官方 datasheet 为准,别听人随口说"支持3A"。它最省心的地方是内置了译码器,你只需要给 STEP 和 DIR 两个信号:STEP 来一个脉冲走一步,DIR 决定方向,Arduino 侧两个普通 IO 就够了,不用像 ULN2003 那样自己写四相八拍的时序表。芯片还带了欠压、短路、过流和过热关断保护,接反电源炸板之前它还有机会先躺平。

A4988 步进电机驱动板特写

引脚看明白再动手

板子两侧共 16 个引脚。逻辑侧:VDD 接 3 到 5.5V,给芯片内部逻辑供电;MS1/MS2/MS3 是细分选择,内部下拉,悬空就是全步;RST 和 SLP 都是低电平有效,出厂默认悬空会复位,所以必须拿焊锡或者杜邦线把 RST 和 SLP 短接起来,这一步漏了电机死活不动,是新手第一大坑。EN 也是低电平有效,悬空默认使能。STEP 和 DIR 千万别悬空。功率侧:VMOT 接 8 到 35V 电机电源,1A/1B 和 2A/2B 分别接电机两组线圈。重点记一条:VMOT 对地必须并一颗至少 47uF 的电解电容,电机绕组是感性负载,线一长电源一抖,LC 尖峰电压能直接把芯片打穿,这颗电容是保命用的。

A4988 驱动板引脚图,含 EN、MS1-MS3、RST、SLP、STEP、DIR 与功率侧引脚

NEMA17 接线全流程

按顺序来:第一步接 VMOT 和 GND,记得并上 47uF 电容,注意电解电容极性;第二步 VDD 接 Arduino 的 5V,GND 共地;第三步 STEP 接 D3,DIR 接 D2;第四步 MS1 到 MS3 先悬空,跑全步;第五步短接 RST 和 SLP;第六步把电机四根线接到 1A/1B/2A/2B。NEMA17 一般是四根线两两组线圈,怎么分?两个办法:用手转电机轴,把任意两根线短接,如果明显变涩变沉,这两根就是同一组线圈;或者万用表打到通断挡,响的那对就是一组。接错了线圈组顶多是抖动不出力,不会烧,放心试。

NEMA17 步进电机经 A4988 与 Arduino Uno 的完整接线图

限流必须先设好

这一节是老玩家最想嘱咐的。A4988 出厂电位器位置是随机的,直接上电跑,限流可能远超你电机的额定电流,电机和驱动板一起烫手;设小了又没劲。推荐用 Vref 法:先看板上两颗贴片采样电阻的丝印,R100 表示 0.1 欧,R050 表示 0.05 欧,然后套公式 Vref = 限流值 × 8 × 采样电阻阻值。比如采样电阻 0.1 欧、想要 1A 限流,就把 Vref 调到 0.8V。测量方法是万用表打 DC 电压挡,表笔接地,红笔顶在电位器金属螺帽上读数,小螺丝刀慢慢拧。调完后别忘了:全步模式下电流表测出来的是限流的 70% 左右,细分跑起来实际电流还能再上去一些,所以 Vref 别顶格设。另外板子不装散热片时每相按 1A 用比较稳,要往 2A 逼近就必须贴散热片加风道,板子小热容也小,别拿它跟大驱动比。

用万用表测量 A4988 电位器 Vref 电压来设定限流

步数控制:先裸跑再看 AccelStepper

NEMA17 常见规格是步距角 1.8 度,一圈 200 步。下面这段不依赖任何库,STEP 和 DIR 分别接 D3、D2,直接控制转一圈、换向、再加速转一圈:

const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  digitalWrite(dirPin, HIGH);              // clockwise, slow
  for (int x = 0; x < stepsPerRevolution; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
  }
  delay(1000);

  digitalWrite(dirPin, LOW);               // CCW, fast (2x)
  for (int x = 0; x < stepsPerRevolution; x++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  delay(1000);
}

逻辑很直白:给多少个脉冲就走多少步,脉冲间隔越短转速越快。想转半圈就把循环上限改成 100,想转 90 度就是 50 步,步数就是你的位置语言。

裸跑的问题是起步就是全速,快了容易失步。上 AccelStepper 库做梯形加减速才是正经玩法,库管理器里搜 accelstepper 装上,接口类型填 1(STEP/DIR 驱动器模式):

#include "AccelStepper.h"

const int dirPin = 2;
const int stepPin = 3;
#define motorInterfaceType 1

AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  myStepper.setMaxSpeed(1000);
  myStepper.setAcceleration(50);
  myStepper.setSpeed(200);
  myStepper.moveTo(200);
}

void loop() {
  if (myStepper.distanceToGo() == 0)
    myStepper.moveTo(-myStepper.currentPosition());
  myStepper.run();
}

注意 run() 必须在 loop 里反复调用,库靠它按时间表发脉冲,漏掉电机就纹丝不动。这段代码让电机带加减速地在两个位置之间来回扫。

最后来个进阶:两路 A4988 同时驱动两台 NEMA17,第二块板 STEP 接 D5、DIR 接 D4,其余照旧:

#include "AccelStepper.h"
#define motorInterfaceType 1

AccelStepper stepper1(motorInterfaceType, 3, 2);
AccelStepper stepper2(motorInterfaceType, 5, 4);

void setup() {
  stepper1.setMaxSpeed(1000);
  stepper1.setAcceleration(50);
  stepper1.setSpeed(200);
  stepper1.moveTo(200);

  stepper2.setMaxSpeed(1000);
  stepper2.setAcceleration(50);
  stepper2.setSpeed(200);
  stepper2.moveTo(-200);
}

void loop() {
  if (stepper1.distanceToGo() == 0)
    stepper1.moveTo(-stepper1.currentPosition());
  if (stepper2.distanceToGo() == 0)
    stepper2.moveTo(-stepper2.currentPosition());

  stepper1.run();
  stepper2.run();
}

两块 A4988 驱动两个步进电机同时工作的接线图

到这里接线、限流、步数控制三件事就齐了。回头再总结一遍口诀:RST 短接 SLP、VMOT 并大电容、限流先于上电、run() 常驻 loop。把这四条刻进肌肉记忆,A4988 基本不会翻车。想上 1/16 细分的,把 MS1 到 MS3 全部拉高就行,电机噪声和低频抖动会明显改善,代价是脉冲频率也要跟着翻 16 倍,这点自己权衡。


作者:舵机老炮
链接:https://www.aiddithome.com/p/10089c904c0d6e.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
好说好说
1楼 · 3小时前

双电机那个例子正好用得上,我在装个简单画图机,两个轴同方向反向扫的代码直接抄了,感谢楼主。

触底反弹的Tony
2楼 · 3小时前

请教下楼主,细分拉到1/16之后,AccelStepper的setMaxSpeed是不是也得按比例改?我之前调高细分感觉转速明显上不去,一直没搞明白是不是脉冲频率顶到瓶颈了。

胶佬憨憨
3楼 · 3小时前

RST和SLP短接这个坑我也踩过,当时电机就是不转,排查了一晚上接线,结果就是漏了这一步。建议新手把这条打印出来贴墙上。

只看不说话
4楼 · 3小时前

说到发热,我那块A4988不装散热片跑1A,半小时摸上去已经能煎蛋了,后来贴了散热片加了个小风扇才稳住。楼主说的限流先于上电是真的重要,我吃过亏。

线比代码多
5楼 · 3小时前

Vref公式收藏了,R100的板子1A限流调0.8V,跟我以前用的参数对得上。万用表笔顶电位器螺帽那个位置我之前一直量错,量到了旁边的电容上,哈哈。