麦克纳姆轮小车360°右旋方向异常问题求助
麦克纳姆轮小车右旋360°反向旋转的问题排查与修复
问题描述
操控搭载4台电机与L298N驱动板的麦克纳姆轮小车时,除右旋360°操作会导致小车反向旋转外,其余方向(如前进)运行均正常。尝试通过子程序实现右旋功能失败,移至主程序调试仍未解决,且单侧车轮反向转动时控制逻辑存在偏差。
相关代码
with MicroBit.IOs; with MicroBit; with movement; procedure Main is Speed : constant MicroBit.IOs.Analog_Value := 1023; --between 0 and 1023 Forward : constant Boolean := True; -- forward is true, backward is false begin -- We set the frequency by setting the period (remember f=1/t). MicroBit.IOs.Set_Analog_Period_Us(20000); -- 50 Hz = 1/50 = 0.02s = 20 ms = 20000us --LEFT --front MicroBit.IOs.Set(6, Forward); --IN1 MicroBit.IOs.Set(7, not Forward); --IN2 --back MicroBit.IOs.Set(2, Forward); --IN3 MicroBit.IOs.Set(3, not Forward); --IN4 --RIGHT --front MicroBit.IOs.Set(12, not Forward); --IN1 MicroBit.IOs.Set(13, Forward); --IN2 --back MicroBit.IOs.Set(14, not Forward); --IN3 MicroBit.IOs.Set(15, Forward); --IN4 MicroBit.IOs.Write (0, Speed); --left speed control ENA ENB MicroBit.IOs.Write (1, Speed); --right speed control ENA ENB loop null; end loop; end Main;
问题分析
从前进功能正常的逻辑可以推断:右侧车轮的物理安装方向与左侧相反——右侧电机通过IN1=not Forward, IN2=Forward实现前进(即电机反转对应前进)。而原地右旋(顺时针旋转)的核心逻辑是左侧车轮保持前进方向,右侧车轮切换为后退方向,但当前代码中右侧车轮的引脚状态与前进时完全一致,导致右侧仍保持前进,最终小车反向旋转(左旋)。
修复方案
调整右侧车轮的控制引脚状态,使其切换为后退方向(与左侧车轮引脚状态一致):
procedure Main is Speed : constant MicroBit.IOs.Analog_Value := 1023; Forward : constant Boolean := True; begin MicroBit.IOs.Set_Analog_Period_Us(20000); --LEFT 保持前进方向 MicroBit.IOs.Set(6, Forward); MicroBit.IOs.Set(7, not Forward); MicroBit.IOs.Set(2, Forward); MicroBit.IOs.Set(3, not Forward); --RIGHT 切换为后退方向(修正右旋逻辑) MicroBit.IOs.Set(12, Forward); -- IN1 改为 Forward MicroBit.IOs.Set(13, not Forward);-- IN2 改为 not Forward MicroBit.IOs.Set(14, Forward); -- IN3 改为 Forward MicroBit.IOs.Set(15, not Forward);-- IN4 改为 not Forward MicroBit.IOs.Write(0, Speed); MicroBit.IOs.Write(1, Speed); loop null; end loop; end Main;
优化建议
将不同运动模式封装为独立子程序,便于维护和调试:
with MicroBit.IOs; with MicroBit; package Movement is procedure Move_Forward(Speed : MicroBit.IOs.Analog_Value); procedure Rotate_Right(Speed : MicroBit.IOs.Analog_Value); end Movement; package body Movement is Forward : constant Boolean := True; procedure Move_Forward(Speed : MicroBit.IOs.Analog_Value) is begin -- LEFT 前进 MicroBit.IOs.Set(6, Forward); MicroBit.IOs.Set(7, not Forward); MicroBit.IOs.Set(2, Forward); MicroBit.IOs.Set(3, not Forward); -- RIGHT 前进(与物理安装匹配的反向) MicroBit.IOs.Set(12, not Forward); MicroBit.IOs.Set(13, Forward); MicroBit.IOs.Set(14, not Forward); MicroBit.IOs.Set(15, Forward); MicroBit.IOs.Write(0, Speed); MicroBit.IOs.Write(1, Speed); end Move_Forward; procedure Rotate_Right(Speed : MicroBit.IOs.Analog_Value) is begin -- LEFT 保持前进 MicroBit.IOs.Set(6, Forward); MicroBit.IOs.Set(7, not Forward); MicroBit.IOs.Set(2, Forward); MicroBit.IOs.Set(3, not Forward); -- RIGHT 切换为后退 MicroBit.IOs.Set(12, Forward); MicroBit.IOs.Set(13, not Forward); MicroBit.IOs.Set(14, Forward); MicroBit.IOs.Set(15, not Forward); MicroBit.IOs.Write(0, Speed); MicroBit.IOs.Write(1, Speed); end Rotate_Right; end Movement;
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

