STM32两轮平衡小车PID调参实战指南(开源)

发布时间:2026/7/15 17:48:27
STM32两轮平衡小车PID调参实战指南(开源) 1. 平衡小车PID调参前的准备工作在开始PID调参之前我们需要确保硬件和软件环境已经正确搭建。很多新手在调参过程中遇到问题往往是因为前期准备工作没做好。我自己在第一次调试时就踩过这个坑小车怎么调都站不稳后来发现是MPU6050的安装位置不对。首先检查硬件连接MPU6050必须牢固安装在小车中心位置且芯片方向与车体前进方向一致电机编码器接线正确正反转时计数值变化方向符合预期电池电压充足建议使用2S锂电池电压保持在7.4V以上软件方面需要确认已经正确移植了MPU6050的DMP库或实现了姿态解算算法定时中断配置正确建议直立环控制周期2-5ms速度环10-20msPWM输出极性正确电机正转时小车应该向前倾斜这里分享一个实用技巧在调参前先用蓝牙模块连接手机通过串口绘图工具实时查看角度和角速度波形。我常用的是SerialPlot或者匿名上位机这样能直观看到传感器数据是否正常。2. 直立环PD参数整定直立环是平衡小车最核心的控制环节它直接决定了小车能否站稳。根据我的经验90%的平衡问题都出在直立环参数不合适。我们先来看直立环的控制公式int balance_UP(float Angle, float Mechanical_balance, float Gyro) { float Bias; int balance; Bias Angle - Mechanical_balance; balance balance_UP_KP*Bias balance_UP_KD*Gyro; return balance; }2.1 机械中值确定在调KP和KD之前必须先确定机械中值Mechanical_balance。这个值是小车静止平衡时的理论角度一般在5-10度之间。我通常这样测量将小车放在平坦地面用手扶住保持直立通过串口输出当前pitch角度记录10次测量值取平均注意不同小车的机械中值可能差异很大我的第一辆小车是8.2度第二辆因为重心变化变成了6.5度。2.2 KP参数调试KP参数决定了小车对角度偏差的响应强度。调试时先将KD设为0然后按照以下步骤从小值开始尝试比如KP10用手轻轻推动小车观察反应如果小车反应迟钝缓慢增加KP如果出现高频振荡说明KP过大找到临界振荡值后取该值的70%作为最终KP实测案例我的小车在KP45时开始振荡最终选定KP32。这里有个经验公式可以参考KP ≈ (电机最大PWM) / (最大允许倾角)。比如PWM范围是0-1000允许倾角30度那么KP≈33。2.3 KD参数调试KD参数抑制振荡的关键调试方法保持刚才的KP值不变从KP/10的值开始尝试KD比如KP32KD从3开始观察小车响应如果小车出现低频摇摆缓慢增加KD如果出现高频抖动说明KD过大最佳KD值是小车受到扰动后能快速稳定且无明显振荡调试技巧可以故意给小车一个较大扰动观察恢复过程。理想状态是1-2个轻微摆动后就能恢复平衡。我的小车最终KD0.8这个值对电机性能很敏感更换电机后需要重新调整。3. 速度环PI参数整定当直立环调好后你会发现小车虽然能站稳但会慢慢往一个方向跑。这时就需要引入速度环它通过调节电机的转速来维持位置。速度环一般采用PI控制int velocity(int encoder_left, int encoder_right, int Target_Speed) { static float Encoder_Integral; Encoder_Least (encoder_left encoder_right) - Target_Speed; Encoder_Integral Encoder_Least; Velocity Encoder_Least*velocity_KP Encoder_Integral*velocity_KI; return Velocity; }3.1 KP参数调试速度环KP决定了小车对速度偏差的响应速度先将KI设为0Target_Speed设为0从小值开始如KP0.1观察小车行为如果小车仍然会缓慢移动适当增加KP如果出现前后摆动说明KP过大找到使小车能基本保持位置的KP值重要提示速度环KP过大会干扰直立环建议先让直立环参数降低20%再进行调试。我的小车速度环KP0.25。3.2 KI参数调试KI参数消除静态误差的关键保持KP不变从KP/100的值开始如KI0.0025观察小车长期行为如果几分钟后还是会缓慢移动适当增加KI如果出现周期性摆动说明KI过大我的小车最终KI0.003这个值非常敏感建议每次调整幅度不超过10%调试技巧可以在光滑地面上测试观察小车是否能保持在直径50cm的范围内超过5分钟。4. 转向环PD参数调试如果需要遥控转向功能还需要调试转向环参数。转向环通常使用PD控制int Turn_UP(int gyro_Z, int RC) { PWM_out Turn_Kd*gyro_Z Turn_KP*RC; return PWM_out; }4.1 KP参数调试先将Kd设为0从小值开始如KP0.5通过遥控器发送转向指令转向迟钝则增加KP出现抖动则减小KP我的小车转向KP1.24.2 KD参数调试KD用于抑制转向时的振荡保持KP不变从KP/5的值开始快速打方向观察响应转向后出现摇摆则增加KD转向僵硬则减小KD我的小车转向KD0.35. 常见问题与解决方案在调试过程中我遇到过各种奇怪的问题这里分享几个典型案例问题1小车启动后直接加速冲向地面可能原因电机极性接反解决方案交换电机接线或修改PWM输出极性问题2小车能站稳但剧烈抖动可能原因KD值过大或MPU6050数据异常解决方案检查传感器数据是否平滑适当减小KD问题3小车往一个方向缓慢移动可能原因机械中值不准确或速度环KI不足解决方案重新校准机械中值适当增加速度环KI问题4响应延迟明显可能原因控制周期过长解决方案检查中断配置直立环建议2-5ms速度环10-20ms调试过程中建议做好记录我习惯用表格记录每次参数调整的效果参数组KPKIKD现象描述日期直立环40-0.5轻微振荡2024-03-01直立环35-0.7响应稍慢但稳定2024-03-02速度环0.20.002-5分钟后偏移1米2024-03-03最后提醒一点不同的小车参数不能直接套用因为电机性能、车体重心和传感器安装都会影响最终效果。建议准备一套备用电机和电池在调试过程中保持硬件一致性。