PID控制原理入门:P、I、D到底在干啥?位置式和增量式怎么选?

发布时间:2026/7/18 1:32:44
PID控制原理入门:P、I、D到底在干啥?位置式和增量式怎么选? 看不懂复杂的公式没关系看完这篇你就明PID 怎么在单片机里干活了了。最近看了江协科技的 PID 入门教程把高深的公式讲得明明白白。为了方便大家复习我用开车类比帮您彻底搞懂 PID 在单片机里是怎么干活的一、 通俗理解 PID就是三个“小弟”控制系统好比开车目标是保持车速100 km/hh。三个参数分别负责不同的任务1. 比例项 P比例——“当前车速偏了多少”公式(Output K_p \times 当前误差)通俗理解当前车速只90 km/hh误差是 10P 项项就会输出一个力量去踩油门。特点越偏越猛。(K_p) 调大反应极快但容易冲过头产生超调。痛点纯 P 控制制是有缺陷的。因为如果误差变成0P 项的输出出就是0。车要是正好在上坡输出 0 车车会倒溜所以会出现“稳态误差”永远差那么一点点到不了目标。2. 积分项 I积分——“专门对付稳态误差”公式(Output K_i \times 累计误差总和)通俗理解只要没达到目标速度这个“记账本”就一直记着误差并累积。它是为了解决比例项控制不了的“稳态误差”。特点因为它一直累积误差直到误差彻底消失它才会停止增大并保持当前值从而提供持续抵消外界干扰如摩擦力、上坡重力的力量。副作用(K_i) 太大系统反应会迟钝容易产生“滞后”。3. 微分项 D微分——“预测未来急刹车”公式(Output K_d \times 误差变化快慢斜率)*通俗理解看到前面马上就要撞墙了误差急剧变小D 项会立刻输出一个相反的力量拼命往回拉避免超调。。*特点系统加了 D 项就像有了“阻尼器”能有效防震荡、防超调。。副作用(K_d) 调太大就像一直在踩刹车系统会卡顿、响应极慢。二、公式怎么变成单片机能用的代码数学上的“积分”和“微分”是连续的单片机得隔一阵子算一次所以需要“离散化”*积分→累加求和(\sum error))*微分→前后两次误差相减即斜率(error(k) - error(k-1)))综合起来单片机常用的位置式 PID 公式就变成Out(k)Kp×err(k)Ki×∑err(j)Kd×[err(k)−err(k−1)]Out(k) K_p \times err(k) K_i \times \sum err(j) K_d \times [err(k) - err(k-1)]Out(k)Kp​×err(k)Ki​×∑err(j)Kd​×[err(k)−err(k−1)]三、两种主流写法位置式 vs 增量式必考点 1. 位置式 PID做法直接计算并输出当前总量。代码核心有一个专门的累加变量ErrorInt用来存历史误差。缺点有“炸机”风险。如果历史误差累加溢出或突然复位输出值可能会瞬间突变执行器会直接爆冲所谓的“飞车”。 2. 增量式 PID推荐常用做法不直接给总量只给本次比上次“多”或“少”多少算出 (\Delta Out)。代码核心两式相减推导出只需要记住最近三次的误差(err(k))、(err(k-1))、(err(k-2))。优点输出只是增量即便程序出错影响也相对小。非常安全适合步进电机等场合。四、极简代码实现伪代码速记速记位置式 PID 流程Error0Target-Actual;// 1. 算当前误差ErrorIntError0;// 2. 误差积分累加OutKp*Error0Ki*ErrorIntKd*(Error0-Error1);// 3. 算输出if(OutMax)OutMax;// 4. 输出限幅保护Error1Error0;// 5. 保存当前误差备下一轮用增量式 PID 流程Error2Error1;// 1. 把之前的误差向后移槽位更新Error1Error0;Error0Target-Actual;// 算最新的当前误差// 2. 计算增量注意这里不需要累加器直接利用前三次误差DeltaOutKp*(Error0-Error1)Ki*Error0Kd*(Error0-2*Error1Error2);OutDeltaOut;// 3. 把增量加到总输出上 ## PID 调参流程图先 P、再 I、后 D 下面这张流程图清晰地展示了“先 P、再 I、后 D”的经典调参顺序、关键判断点以及循环反馈路径帮助你按部就班地调出理想参数。 mermaid flowchart TD Start[开始调参]--P[第一步只留 P 项br调节 Kp]P--CheckP{系统响应br是否刚好开始震荡}CheckP--否--AdjustP[继续增大 Kp]AdjustP--P CheckP--是--I[第二步加入 I 项br调节 Ki]I--CheckI{稳态误差br是否彻底消除}CheckI--否--AdjustI[继续增大 Ki]AdjustI--I CheckI--是--D[第三步加入 D 项br调节 Kd]D--CheckD{超调是否被压制br曲线是否平滑}CheckD--否--AdjustD[微调 Kd]AdjustD--D CheckD--是--End[✅ 调参完成br获得理想 PID 参数]style Start fill:#e1f5fe style End fill:#c8e6c9流程解读只调 P比例从较小的 (K_p) 开始逐渐增大直到系统响应刚好出现轻微震荡。这是 P 项的临界点。加入 I积分在固定 (K_p) 的基础上加入 I 项并调节 (K_i)目标是彻底消除稳态误差系统能稳定在目标值没有固定偏差。加入 D微分最后加入 D 项调节 (K_d) 来压制超调、平滑曲线提高系统稳定性和响应速度。循环反馈每个步骤都通过观察系统响应震荡、误差、超调来判断是否达标若不达标则返回微调参数形成闭环优化。记住这个顺序调参不再盲目 最后的调新手调 PID别一上来就三个一起动一起动✅ 第一步先只留P调 (K_p) 到系统刚好开始震荡。✅ 第二步加入I调 (K_i) 直到稳态误差彻底消除。✅ 第三步加入D调 (K_d) 压制超调让曲线变平滑。控制逻辑不过如此懂了原理代码只需几行如果你觉得有帮助欢迎点赞、收藏、评论让更多人看到