Arduino通过TB6560控制步进电机:电机到位后自动返回问题求助
步进电机到达目标角度后自动返回的问题解决
问题根源
核心问题在于Serial.parseInt()的默认行为:当串口监视器没有新输入时,该函数会返回0。你的代码每次loop()循环都会执行angle = Serial.parseInt(),导致电机转到目标角度后,下一次循环因无新输入将angle设为0,触发电机转回0度。此外还有两处细节问题:
currentAngle未初始化,默认值为0但逻辑上需明确初始状态- 0角度处理代码冗余,且整数除法计算
numstep易产生精度丢失
修改方案
- 仅在串口有新数据输入时,才读取并处理目标角度
- 明确初始化
currentAngle为0 - 优化步数计算逻辑,避免整数除法的精度误差
- 移除冗余的0角度判断代码
修改后的代码
// 定义引脚编号 const int stepPin = 3; const int dirPin = 2; const int enPin = 4; int currentAngle = 0; // 初始化当前角度为0 int targetAngle; const float stepPerAngle = 1.8; // 全步模式下每步对应1.8度 void setup() { Serial.begin(9600); // 设置引脚为输出模式 pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(enPin, OUTPUT); digitalWrite(enPin, LOW); // 使能电机驱动 digitalWrite(dirPin, HIGH); } void loop() { // 仅当串口有可用数据时,读取目标角度 if (Serial.available() > 0) { targetAngle = Serial.parseInt(); // 可选:过滤超出合理范围的角度值 if (targetAngle < 0) targetAngle = 0; if (currentAngle != targetAngle) { int angleDiff = abs(targetAngle - currentAngle); // 使用round函数四舍五入,避免整数除法导致的步数误差 int numSteps = round(angleDiff / stepPerAngle); // 设置电机转动方向 digitalWrite(dirPin, currentAngle < targetAngle ? HIGH : LOW); // 执行步进动作 for (int x = 0; x < numSteps; x++) { digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000); } // 更新当前角度为目标角度 currentAngle = targetAngle; // 调试输出 Serial.print("当前角度="); Serial.print(currentAngle); Serial.print(" | 目标角度="); Serial.print(targetAngle); Serial.print(" | 步数="); Serial.println(numSteps); } } delay(100); // 减小循环延迟,提升串口响应速度 }
关键修改说明
- 通过
Serial.available()判断输入,避免无输入时强制将目标角度设为0 - 初始化
currentAngle为0,明确电机初始位置 - 用
round()处理步数计算,解决整数除法的精度丢失问题 - 简化方向判断逻辑,移除冗余的0角度分支
- 降低循环末尾的延迟,提升串口指令的响应效率
内容的提问来源于stack exchange,提问作者Manthan Mehta
相关产品推荐
相关产品推荐

