4、数字PID控制器设计:位置式PID与增量式PID、积分饱和与抗饱和策略、PID参数整定方法
PID控制器,说白了就是数字电源控制环路里的“大脑”。它负责盯着输出电压和参考值之间的误差,然后算出一个占空比,让开关管该开多久就开多久。我做了这么多年电源,见过太多环路不稳的案例,十有八九都是PID没调好。
这一章咱们就把它彻底讲透。从两种最常用的数字PID形式开始,再到积分饱和这个“隐形杀手”,最后聊聊怎么把参数整定到靠谱的范围。嗯,内容不少,但都是干货。
4.1 位置式PID与增量式PID
数字PID在工程上主要有两种实现方式:位置式和增量式。它们本质上是同一个控制律的不同表达,但在实际代码里差别很大。
4.1.1 位置式PID
位置式PID直接计算控制量的绝对值。公式长这样:
u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]
其中:
- u(k):第k时刻的输出控制量(比如占空比)
- e(k):第k时刻的误差(参考值 - 反馈值)
- Kp, Ki, Kd:比例、积分、微分系数
- Σe(i):从启动到当前时刻的误差累加和
位置式的特点很明显:
- 输出是绝对量,直接对应PWM占空比
- 积分项需要累加所有历史误差,容易溢出
- 一旦积分项出问题,输出会直接跳变,很危险
if(integral > INTEGRAL_MAX) integral = INTEGRAL_MAX;
4.1.2 增量式PID
增量式PID不输出控制量的绝对值,而是输出控制量的增量Δu(k)。公式推导一下:
Δu(k) = u(k) - u(k-1)
= Kp * [e(k) - e(k-1)] + Ki * e(k) + Kd * [e(k) - 2*e(k-1) + e(k-2)]
实际控制量由累加得到:
u(k) = u(k-1) + Δu(k)
增量式的优势很明显:
- 输出是增量,即使计算出错,单次跳变也不会太大
- 不需要累加所有历史误差,积分饱和风险小
- 手动/自动切换时无冲击——因为输出是累加出来的
4.1.3 两种形式的对比
| 对比项 | 位置式PID | 增量式PID |
|---|---|---|
| 输出形式 | 绝对控制量 | 控制量增量 |
| 积分累加 | 需要累加所有历史误差 | 不需要,只依赖最近几次误差 |
| 积分饱和风险 | 高 | 低 |
| 手动/自动切换 | 有冲击,需做bumpless处理 | 无冲击,天然bumpless |
| 计算资源 | 需要存储累加和 | 需要存储最近3次误差 |
| 适用场景 | 执行机构为比例环节(如PWM) | 执行机构为积分环节(如步进电机) |
4.2 积分饱和与抗饱和策略
积分饱和,我愿称之为PID控制器的“第一杀手”。很多工程师调了半天参数,发现系统响应慢、超调大,其实不是Kp、Ki的问题,而是积分饱和在作怪。
4.2.1 什么是积分饱和?
说白了,就是积分项累加得太大了,导致控制器输出被限幅器卡住,但积分还在继续累加。等误差反向时,积分项需要花很长时间才能“退回来”,这段时间里系统就像失控了一样。
举个例子:你启动一个电源,输出电压还没建立起来,误差很大。积分项疯狂累加,很快就让占空比达到了100%。但此时输出电压还在上升,误差依然为正,积分继续累加——直到输出电压超过设定值,误差变负,积分才开始往回退。这个“往回退”的过程,就是输出过冲的根源。
4.2.2 常见的抗饱和策略
我整理了几种工程上常用的方法,按推荐程度排序:
- 积分限幅法:给积分项设置上下限,这是最基础的做法。
- 积分分离法:当误差大于某个阈值时,停止积分;误差小到阈值以内再恢复积分。
- 反计算法(Back-calculation):当输出饱和时,把饱和量反馈回积分项,让积分“退一步”。
- 条件积分法:只有当输出未饱和时,才允许积分累加。
我个人最推荐的做法:积分限幅 + 条件积分的组合。先给积分项设一个合理的上限(通常为输出限幅值的10%~20%),然后在代码里判断:如果输出已经饱和,就冻结积分累加。这个方案实现简单,效果也够用。
下面是一个C语言的抗饱和PID实现片段:
// 增量式PID + 抗饱和
float pid_update(float setpoint, float feedback) {
float error = setpoint - feedback;
float delta_u;
// 计算增量
delta_u = Kp * (error - error_prev)
+ Ki * error
+ Kd * (error - 2*error_prev + error_prev2);
// 累加输出
output += delta_u;
// 输出限幅
if(output > OUT_MAX) {
output = OUT_MAX;
// 条件积分:输出饱和时,不累加本次积分增量
// 实际效果就是冻结积分
} else if(output < OUT_MIN) {
output = OUT_MIN;
}
// 更新历史误差
error_prev2 = error_prev;
error_prev = error;
return output;
}
4.3 PID参数整定方法
参数整定,说白了就是找到Kp、Ki、Kd这三个数,让系统跑得又快又稳。我见过有人靠“玄学调参”——调一天没调好,换个电阻电容再调一天。其实有系统的方法。
4.3.1 工程经验法
这是最常用的方法,适合大多数数字电源场景:
- 先调Kp:把Ki和Kd设为0,只加Kp。从小到大慢慢加,直到系统出现等幅振荡。记下此时的Kp值,称为临界增益Kc。
- 再调Ki:加入积分项,从Ki = 0.1*Kp开始试。观察稳态误差是否消除,如果消除得太慢就加大Ki,如果出现低频振荡就减小Ki。
- 最后调Kd:微分项主要用来抑制超调。从Kd = 0.05*Kp开始,观察动态响应。如果噪声太大,说明Kd太大了。
4.3.2 Ziegler-Nichols整定法
这是经典方法,适合有自激振荡能力的系统。步骤如下:
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | Ki=0, Kd=0,只加Kp | 让系统进入纯比例控制 |
| 2 | 增大Kp直到等幅振荡 | 记录临界增益Kc和振荡周期Tc |
| 3 | 按公式计算参数 | Kp=0.6Kc, Ki=1.2Kc/Tc, Kd=0.075Kc*Tc |
| 4 | 微调 | 根据实际响应微调,通常需要减小10%~20% |
Z-N法给出的参数通常偏“激进”,系统会有20%~30%的超调。我一般会在算出来的基础上再打个八折,然后根据实际波形微调。
4.3.3 基于模型的设计方法
如果你有被控对象的传递函数(比如Buck变换器的小信号模型),可以用极点配置或频域法来设计PID参数。这个方法最精确,但需要你懂控制理论。
简单说下步骤:
- 建立被控对象的传递函数G(s)
- 设计PID控制器C(s),使开环传递函数C(s)G(s)的穿越频率在开关频率的1/10~1/20
- 相位裕度保持在45°~60°之间
- 用双线性变换(Tustin法)把C(s)离散化成C(z)
我的建议:对于刚入行的工程师,先用工程经验法把系统调稳定,再用Z-N法优化。等你对系统特性足够了解了,再尝试基于模型的设计。别一上来就搞复杂的数学模型,容易把自己绕进去。
4.4 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以把它当作一个快速索引:
这张图把本章的三个核心模块串在了一起。你可以看到,PID实现形式、积分饱和处理、参数整定方法,三者是相互关联的。比如你选了增量式PID,积分饱和的风险就小一些;你用了条件积分法,参数整定时就可以把Ki稍微加大一点。
好了,这一章的内容就到这儿。记住一句话:PID调参不是玄学,是有方法可循的工程实践。多动手、多记录、多总结,你也能成为调参高手。