Arduino 控制步进电机完全指南:从原理到多电机协同
本教程系统讲解 Arduino 控制步进电机的全知识体系,涵盖 NEMA17 电机搭配 A4988、DRV8825、TMC2208 三款主流驱动器的接线、电流设置、编程(含裸代码与 AccelStepper 库)、多电机协同及 CNC 扩展板应用。该组合广泛用于 3D 打印、CNC、机器人、自动化设备等需精准位控的场景,笔者多个项目(DIY 滑轨、线材成型、泡沫切割、激光雕刻、自动换笔绘图仪、SCARA 机械臂)均基于此栈。
步进电机原理速览
步进电机是无刷直流电机的一种,无需反馈即可精准控制位置。工作原理基于磁场:定子线圈通电产生磁场吸引/排斥永磁转子。按特定顺序逐相励磁,转子即可连续旋转或精准定位于任意步距——故称“步进”电机。增加转子磁极数可提升分辨率。典型 NEMA17 转子 50 齿,定子两相四向励磁,合成 200 步/圈(1.8°/步)。四线对应两相,电流双向驱动产生四种磁场朝向。5/6/8 线电机本质仍为两相,接法不同可换取扭矩/速度特性。驱动器核心是两个 H 桥,实现两相双向励磁,并提供细分、限流等功能。
NEMA17 + A4988 + Arduino 实战接线与编程
硬件连接
- VMOT/GND: 电机电源 8-36V,建议并联 ≥47μF 电解电容抑制尖峰。
- 1A/1B、2A/2B: 两相绕组。识别同相线圈:手转轴短接两线,阻力增大即为同相;或万用表通断测试。
- VDD/GND: 逻辑电源 3-5V。
- STEP/DIR: 接 Arduino 任意 GPIO。DIR 控制方向,STEP 每个脉冲推进一步。
- SLEEP/RST: 低电平有效。默认 SLEEP 高、RST 悬空,直连两脚即可使能(不使用睡眠/复位功能时)。
- ENABLE: 低电平有效,悬空即使能。
- MS1/MS2/MS3: 细分选择,内部下拉,悬空为全步模式。按真值表接 5V 选 1/2/4/8/16 细分。16 细分下 NEMA17 达 3200 步/圈(0.1125°/步)。
电流限制设置(关键步骤)
必须将驱动器限流设定 低于电机额定电流,否则过热。A4988 板载微调电位器顺时针增大限流。两种校准法:
- 测参考电压 Vref: 万用表测电位器中点对 GND 电压,套公式 I_limit = Vref / (8 × Rcs)。Rcs 为板载取样电阻阻值(常见 0.05/0.1/0.2Ω,丝印 R100 表 0.1Ω)。例:Vref=0.7V → 0.875A;目标 1A → 调 Vref 至 0.8V。
- 实测线圈电流: 接好电机,STEP/DIR 接 5V 保持全步锁定,MS 悬空。断开一相串联安培表,上电读数 ×1.3(全步模式仅达限流 70%)= 实际限流值。
两法结果一致,推荐法一更便捷。
Arduino 裸代码控制示例
示例 1:基础正反转
/* Basic stepper control without library
* by Dejan, https://howtomechatronics.com */
#define stepPin 2
#define dirPin 5
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
digitalWrite(dirPin, HIGH); // 方向 1
for (int x = 0; x < 800; x++) { // 800 脉冲 = 1 圈(16 细分)
digitalWrite(stepPin, HIGH);
delayMicroseconds(700); // 调整延时改变转速
digitalWrite(stepPin, LOW);
delayMicroseconds(700);
}
delay(1000);
digitalWrite(dirPin, LOW); // 方向 2
for (int x = 0; x < 1600; x++) { // 2 圈
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
}
解析: 定义 STEP/DIR 引脚为输出。循环中先置方向,再用 for 循环发脉冲。脉冲间延时决定转速:延时越短转速越快。细分模式改变时,相同脉冲数对应角度不同(如 1/4 细分下 800 脉冲仅 90°)。
示例 2:电位器调速
/* Potentiometer speed control */
#define stepPin 2
#define dirPin 5
int customDelay, customDelayMapped;
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
speedControl();
digitalWrite(stepPin, HIGH);
delayMicroseconds(customDelayMapped);
digitalWrite(stepPin, LOW);
delayMicroseconds(customDelayMapped);
}
void speedControl() {
customDelay = analogRead(A0); // 0-1023
customDelayMapped = map(customDelay, 0, 1023, 300, 3000); // 映射为 300-3000 μs
}
解析: 读取电位器 ADC 值,映射为 STEP 脉冲间延时。实测 300 μs 以下易失步。裸代码适合简单场景,复杂控制建议用库。
AccelStepper 库进阶控制
Mike McCauley 的 AccelStepper 是 Arduino 步进控制标准库,支持速度/加减速、目标位置、多电机并发等。笔者多个项目(滑轨、成型机、SCARA)均基于此库。安装:IDE 库管理器搜 “AccelStepper” 安装。
示例:电位器调速(含加减速)
#include
AccelStepper stepper1(1, 2, 5); // 驱动类型 1=两线 STEP/DIR
void setup() {
stepper1.setMaxSpeed(1000); // 最大速度 1000 步/秒(文档建议 ≤1000)
}
void loop() {
stepper1.setSpeed(analogRead(A0)); // 电位器设速
stepper1.runSpeed(); // 持续运行
}
负值即反向。runSpeed() 需高频调用维持恒速。
示例:双电机加减速定位
#include
AccelStepper stepper1(1, 2, 5);
AccelStepper stepper2(1, 3, 6);
void setup() {
stepper1.setMaxSpeed(1000); stepper1.setAcceleration(500); stepper1.setCurrentPosition(0);
stepper2.setMaxSpeed(1000); stepper2.setAcceleration(500); stepper2.setCurrentPosition(0);
}
void loop() {
stepper1.moveTo(800); stepper1.runToPosition(); // 阻塞式移动至 800 步(1/4 细分=1 圈)
stepper2.moveTo(1600); stepper2.runToPosition(); // 阻塞式移动 2 圈
// 非阻塞同步回零
stepper1.moveTo(0); stepper2.moveTo(0);
while (stepper1.currentPosition() != 0 || stepper2.currentPosition() != 0) {
stepper1.run(); // 非阻塞单步推进
stepper2.run();
}
}
runToPosition() 阻塞至到位;run() 非阻塞,需高频轮询。while 循环中可穿插其他任务。
示例:MultiStepper 多电机同步到位
#include
#include
AccelStepper stepper1(1, 2, 5);
AccelStepper stepper2(1, 3, 6);
AccelStepper stepper3(1, 4, 7);
MultiStepper steppersControl;
long gotoposition[3];
void setup() {
stepper1.setMaxSpeed(1000);
stepper2.setMaxSpeed(1000);
stepper3.setMaxSpeed(1000);
steppersControl.addStepper(stepper1);
steppersControl.addStepper(stepper2);
steppersControl.addStepper(stepper3);
}
void loop() {
gotoposition[0] = 800; // 1 圈
gotoposition[1] = 1600; // 2 圈
gotoposition[2] = 3200; // 3 圈
steppersControl.moveTo(gotoposition); // 计算同步到位所需速度
steppersControl.runSpeedToPosition(); // 阻塞式同步运行
delay(1000);
gotoposition[0] = gotoposition[1] = gotoposition[2] = 0;
steppersControl.moveTo(gotoposition);
steppersControl.runSpeedToPosition();
delay(1000);
}
MultiStepper 计算各电机速度使其同时到达目标位置。注意:不支持加减速。非阻塞需自行用 run() 轮询。
Arduino CNC Shield:多电机项目的紧凑方案
CNC Shield 叠加于 Arduino UNO,可驱动 4 路步进电机,保留其余 GPIO。笔者用其驱动 4 轴 SCARA 机械臂。后续将补充详细用法。
DRV8825 vs A4988
DRV8825 (TI) 可直接替换 A4988 (Allegro),引脚兼容。三大升级:
- 无额外散热下连续电流 1.5A(A4988 1A);
- 最大供电电压 45V(A4988 35V);
- 细分高达 32(A4988 16),运行更平滑安静。
次要差异:电位器位置不同、Vref-电流公式变为 I_limit = Vref × 2、无 VDD 引脚(改为 FAULT 输出,可直接 5V)。替换时务必确认方向,电位器位置相反易装反。细分选择见数据手册真值表。总体 DRV8825 综合性能优于 A4988。
TMC2208:静音王者
Trinamic (德国) 出品,内置 256 细分插值单元,无论 MS 引脚选 2/4/8/16 细分,内部均输出 256 微步正弦波驱动,配合 StealthChop2 静音技术,实现极致安静运行。
噪声对比: A4988 ~65dB、DRV8825 ~67dB、TMC2208 ~41dB。
额定 1.2A/峰值 2A。限流公式:I_limit = Vref × 0.71(测 Vref 点在 EN 引脚旁)。引脚差异:仅两个 MS 引脚、EN 需接 GND 使能。编程方式同前两款。
进阶特性:UART 单线控制、更丰富调参。价格较高,若不追求静音与高阶功能,A4988/DRV8825 仍是高性价比之选。
结语
NEMA17 与 A4988/DRV8825/TMC2208 组成极具通用性的位控栈,支撑无数创意项目。进阶学习可参考笔者其他 Arduino 项目。后续将出 NEMA23/34 大扭矩电机专题教程。希望本指南助您入门并深入,欢迎订阅、评论提问!
制造工艺
- 先进无损检测技术:保障材料完整性的关键手段
- 金属铸造工艺:从液态金属到成品零件
- HIsmelt熔融还原炼铁:直炼液态铁水的颠覆性技术路径
- 用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
- Consteel 电弧炉工艺:专利节能废钢预热技术深度解析
- 黑胶唱片LP制作的艺术与工艺
- CNC 倒扣/凹槽加工专家指南:刀具、工艺与设计避坑
- Arduino 步进电机自动刷 Tinder/Bumble:小时 800+ 次滑动神器
- Arduino OpenTherm 智能供暖控制:实现中央供暖系统的监控与自动化
- 开果器:历史、工艺与现代创新
- 精密车削零件:定义、工艺流程与应用领域
- 基于 Arduino、Yaler 与 IFTTT 构建 Web 化 IoT 仪表盘