[具身智能-697]:直流电机可以通过 PWM 控制电机的转速,如何控制直流电机转动的步长?

📅 发布时间:2026/7/31 3:56:28
[具身智能-697]:直流电机可以通过 PWM 控制电机的转速,如何控制直流电机转动的步长?
核心结论前置普通无编码器直流减速电机无法精准控制转动步长 / 转角只能粗略开环控制 想要控制「转多少步、转多少角度」必须增加实时位置反馈形成闭环。先区分概念1PWM只调节平均电压 → 控制转速不知道电机实际转了多少圈只知道理论和理想忽略摩擦力距离。2步长 指定角度 / 指定圈数属于位置控制单纯 PWM 做不到。一、为什么纯 PWM 开环不能精准控制步长电机存在惯性给定驱动信号断电后会滑行负载变化摩擦力、斜坡实际的转速不一致无法获知转轴当前真实位置举例你输出 PWM 持续 500ms理论预想轮子转 1/4 圈负重不同、地面不同实际转动角度差异很大。二、工程上 3 种实现「步长 / 转角控制」方案适配机器人底盘 AM2857STM32方案 1直流电机 正交编码器机器人底盘标准方案 ✅推荐硬件组成直流减速电机 同轴增量编码器编码器输出 A/B 相脉冲电机每转过固定角度产生 1 个脉冲。工作逻辑闭环位置控制STM32 定时器正交解码模式实时统计脉冲数量设置目标脉冲对应目标步长 / 角度算法逻辑输出 PWM 驱动电机运转不断读取当前脉冲值距离目标较远 → 较高 PWM临近目标位置 → 降低 PWM 减速到达目标脉冲 → 停止电机滑行 / 刹车。公式换算一圈总脉冲数 PPR编码器参数 目标脉冲 PPR × 转动圈数加减速必要性如果直接全速冲到目标位置惯性会造成过冲步长控制不准必须梯形速度曲线启动加速、末端减速。方案 2开环定时模拟步长仅适合极低要求不推荐机器人思路固定 PWM 占空比驱动固定时间依靠时间预估转动角度。运行SetMotorSpeed(30); //30%占空比 HAL_Delay(200); //运行200ms模拟一步 StopMotor();致命缺陷负载、电压变化 →实际转角漂移打滑直接失控。 仅演示使用麦克纳姆轮 / 导航底盘绝对不能用。方案 3更换步进电机替代方案步进电机天生可以电信号控制「一步一个角度」开环即可实现步长控制但是对比直流减速电机高速力矩弱、噪音大不适合高速移动机器人底盘。三、闭环位置控制完整流程贴合STM32AM2857目标让轮子精确转动指定步长指定角度参数标定 编码器 PPR、减速比算出每脉冲对应轮子转角位置指令下发例如旋转 90°换算目标脉冲值位置环 PID 控制常用 输入目标位置 - 当前编码器位置 位置偏差输出电机 PWM 占空比 方向启停加减速抑制惯性过冲到达目标位置制动停止硬件链路 电机编码器 → STM32 定时器正交解码 STM32 经过位置 PID 计算 → 输出 IN_A/IN_B PWM → AM2857 驱动电机四、常见误区澄清❌ 误区调节 PWM 占空比就能控制走多少角度 ✅ PWM 只能控制快慢无法控制行程。速度 ≠ 位置。❌ 误区电机刹车IN_A1,IN_B1可以消除过冲 ✅ 刹车能减小滑行但不能替代闭环控制负载变化依旧存在误差。❌ 混淆直流电机 ≠ 步进电机 直流电机连续旋转没有固有 “步”“步长” 是软件通过位置反馈人为实现的硬件本身不具备步进特性。五、针对底盘选型建议如果需要精准点位移动导航、定点停靠 必须采购带正交编码器直流减速电机搭建闭环位置控制如果只是简单遥控移动不需要精准里程开环 PWM 足够麦轮底盘想要实现坐标运动编码器是刚需否则无法解算里程。拓展简易逻辑伪代码位置闭环思想c运行// target_pulse目标脉冲对应想要走的步长/角度 void Motor_Move_Long(int32_t target_pulse) { int32_t current Get_Encoder_Pulse(); int32_t diff target_pulse - current; while(abs(diff) 5) //未到达阈值 { diff target_pulse - Get_Encoder_Pulse(); int pwm PID_Pos_Calc(diff); //位置PID输出速度 SetMotorSpeed(pwm); } Motor_CoastStop(); //到达目标停机 }