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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:54:24