Arduino控制Nema 17步进电机异常:第一台持续自转排查求助
问题分析与修复方案
1. 按钮电平判断逻辑完全颠倒
你使用了INPUT_PULLUP模式,这种模式下按钮未按下时引脚输出高电平(HIGH),按下时输出低电平(LOW)。但你的代码里判断button_condX == HIGH就执行电机动作,等于没按按钮时程序会持续触发第一台电机转动,这是电机持续自转的核心原因。
2. forward函数的使能引脚写错
控制第一台电机的forward()函数末尾,你误写了digitalWrite(ENAPIN2,HIGH);,这里应该操作第一台电机的使能引脚ENAPIN1。错误的引脚操作导致第一台电机始终处于激活状态(使能引脚为LOW),即使步进动作完成,电机也不会被禁用。
3. 额外优化建议
- 给按钮变量起更清晰的名字,比如
BTN_LOOP1代替Button,提升代码可读性 - 初始化时直接禁用两台电机,避免上电后电机误动
- 提前声明函数,避免编译警告
修正后的完整代码
#define STEPPIN1 13 #define STEPPIN2 10 #define DIRPIN1 12 #define DIRPIN2 9 #define ENAPIN1 11 #define ENAPIN2 8 // 按钮引脚定义,命名更清晰 #define BTN_LOOP1 4 #define BTN_LOOP2 5 #define BTN_LOOP3 6 #define BTN_LOOP4 7 #define BTN_M2_1 3 #define BTN_M2_2 2 // 提前声明forwardLoop函数,避免编译警告 void forwardLoop(int loops); void setup() { pinMode(STEPPIN1, OUTPUT); pinMode(STEPPIN2, OUTPUT); pinMode(DIRPIN1, OUTPUT); pinMode(DIRPIN2, OUTPUT); pinMode(ENAPIN1, OUTPUT); pinMode(ENAPIN2, OUTPUT); // 初始化所有按钮为上拉输入 pinMode(BTN_LOOP1, INPUT_PULLUP); pinMode(BTN_LOOP2, INPUT_PULLUP); pinMode(BTN_LOOP3, INPUT_PULLUP); pinMode(BTN_LOOP4, INPUT_PULLUP); pinMode(BTN_M2_1, INPUT_PULLUP); pinMode(BTN_M2_2, INPUT_PULLUP); // 初始状态禁用两台电机 digitalWrite(ENAPIN1, HIGH); digitalWrite(ENAPIN2, HIGH); } void loop() { // 读取按钮状态:未按下为HIGH,按下为LOW bool btn1Pressed = (digitalRead(BTN_LOOP1) == LOW); bool btn2Pressed = (digitalRead(BTN_LOOP2) == LOW); bool btn3Pressed = (digitalRead(BTN_LOOP3) == LOW); bool btn4Pressed = (digitalRead(BTN_LOOP4) == LOW); bool btn5Pressed = (digitalRead(BTN_M2_1) == LOW); bool btn6Pressed = (digitalRead(BTN_M2_2) == LOW); // 按钮按下时执行对应动作,用独立if避免互斥 if (btn1Pressed) forwardLoop(1); if (btn2Pressed) forwardLoop(1); if (btn3Pressed) forwardLoop(1); if (btn4Pressed) forwardLoop(1); if (btn5Pressed) forward2(1); if (btn6Pressed) forward2(1); } void forward(int steps){ digitalWrite(ENAPIN1, LOW); // 激活第一台电机 digitalWrite(DIRPIN1, HIGH); // 设置正向转动 for(int i=0; i<steps; i++){ digitalWrite(STEPPIN1, !digitalRead(STEPPIN1)); delay(1); } digitalWrite(ENAPIN1, HIGH); // 禁用第一台电机,修正引脚错误 } void forward2(int steps){ digitalWrite(ENAPIN2, LOW); // 激活第二台电机 digitalWrite(DIRPIN2, HIGH); // 设置正向转动 for(int i=0; i<steps; i++){ digitalWrite(STEPPIN2, !digitalRead(STEPPIN2)); delay(1); } digitalWrite(ENAPIN2, HIGH); // 禁用第二台电机 } void forwardLoop(int loops){ for(int j=0 ; j < loops ; j++){ forward(1); delay(10); } }
内容的提问来源于stack exchange,提问作者Dylan Bowen
相关产品推荐
相关产品推荐

