1. PID控制基础:从原理到实战直觉
各位同学,咱们今天聊聊PID控制。说实话,我刚入行那会儿,觉得PID不就是三个字母嘛——比例、积分、微分,背公式谁不会?但真正上手调电机,才发现这东西远没那么简单。我记得第一次调一个直流有刷电机,P给大了,电机抖得像筛子;I给大了,超调直接飞出去;D稍微加点,噪声又把系统搞炸了……嗯,今天咱们就把这些坑一个一个填上。
1.1 PID控制原理:闭环的灵魂
PID说白了就是一个“纠偏器”。你给电机一个目标转速,比如3000 RPM,实际跑起来可能只有2800。差了多少?200 RPM。PID就是拿这个差值(误差)做文章,算出一个控制量,让电机努力追上目标。
核心公式(位置式PID):
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
其中:
e(t) = 目标值 - 实际值(当前误差)
u(t) = 控制器输出(比如PWM占空比)
你想想看,这个公式其实就三件事:
- 看现在(比例项)——误差有多大,我就推多大力
- 算过去(积分项)——误差攒了多久,我慢慢还
- 猜未来(微分项)——误差变化快慢,我提前刹车
我在项目里经常跟新人说:PID就是一个有经验的司机。看到偏离车道了(P),赶紧打方向;发现一直偏(I),就多打一点;看到要回正了(D),提前回盘,别 overshoot。
1.2 比例作用(P):最直接的“大力出奇迹”
比例控制最简单:误差大,输出就大;误差小,输出就小。公式就一行:
u_p = Kp * e(t)
举个例子:电机目标3000 RPM,当前2800,误差200。如果Kp=0.1,那P项输出就是20%的PWM。误差变成100时,输出变成10%。
| Kp值 | 系统表现 | 我踩过的坑 |
|---|---|---|
| 太小 | 响应慢,稳态误差大(永远追不上目标) | 电机半天转不到目标转速,急死人 |
| 适中 | 响应快,有一定超调,稳态误差小 | —— |
| 太大 | 剧烈震荡,甚至发散(电机啸叫、炸管) | 我曾经把Kp调太大,MOS管直接冒烟 |
注意:纯P控制永远存在稳态误差。为什么?因为要维持输出,就必须有误差存在。这是比例控制的“原罪”。
1.3 积分作用(I):专治“差一口气”
纯P控制下,电机可能停在2950 RPM就上不去了——误差5 RPM,P项输出不够克服负载。这时候积分项就派上用场了。
u_i = Ki * ∫e(t)dt
积分项会“记住”过去的误差,慢慢累积。误差一直存在,积分值就一直增长,输出也跟着涨,直到把误差吃掉。
我个人习惯是先调好P,再加一点I。但I不能太大,否则会出现两个问题:
- 积分饱和(Integral Windup):启动时误差很大,积分快速累积到上限。等实际值追上目标时,积分值还很大,导致巨大超调。我曾经在伺服项目里被这个坑惨了——电机一启动就冲过头,差点撞限位。
- 低频振荡:I太大,系统会“慢悠悠”地来回晃,频率很低但幅度不小。
避坑指南:积分限幅一定要做!我一般把积分输出限制在最大输出的30%~50%。另外,启动时可以用“积分分离”——误差大时先不加I,等误差小了再引入。
1.4 微分作用(D):提前踩刹车
微分项看的是误差的变化率:
u_d = Kd * de(t)/dt
误差变化越快,微分输出越大。它的作用是“预测未来”——看到误差在快速减小,就提前减小输出,抑制超调。
但D是把双刃剑:
- 优点:加快响应,减少超调,提高稳定性
- 缺点:对噪声极其敏感。测量信号稍微有点毛刺,微分项就会剧烈跳动
我记得有一次调试一个编码器信号不太干净的电机,加了D之后,PWM波形上全是尖刺,电机嗡嗡响。后来加了低通滤波才压下去。
实战建议:在STM32上做电机控制,我通常只在速度环加少量D,位置环基本不用D。如果编码器分辨率低或者采样频率不够高,干脆别用D,否则得不偿失。
1.5 PID参数对系统的影响:一张表说清楚
| 参数 | 上升时间 | 超调量 | 稳态误差 | 稳定性 |
|---|---|---|---|---|
| 增大Kp | 加快 | 增大 | 减小 | 变差 |
| 增大Ki | 加快 | 增大 | 消除 | 变差 |
| 增大Kd | 略微加快 | 减小 | 无影响 | 变好(但噪声敏感) |
你想想看,这三个参数其实是互相牵制的。调P的时候,I和D都得跟着动。我个人的调参顺序是:先P,再I,最后D。P调到系统不震荡但有稳态误差,I把误差吃掉,D稍微加点改善动态响应。
1.6 知识体系:PID控制全景图
下面这张图把PID的核心逻辑串起来了。我建议你多看几遍,把每个模块的输入输出关系搞清楚。
1.7 写在后面:PID不是万能药
学完这一章,你可能会觉得PID很简单。但我要泼点冷水:PID只适用于线性、时不变系统。电机控制里,摩擦力、死区、饱和、负载变化……这些都会让PID失效。我见过太多人死磕PID参数,最后发现是机械结构有问题。
所以我的建议是:先把PID原理吃透,然后带着问题进下一章——STM32上怎么实现PID?采样周期怎么选?抗积分饱和怎么写?这些才是实战的关键。
本章要点回顾:
- P看当前误差,I算历史累积,D预测变化趋势
- 纯P必有稳态误差,I消除稳态误差,D抑制超调但怕噪声
- 调参顺序:P → I → D,每次只动一个参数
- 积分限幅、微分滤波是工程必备手段