You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Arduino Uno实现两台步进电机同步同方向转动?

解决Arduino双步进电机同步运转的问题

我之前做项目时也碰到过完全一样的困扰——两台步进电机总是走得不同步,折腾了好一阵才搞定!下面是几个亲测有效的方案,帮你解决这个问题:

1. 抛弃delay(),改用非阻塞的时间控制

最常见的问题就是用了delay()函数,它会阻塞整个程序,导致其中一个电机在等待时另一个完全停住,自然没法同步。换成millis()来控制步进间隔,就能让两个电机的逻辑同时运行。

举个简单的示例代码:

// 定义电机引脚
const int motor1Steps[] = {2, 3, 4, 5};
const int motor2Steps[] = {6, 7, 8, 9};

// 步进序列(四相八拍)
const int stepSequence[8][4] = {
  {1,0,0,1}, {1,0,0,0}, {1,1,0,0}, {0,1,0,0},
  {0,1,1,0}, {0,0,1,0}, {0,0,1,1}, {0,0,0,1}
};

int currentStep = 0;
unsigned long previousMillis = 0;
const long stepInterval = 5; // 步进间隔(毫秒)

void setup() {
  // 初始化引脚为输出
  for(int i=0; i<4; i++){
    pinMode(motor1Steps[i], OUTPUT);
    pinMode(motor2Steps[i], OUTPUT);
  }
}

void loop() {
  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis >= stepInterval){
    previousMillis = currentMillis;
    
    // 同时驱动两个电机走一步
    setMotorPins(motor1Steps, currentStep);
    setMotorPins(motor2Steps, currentStep);
    
    currentStep++;
    if(currentStep >= 8){
      currentStep = 0;
    }
  }
}

// 设置电机引脚电平的辅助函数
void setMotorPins(const int pins[], int step){
  for(int i=0; i<4; i++){
    digitalWrite(pins[i], stepSequence[step][i]);
  }
}

这个代码里,我们用millis()来计时,每次到了步进间隔就同时给两个电机发送步进信号,确保它们同步动作。

2. 使用专业的步进电机库(比如AccelStepper)

如果项目需要更复杂的控制(比如加速、减速、定位),用AccelStepper库会更省心,它天生支持多电机同步,因为库的run()方法是非阻塞的。

示例代码:

#include <AccelStepper.h>

// 定义两个电机,用四相驱动模式
AccelStepper motor1(AccelStepper::FULL4WIRE, 2, 3, 4, 5);
AccelStepper motor2(AccelStepper::FULL4WIRE, 6, 7, 8, 9);

void setup() {
  // 设置两个电机的最大速度和加速度
  motor1.setMaxSpeed(1000);
  motor1.setAcceleration(500);
  motor2.setMaxSpeed(1000);
  motor2.setAcceleration(500);
  
  // 设置相同的目标位置(比如转1000步)
  motor1.moveTo(1000);
  motor2.moveTo(1000);
}

void loop() {
  // 同时运行两个电机,库会自动处理同步
  motor1.run();
  motor2.run();
  
  // 如果到达目标位置,可以重置继续转
  if(!motor1.isRunning() && !motor2.isRunning()){
    motor1.moveTo(motor1.currentPosition() + 1000);
    motor2.moveTo(motor2.currentPosition() + 1000);
  }
}

只要给两个电机设置相同的速度、加速度和目标位置,调用run()就能让它们完美同步,库会在后台处理每个电机的步进时机。

3. 容易忽略的硬件细节

除了代码,硬件问题也会导致不同步:

  • 电源供应要足够:两个步进电机的电流需求不小,用弱电源会导致丢步,建议用单独的电机电源(比如12V 2A以上),不要直接用Arduino的5V引脚供电。
  • 电机参数要一致:确保两台电机的步距角、细分设置(如果用驱动器的话)完全相同,不然即使代码同步,物理上也会走得不一样快。
  • 接线要牢固:松动的接线可能导致信号丢失,出现丢步情况,检查所有引脚连接是否可靠。

内容的提问来源于stack exchange,提问作者Guillermo Garrido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:01:53