第1章:PID控制器离散化——从连续域到离散域的转换

各位工程师朋友,今天咱们来聊聊PID控制器的离散化。说实话,我刚入行那会儿,总觉得连续域和离散域差别不大,不就是把积分换成累加、微分换成差分嘛。直到有一次在移动机器人上跑连续PID,电机抖得像筛糠一样……嗯,从那以后我才真正重视起离散化这件事。

1.1 为什么需要离散化?

你想想看,我们学PID时接触的都是连续形式:

u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt

但现实中的控制器是啥?是单片机、DSP、FPGA。这些东西只能处理离散的采样点,没法处理连续的微分和积分。说白了,计算机的世界是离散的,物理世界才是连续的。

我做过一个项目,用STM32控制差速驱动底盘。如果直接把连续PID公式套进去,采样周期一长,系统就振荡。后来我意识到:离散化不是简单的近似,而是重新理解控制器的本质

1.2 离散化的核心方法

离散化说白了就两件事:积分怎么算?微分怎么算?

1.2.1 积分项的离散化

连续积分是求曲线下的面积。离散后,我们用累加来近似。最常用的是矩形法

∫e(t)dt ≈ Σ e(k) * Ts

其中Ts是采样周期。我习惯用后向矩形法,因为实现简单,而且不会引入超前项。

1.2.2 微分项的离散化

连续微分是求斜率。离散后,我们用差分来近似:

de(t)/dt ≈ [e(k) - e(k-1)] / Ts

这里有个坑——微分项对噪声极其敏感。我曾经在AGV小车上试过,传感器噪声稍微大一点,微分项就疯狂跳动,电机跟着嗡嗡响。后来我加了低通滤波才压住。

1.3 位置式PID与增量式PID

离散化后,PID公式就分成了两大流派:位置式增量式。这两者有什么区别?我直接上代码对比。

1.3.1 位置式PID

位置式PID直接计算控制量的绝对值:

u(k) = Kp * e(k) + Ki * Σe(i)*Ts + Kd * [e(k)-e(k-1)]/Ts

代码实现:

float pid_positional(float setpoint, float measurement) {
    float error = setpoint - measurement;
    integral += error * Ts;
    float derivative = (error - prev_error) / Ts;
    float output = Kp * error + Ki * integral + Kd * derivative;
    prev_error = error;
    return output;
}

优点:直观,容易理解。
缺点:积分项会累积误差。如果长时间饱和,积分项会变得很大,导致超调严重。这就是所谓的积分饱和问题。

⚠️ 注意:位置式PID的积分项需要做限幅处理。我见过一个新手工程师,积分项没限幅,结果电机一启动就冲过头,差点撞坏设备。

1.3.2 增量式PID

增量式PID计算的是控制量的变化量:

Δu(k) = Kp * [e(k)-e(k-1)] + Ki * e(k)*Ts + Kd * [e(k)-2e(k-1)+e(k-2)]/Ts

代码实现:

float pid_incremental(float setpoint, float measurement) {
    float error = setpoint - measurement;
    float delta_u = Kp * (error - prev_error) 
                  + Ki * error * Ts 
                  + Kd * (error - 2*prev_error + prev_prev_error) / Ts;
    prev_prev_error = prev_error;
    prev_error = error;
    output += delta_u;  // 累加得到实际输出
    return output;
}

优点:没有积分累积问题,抗积分饱和能力强。切换手动/自动模式时冲击小。
缺点:需要保存两个历史误差值,内存占用稍大。

💡 我的经验:在差速驱动系统中,我更喜欢用增量式PID。因为底盘经常需要启停、换向,增量式能避免积分饱和带来的冲击。尤其是麦克纳姆轮底盘,增量式PID的平滑性优势非常明显。

1.4 两种PID的对比

对比项 位置式PID 增量式PID
输出形式 控制量绝对值 控制量变化量
积分处理 需单独限幅 天然抗饱和
历史数据 需保存1个误差 需保存2个误差
切换冲击 较大 较小
适用场景 稳态控制 动态控制

1.5 离散化中的关键参数:采样周期Ts

采样周期Ts的选择,直接决定了离散化效果。我总结了几条经验:

  • Ts不能太大:否则离散化误差大,系统容易失稳。一般建议Ts ≤ 系统时间常数的1/10。
  • Ts不能太小:否则微分项噪声放大严重,计算负担也重。
  • 经验值:对于差速驱动底盘,我通常取Ts = 10ms~20ms。太快了没必要,太慢了控制跟不上。
🔧 小技巧:如果你不确定Ts选多少,可以先从10ms开始试。观察电机响应,如果振荡就增大Ts,如果响应迟钝就减小Ts。我调过几十个底盘,10ms基本是万金油。

1.6 本章知识体系

下面这张图总结了离散化PID的核心逻辑:

PID控制器离散化知识体系 连续域PID u(t) = Kp·e(t) + Ki·∫e dt + Kd·de/dt 离散化 离散化方法 矩形法积分 + 差分法微分 离散域PID u(k) = ... 位置式PID 输出:控制量绝对值 需积分限幅 增量式PID 输出:控制量变化量 天然抗饱和 关键参数:采样周期Ts Ts太大 → 失稳 | Ts太小 → 噪声放大 | 推荐:10ms~20ms

1.7 避坑指南

最后,分享几个我踩过的坑:

  • 积分限幅不能忘:位置式PID的积分项一定要限幅。我曾经没限幅,结果积分项累积到1000多,电机直接飞车。
  • 微分项要滤波:直接差分得到的微分项噪声很大。我习惯加一阶低通滤波,截止频率取采样频率的1/10。
  • Ts要固定:采样周期必须严格固定。如果Ts抖动,PID参数就白调了。我一般用定时器中断来保证固定采样。
  • 初始化要小心:增量式PID启动时,历史误差要清零。否则第一次计算会跳变。
📌 总结:离散化是PID从理论到实践的桥梁。位置式适合稳态控制,增量式适合动态控制。选哪个?看你的应用场景。差速驱动底盘,我推荐增量式。但不管选哪个,采样周期Ts和积分限幅都是必须关注的重点。

公众号:蓝海资料掘金营,微信deep3321