在自动化专业,PID (比例-积分-微分) 是我们的信仰。 公式写在纸上很优雅: $$u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt}$$
但当你把它写进单片机,控制一个两轮自平衡小车时,事情就变得魔幻起来了。
👻 现象一:疯狂抖腿 ($K_p$ 之殇)
刚开始,我只加了比例项 ($P$)。 我想法很简单:倾斜角度越大,回复力就应该越大嘛。
于是我把 $K_p$ 设成了 500。 结果小车一上电,就开始以一种极高频率疯狂震荡,发出“滋滋滋”的电流声,像是在跳踢踏舞。 原因:$K_p$ 太大了,系统过冲了。 解决:把 $K_p$ 减小,直到它不再高频震荡,而是像个不倒翁一样低频晃动。
🐌 现象二:永远站不直 ($K_i$ 的缺席)
调好了 $P$,小车能站住了,但它总歪着身子。 如果我推它一下,它就会歪到一个新的角度继续平衡,完全没有“回到中点”的欲望。 这就是静差。 这时候需要引入积分项 ($I$)。积分的作用是“秋后算账”,只要有误差存在,它就会不断积累,直到把误差消除。
坑点:积分饱和 (Integral Windup)。 有一次小车倒在地上,积分项还在疯狂累加。等我把它扶起来,电机瞬间满转,直接把车甩飞了。 对策:必须做积分限幅!
⚡ 现象三:听觉污染 ($K_d$ 的噪声)
为了让小车抵抗干扰(比如我踢它一脚),我加大了微分项 ($D$)。 $D$ 是对未来的预测,能提供阻尼。 但是,$D$ 对噪声极其敏感。我的 MPU6050 陀螺仪数据稍微有一点毛刺,经过 $D$ 放大,就变成了巨大的电流波动。 电机发出了刺耳的啸叫声,听得我神经衰弱。
最终方案:
- 滤波:对陀螺仪数据做二阶低通滤波。
- 微分先行:只对测量值(角度)做微分,不对设定值做微分,避免设定值突变时的冲击。
🎯 调参口诀
经过两个通宵的折磨,我总结了一套“玄学”口诀:
参数整定找最佳,从小到大顺序查。 先是比例后积分,最后再把微分加。 曲线振荡很频繁,比例度盘要放大。 曲线漂浮绕大湾,比例度盘往小扳。 曲线偏离回复慢,积分时间往下降。 曲线波动周期长,积分时间再加长。
现在,我的小车终于能像个绅士一样,稳稳地立在桌面上,推都推不倒。 控制之美,大概就在于这种从“混沌”到“秩序”的过程吧。