Accel库驱动Redrex步进电机实现往返运动时运行异常问题咨询
步进电机异常问题修复方案
以下基于常用的AccelStepper步进电机驱动库排查:
现有代码核心错误
- 对
runSpeedToPosition()方法的行为理解错误:该方法单次调用仅控制电机执行1步动作,不会自动阻塞到电机走完所有目标步数,你代码中仅调用1次该方法,自然只能移动少量步数就停止。 - 到达目标位置的判断逻辑错误:
stepperT.targetPosition() == 100仅能验证你是否给电机设置了目标位置100,只要执行过moveTo(100)该条件就永久成立,和电机实际位置无关。正确的到达判定应使用stepperT.distanceToGo() == 0,返回值为0时代表电机已经到达预设目标位置。 - 循环逻辑失效:while循环末尾添加的
break会导致第一次循环执行完直接跳出,没有重复调用驱动方法让电机走完全程。
修复后的实现代码
// 收到字符'c'触发动作 if (input_m == 'c') { stepperM.stop(); // 第一阶段:移动到位置100 stepperT.moveTo(100); stepperT.setSpeed(200); while (stepperT.distanceToGo() != 0) { stepperT.runSpeedToPosition(); } // 第二阶段:返回初始位置0 stepperT.moveTo(0); stepperT.setSpeed(200); while (stepperT.distanceToGo() != 0) { stepperT.runSpeedToPosition(); } input_m = '0'; Serial.println("Finish"); }
额外注意
如果你的项目还有其他需要并行执行的任务,不建议使用上述阻塞式while循环。可以改用状态机实现,将电机运行状态分为待触发、移动到100、返回原点三个状态,在loop主循环中每次调用一次
runSpeedToPosition(),根据到达状态切换阶段即可,不会阻塞其他任务运行。
内容的提问来源于stack exchange,提问作者Nadim Seif
相关产品推荐
相关产品推荐

