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的核心逻辑串起来了。我建议你多看几遍,把每个模块的输入输出关系搞清楚。

PID控制核心知识体系 目标值 r(t) 实际值 y(t) 误差 e(t) − 比例 P Kp × e(t) 积分 I Ki × ∫e(t)dt 微分 D Kd × de(t)/dt 求和 Σ P + I + D 控制输出 u(t) PWM占空比 反馈(编码器/传感器) 核心逻辑:误差 → 三个通道分别计算 → 求和输出 → 驱动电机 → 反馈更新误差 调参顺序:先P(消除大部分误差)→ 加I(消除稳态误差)→ 加D(改善动态响应)

1.7 写在后面:PID不是万能药

学完这一章,你可能会觉得PID很简单。但我要泼点冷水:PID只适用于线性、时不变系统。电机控制里,摩擦力、死区、饱和、负载变化……这些都会让PID失效。我见过太多人死磕PID参数,最后发现是机械结构有问题。

所以我的建议是:先把PID原理吃透,然后带着问题进下一章——STM32上怎么实现PID?采样周期怎么选?抗积分饱和怎么写?这些才是实战的关键。

本章要点回顾:

  • P看当前误差,I算历史累积,D预测变化趋势
  • 纯P必有稳态误差,I消除稳态误差,D抑制超调但怕噪声
  • 调参顺序:P → I → D,每次只动一个参数
  • 积分限幅、微分滤波是工程必备手段