从零到一:基于STM32的PID平衡车实战笔记

张开发
2026/4/9 14:08:29 15 分钟阅读

分享文章

从零到一:基于STM32的PID平衡车实战笔记
1. PID算法基础从理论到实践第一次接触PID控制是在大学实验室看着学长用STM32做的平衡车稳稳立在那里当时就觉得这玩意儿太神奇了。后来自己动手做才发现PID既是控制领域的经典算法也是新手最容易踩坑的地方。简单来说PID就是让实际值快速、稳定地跟踪目标值的一套方法。想象一下你开车时的定速巡航设定120km/h后系统会自动调节油门让车速保持在目标值附近。这个调节过程就是PID在发挥作用。在平衡车项目中我们要让车体角度始终维持在垂直位置本质上也是在做一个角度巡航。PID由三个部分组成比例项(P)根据当前误差大小进行调节误差越大调节力度越大积分项(I)累积历史误差专门对付那些顽固的稳态误差微分项(D)预测误差变化趋势提前踩刹车防止超调这三个参数就像团队里的三个成员P是急性子发现问题马上处理I是慢性子慢慢积累力量解决问题D是预言家总能提前预判问题走向。把他们配合好系统就能又快又稳地达到目标。2. STM32硬件平台搭建做平衡车最常用的就是STM32F103系列价格便宜性能足够。我用的是一块蓝色pill开发板加上MPU6050六轴传感器和TB6612电机驱动模块总成本不到100元。硬件连接要注意几个关键点电源部分电机启动瞬间电流很大建议主控板和电机驱动分开供电。我用的是两节18650电池通过AMS1117给STM32供电电池直接接电机驱动。传感器安装MPU6050要尽量靠近车体中心轴安装倾斜会导致零点偏移。我第一次做的时候用热熔胶固定结果车子一动传感器就歪了后来改用3D打印支架才解决。电机选择建议用带编码器的减速电机转速在200-300转/分钟比较合适。我用的是TT马达实测发现扭力不够后来换了N20电机才好些。提示焊接电机线时记得先上锡直接拧在一起容易接触不良导致电机抖动。3. 软件框架设计代码结构对后期调参影响很大。我的程序主要分为三层硬件驱动层处理PWM输出、编码器读取、MPU6050数据获取算法层实现PID计算和滤波算法应用层处理用户输入和状态显示重点说说PID算法的实现。在STM32上一般用定时器中断来定期计算PID我的设置是5ms一次。关键代码如下typedef struct { float Kp, Ki, Kd; float error, lastError; float integral, derivative; float output; } PID_TypeDef; void PID_Calculate(PID_TypeDef *pid, float target, float actual) { pid-error target - actual; pid-integral pid-error; pid-derivative pid-error - pid-lastError; pid-output pid-Kp * pid-error pid-Ki * pid-integral pid-Kd * pid-derivative; pid-lastError pid-error; }这段代码有几个优化点对积分项做了限幅防止积分饱和增加了输出限幅避免给电机过大PWM加入了死区处理微小误差时不调节4. PID参数整定实战调参是平衡车项目最磨人的环节。我的经验是先调P再调D最后加少量I。具体步骤4.1 比例项调试把所有参数设为0慢慢增大Kp直到车体开始小幅振荡记录这个临界值Kp0实际使用的Kp取0.6倍Kp0测试发现Kp12时车体开始抖动最后选定Kp7.24.2 微分项调试保持Kp不变逐步增加Kd观察车体振荡是否减弱响应速度是否改善我的参数是Kd0.5时效果最好再大会导致响应迟钝4.3 积分项调试平衡车对积分项很敏感我的经验是Ki值要非常小一般取Kp的1/100~1/50必须加积分限幅我设置的是±20最终Ki0.15时效果不错调试时遇到一个典型问题车体总是往一边偏。检查发现是MPU6050安装有轻微倾斜后来在代码里加了零点校准函数解决。5. 常见问题排查做平衡车肯定会遇到各种异常情况分享几个我踩过的坑电机抖动严重检查电源是否足够我的第一版用USB供电根本带不动电机。后来改用电池直接供电就好了。角度测量漂移MPU6050需要做软件滤波。我试过互补滤波和卡尔曼滤波最终选择了一阶互补滤波在精度和计算量之间取得了平衡。响应迟钝可能是微分项太大或者PID计算周期太长。我把中断周期从10ms改为5ms后明显改善。站立不稳重点检查机械结构重心是否够低。我在车体下方加了配重块稳定性大幅提升。6. 进阶优化方向基础功能实现后还可以做这些优化加入速度环控制实现前后移动增加蓝牙遥控功能用OLED显示实时参数开发上位机调参工具最让我惊喜的是加入了一个简单的模糊控制算法与PID配合使用后车子居然能在轻微坡道上保持平衡。这也让我明白PID不是万能的根据场景选择合适的控制策略才是关键。调参过程中最大的体会是理论计算只能给出大致范围真正的黄金参数还是要靠实验摸索。有时候半夜调通一个参数看着小车稳稳立住的那一刻那种成就感真是无法形容。

更多文章