4、温度控制实战(二):数字PID的离散化实现、积分饱和与抗积分饱和策略、PID参数整定(Ziegler-Nichols法)

上一章我们聊了模拟PID的物理实现,说白了就是运放搭出来的电路。但说实话,现在做光模块、激光器温控,谁还搭模拟电路啊?基本都是MCU里跑数字PID。这一章,我们就来啃这块硬骨头。

4.1 从连续到离散:数字PID的离散化

模拟PID是连续的,输入输出都是模拟电压。数字PID呢?它是每隔一段时间算一次。这个时间间隔,我们叫它采样周期 \( T_s \)。

我刚开始做数字PID时,犯过一个低级错误——直接把模拟PID的公式抄过来用,结果温控曲线抖得像心电图。后来才明白,积分和微分项必须做离散化处理。

离散化的核心思想很简单:

  • 积分:把连续的面积,变成离散的累加。也就是 \( \int e(t) dt \approx T_s \sum e(k) \)
  • 微分:把连续的斜率,变成离散的差值。也就是 \( \frac{de(t)}{dt} \approx \frac{e(k) - e(k-1)}{T_s} \)

嗯,这里要注意,采样周期 \( T_s \) 的选择很关键。选大了,控制滞后;选小了,MCU算不过来。我个人习惯是取系统时间常数的1/10到1/20。

下面给出位置式PID的离散化公式:

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

其中:

  • \( u(k) \):第k次采样时的控制输出
  • \( e(k) \):第k次采样时的偏差(设定值 - 实际值)
  • \( Kp, Ki, Kd \):比例、积分、微分系数
  • \( T_s \):采样周期

实际工程中,我更常用的是增量式PID。它只计算控制量的变化量,不容易产生积分饱和,而且对执行器(比如TEC)更友好。

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

你看,增量式PID不需要累加所有历史误差,只用到最近三次的误差值。这在嵌入式系统里跑起来,轻快多了。

4.2 积分饱和:一个让人头疼的问题

积分饱和,说白了就是积分项「算过头」了。

为什么会这样?你想想看,当激光器刚开机时,实际温度离设定值很远,误差很大。积分项拼命累加,很快就堆到一个很大的值。等温度终于靠近设定值时,积分项里还存着那个巨大的累加值,导致输出依然很大,温度就会冲过头。

我在项目中遇到过这种情况:一个DFB激光器,设定25°C,开机后温度直接冲到28°C才慢慢回落,来回震荡了好几次才稳定。这就是典型的积分饱和。

积分饱和的危害:

  • 超调量大,可能损坏激光器
  • 调节时间变长,稳定速度慢
  • 严重时会导致系统振荡,无法收敛

4.3 抗积分饱和策略:实战中的三板斧

抗积分饱和的方法有很多,我挑三个最实用的讲。

4.3.1 积分限幅法

最简单粗暴的方法。给积分项设一个上限和下限,超过就截断。比如TEC的PWM占空比最大是100%,那积分项累加值对应的输出就不能超过100%。

if (integral > INTEGRAL_MAX) integral = INTEGRAL_MAX;
if (integral < INTEGRAL_MIN) integral = INTEGRAL_MIN;

这个方法虽然简单,但有个缺点:截断后积分项会丢失一部分信息,可能导致稳态误差。

4.3.2 积分分离法

这个思路更聪明。当误差很大时,干脆不让积分项工作;只有当误差缩小到一定范围内,才启用积分。

if (abs(error) < THRESHOLD) {
    // 启用积分
    integral += error * Ts;
} else {
    // 积分清零或保持
    integral = 0;
}

我曾经在一个高精度温控项目中用过这个方法。阈值设成0.5°C,误差大于0.5°C时只用PD控制,小于0.5°C时加入积分。效果非常好,既没有超调,稳态精度也达到了±0.01°C。

4.3.3 反馈抑制法(Back-calculation)

这是比较高级的方法。当输出饱和时,把实际输出与理想输出的差值反馈回积分项,让积分项自动调整。

// 计算理想输出
u_ideal = Kp * e + Ki * integral + Kd * derivative;
// 实际输出限幅
u_actual = saturate(u_ideal, U_MIN, U_MAX);
// 反馈修正积分
integral += (u_actual - u_ideal) * Kc * Ts;

其中 \( Kc \) 是反馈系数,一般取 \( Kc = 1/Kp \)。这个方法的好处是积分项能自动适应饱和状态,不会过度累加。

我的建议:对于大多数DFB激光器温控场景,积分分离法就够用了。如果要求特别高(比如DWDM系统的波长锁定),可以考虑反馈抑制法。

4.4 PID参数整定:Ziegler-Nichols法

参数整定是PID控制的灵魂。调不好,再好的算法也白搭。

Ziegler-Nichols法(简称Z-N法)是1942年提出的经典方法,虽然老,但非常实用。它分两种:

4.4.1 阶跃响应法(开环整定)

这种方法适用于系统开环稳定的情况。步骤很简单:

  1. 断开PID控制器,给TEC一个阶跃信号(比如50%占空比)
  2. 记录温度响应曲线
  3. 从曲线上找出两个关键参数:滞后时间 \( L \) 和时间常数 \( T \)
  4. 查表得到PID参数
控制器类型 Kp Ki Kd
P T / L - -
PI 0.9 * T / L 0.27 * T / L² -
PID 1.2 * T / L 0.6 * T / L² 0.5 * L

嗯,这里要注意,Z-N法给出的参数通常偏激进,会有较大的超调。我一般会把Kp再乘以0.6~0.8,作为安全系数。

4.4.2 临界比例度法(闭环整定)

这种方法不需要开环测试,直接在闭环下操作:

  1. 把Ki和Kd设成0,只保留比例控制
  2. 逐渐增大Kp,直到系统出现等幅振荡
  3. 记录此时的临界增益 \( K_u \) 和振荡周期 \( T_u \)
  4. 查表计算PID参数
控制器类型 Kp Ki Kd
P 0.5 * K_u - -
PI 0.45 * K_u 0.54 * K_u / T_u -
PID 0.6 * K_u 1.2 * K_u / T_u 0.075 * K_u * T_u

警告:临界比例度法会让系统进入振荡状态。对于激光器来说,温度振荡可能导致波长漂移,甚至损坏激光器。建议先用仿真验证,或者在实际系统上设置好输出限幅再操作。

4.5 实战中的参数微调技巧

Z-N法给出的参数只是起点,不是终点。我总结了一套微调口诀:

  • 超调大:减小Kp,或者增大Kd
  • 响应慢:增大Kp,或者减小Ki
  • 稳态误差大:增大Ki
  • 系统振荡:减小Kp,或者减小Ki

我曾经调试一个10Gbps的EML激光器温控,Z-N法算出来的参数让温度在±0.05°C范围内来回跳。后来我把Kp降了20%,Kd提了10%,最终稳定在±0.01°C以内。你看,理论计算和实际调试之间,还是需要一点经验的。

4.6 本章知识体系

下面这张图总结了本章的核心逻辑,从离散化到积分饱和,再到参数整定,一条线串下来:

数字PID温控实战知识体系 数字PID离散化 位置式 vs 增量式 积分饱和问题 超调大、调节慢、系统振荡 抗积分饱和策略 积分限幅法 积分分离法 反馈抑制法 PID参数整定(Ziegler-Nichols法) 阶跃响应法(开环) 临界比例度法(闭环)

这张图把本章的脉络理得很清楚。从上到下,先解决离散化问题,再处理积分饱和,最后搞定参数整定。每一步都是实战中绕不开的坎。

好了,这一章的内容就到这里。记住,理论是骨架,实践是血肉。多动手调几次,你就能找到感觉了。

专注资料整理