亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 控制步进电机完全指南:从原理到多电机协同

本教程系统讲解 Arduino 控制步进电机的全知识体系,涵盖 NEMA17 电机搭配 A4988、DRV8825、TMC2208 三款主流驱动器的接线、电流设置、编程(含裸代码与 AccelStepper 库)、多电机协同及 CNC 扩展板应用。该组合广泛用于 3D 打印、CNC、机器人、自动化设备等需精准位控的场景,笔者多个项目(DIY 滑轨、线材成型、泡沫切割、激光雕刻、自动换笔绘图仪、SCARA 机械臂)均基于此栈。

步进电机原理速览

步进电机是无刷直流电机的一种,无需反馈即可精准控制位置。工作原理基于磁场:定子线圈通电产生磁场吸引/排斥永磁转子。按特定顺序逐相励磁,转子即可连续旋转或精准定位于任意步距——故称“步进”电机。增加转子磁极数可提升分辨率。典型 NEMA17 转子 50 齿,定子两相四向励磁,合成 200 步/圈(1.8°/步)。四线对应两相,电流双向驱动产生四种磁场朝向。5/6/8 线电机本质仍为两相,接法不同可换取扭矩/速度特性。驱动器核心是两个 H 桥,实现两相双向励磁,并提供细分、限流等功能。

NEMA17 + A4988 + Arduino 实战接线与编程

硬件连接

电流限制设置(关键步骤)

必须将驱动器限流设定 低于电机额定电流,否则过热。A4988 板载微调电位器顺时针增大限流。两种校准法:

  1. 测参考电压 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。
  2. 实测线圈电流: 接好电机,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),引脚兼容。三大升级:

次要差异:电位器位置不同、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 大扭矩电机专题教程。希望本指南助您入门并深入,欢迎订阅、评论提问!

制造工艺

  1. 先进无损检测技术:保障材料完整性的关键手段
  2. 金属铸造工艺:从液态金属到成品零件
  3. HIsmelt熔融还原炼铁:直炼液态铁水的颠覆性技术路径
  4. 用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
  5. Consteel 电弧炉工艺:专利节能废钢预热技术深度解析
  6. 黑胶唱片LP制作的艺术与工艺
  7. CNC 倒扣/凹槽加工专家指南:刀具、工艺与设计避坑
  8. Arduino 步进电机自动刷 Tinder/Bumble:小时 800+ 次滑动神器
  9. Arduino OpenTherm 智能供暖控制:实现中央供暖系统的监控与自动化
  10. 开果器:历史、工艺与现代创新
  11. 精密车削零件:定义、工艺流程与应用领域
  12. 基于 Arduino、Yaler 与 IFTTT 构建 Web 化 IoT 仪表盘