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

