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

Arduino步进电机正反转控制问题求助:后退失效、连续动作逻辑异常

问题原因及修正方案

1. 核心错误点梳理

  • 反转功能失效原因:Arduino Stepper库的step()函数通过参数的正负控制转动方向,正数为正转、负数为反转。你当前Backward()和Continuous()的反转阶段都给step()传入了正数值1,所以电机只会一直正转。
  • Continuous()函数异常原因:
    1. C语言不支持50 < stepCount <= 200这种连续比较写法,实际运行时会先判断50 < stepCount得到布尔值(0或1),再判断布尔值是否<=200,导致条件永远为真进入死循环
    2. 第二个while循环内部重复声明了局部变量stepCount,每次循环都会将其重置为0,所以计数永远显示1
    3. 反转阶段仍然传入正的步数参数,无法实现后退

2. 修正后的完整代码

#include <Stepper.h>

int forward_button = 2;
int backward_button = 3;
int cont_button = 4;

int button_cond1;
int button_cond2;
int button_cond3;

int del = 50;
const int stepsPerRevolution = 200;

// 初始化步进电机引脚
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void Forward() { 
  int stepCount = 0; 
  while (stepCount < 50) {
    myStepper.step(1);
    stepCount++;
    delay(del);
    Serial.print("Forward steps :");
    Serial.println(stepCount);
  }
}

void Backward() { 
   int stepCount = 0;
   while (stepCount < 50) {
    myStepper.step(-1); // 传入负数实现反转
    stepCount++;
    delay(del);
    Serial.print("Backward steps :");
    Serial.println(stepCount);
  }
}

void Continuous() {  
  int stepCount = 0; 
  // 正转50步
  while (stepCount < 50) {
    myStepper.step(1);
    stepCount++;
    delay(del);
    Serial.print("Continuous forward steps :");
    Serial.println(stepCount);
  }
  // 反转50步
  stepCount = 0;
  while (stepCount < 50) {
    myStepper.step(-1);
    stepCount++;
    delay(del);
    Serial.print("Continuous backward steps :");
    Serial.println(stepCount);
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(forward_button, INPUT_PULLUP);
  pinMode(backward_button, INPUT_PULLUP);
  pinMode(cont_button, INPUT_PULLUP);
  myStepper.setSpeed(60); // 开启转速设置,保证电机运行稳定
}

void loop() {
  button_cond1 = digitalRead(forward_button);
  button_cond2 = digitalRead(backward_button);
  button_cond3 = digitalRead(cont_button);

  if ((button_cond1 == LOW) && (button_cond2 == HIGH) && (button_cond3 == HIGH))  {
    Forward();
  }
  else if ((button_cond1 == HIGH) && (button_cond2 == LOW) && (button_cond3 == HIGH))  {
    Backward();
  }
  else if ((button_cond1 == HIGH) && (button_cond2 == HIGH) && (button_cond3 == LOW))  {
    Continuous();
  } 
}

3. 补充说明

如果按键按下时有触发多次的情况,可以在按键判断逻辑里增加消抖处理,比如按下后延迟20ms再读取一次按键状态确认。

内容的提问来源于stack exchange,提问作者Meryem Çiftçi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:18:00