之前也做过PID整定,但是人老了,很多东西又忘了。重新再整理。
1. 问题描述与建模对象
已知连续对象为 G(s)=10/((s+1)(s+2)),系统为单位负反馈结构,前向通道包含数字控制器 D(z)、零阶保持器 H0(s) 与连续对象 G(s)。研究目标是在单位阶跃输入下,比较不同数字控制器(P、PI、PID)所构成闭环系统的响应差异,并据此选择较合适的 PID 参数。

由于系统中存在零阶保持器,因此分析时应先将连续对象按 ZOH 方式离散化,得到脉冲传递函数 G(z),再与不同形式的数字控制器 D(z) 串联构成离散闭环系统。
2. 分析方法
2.1时间常数确定:
对于一阶系统:
G(s)=1/(τs+1)
其极点为:s=−1/τ

G(s)=10/((s+1)(s+2)), 的极点分别是-1和-2,
时间常数:τ1=1/∣s1∣=1,τ2=1/∣s2∣=0.5

,所以取 T=0.1s
2.2 基本思路
(1)先选取采样周期 T。采样周期过大将使离散系统响应变差,过小则会增加实现成本。对本对象极点 -1 和 -2 而言,T=0.1 s 是一个比较合适的起始值。
(2)采用零阶保持离散化方法求得对象的脉冲传递函数 G(z)。这一步已经把零阶保持器 H0(s) 的影响计入。
(3)构造不同形式的数字控制器 D(z)。其中:P 控制只含比例项;PI 控制在比例项基础上增加积分项,用于消除稳态误差;PID 控制进一步加入微分项,用于改善阻尼、抑制超调。
(4)建立单位反馈闭环系统,对单位阶跃输入进行仿真。
(5)比较上升时间 tr、峰值时间 tp、超调量 Mp、调节时间 ts、稳态误差 ess 等指标,并根据指标变化规律逐步整定 Kp、Ki、Kd。
2.3参数整定规律
P 控制:增大 Kp 可加快响应,但 Kp 过大时容易引起振荡,且对单位阶跃输入通常仍存在稳态误差。
PI 控制:积分作用可以消除稳态误差,但 Ki 过大时会导致超调增大、调节时间变长。
PID 控制:在 PI 基础上加入微分项 Kd,可提高系统阻尼,从而减小超调并缩短调节时间,但 Kd 过大时会增强对噪声的敏感性。
3. 示例仿真设置
为便于展示,以下分析采用一组示例设置:采样周期 T=0.1 s;单位阶跃输入 r(k)=1;比较三类控制器参数如下。
|-----------|--------|--------|--------|-------------------|
| 控制器类型 | Kp | Ki | Kd | 说明 |
| P | 1.00 | 0 | 0 | 仅含比例项,用于观察纯比例控制效果 |
| PI | 0.50 | 0.30 | 0 | 消除稳态误差,比较积分作用影响 |
| PID | 0.71 | 0.52 | 0.30 | 兼顾快速性、稳态精度与阻尼 |
4. MATLAB 实现代码
下面给出一套可直接运行的 MATLAB 代码。代码首先对对象进行 ZOH 离散化,然后构造 P、PI、PID 三种数字控制器,最后比较闭环阶跃响应并输出性能指标。
clc; clear; close all;
%% 1. 连续对象
Gs = tf(10,[1 3 2]); % G(s)=10/((s+1)(s+2))
%% 2. 采样周期
T = 0.1; % 可修改为其他采样周期
%% 3. ZOH离散化(已包含零阶保持器影响)
Gz = c2d(Gs,T,'zoh');
%% 4. 三组数字控制器参数(示例)
% P
Kp1 = 1.0;
Dz_P = tf(Kp1,1,T);
% PI
Kp2 = 0.5; Ki2 = 0.3;
Dz_PI = pid(Kp2,Ki2,0,'Ts',T,...
'IFormula','ForwardEuler','DFormula','ForwardEuler');
% PID
Kp3 = 0.71; Ki3 = 0.52; Kd3 = 0.30;
Dz_PID = pid(Kp3,Ki3,Kd3,'Ts',T,...
'IFormula','ForwardEuler','DFormula','ForwardEuler');
%% 5. 闭环系统
Sys_P = feedback(Dz_P*Gz,1);
Sys_PI = feedback(Dz_PI*Gz,1);
Sys_PID = feedback(Dz_PID*Gz,1);
%% 6. 单位阶跃响应
figure;
step(Sys_P,Sys_PI,Sys_PID,10);
grid on;
legend('P','PI','PID');
title('不同数字控制器闭环阶跃响应比较');
%% 7. 性能指标
info_P = stepinfo(Sys_P);
info_PI = stepinfo(Sys_PI);
info_PID = stepinfo(Sys_PID);
disp('------ P控制性能 ------'); disp(info_P);
disp('------ PI控制性能 ------'); disp(info_PI);
disp('------ PID控制性能 ------'); disp(info_PID);
%% 8. 稳态误差
[yP,~] = step(Sys_P,10);
[yPI,~] = step(Sys_PI,10);
[yPID,~] = step(Sys_PID,10);
fprintf('\n稳态误差:\n');
fprintf('P : %.6f\n', abs(1-yP(end)));
fprintf('PI : %.6f\n', abs(1-yPI(end)));
fprintf('PID : %.6f\n', abs(1-yPID(end)));
5. 示例分析结果
以下结果基于采样周期 T=0.1 s 以及上表中的示例参数得到,主要用于说明 P、PI、PID 三类控制器对闭环响应的典型影响规律。不同采样周期或不同参数下,数值会有所变化,但趋势基本一致。
|---------|-----------------|----------------|-----------------|----------|----------------|
| 控制器 | 上升时间 /s | 超调量 /% | 调节时间 /s | 稳态误差 | 结果概述 |
| P | 0.40 | 25.22 | >10 | 0.1667 | 响应较快,但有明显稳态误差 |
| PI | 0.60 | 20.98 | 4.00 | ≈0 | 稳态误差消除,但调节过程偏长 |
| PID | 0.30 | 1.68 | 1.70 | ≈0 | 综合性能最好,快速且平稳 |
6. 结果分析与结论
(1)P 控制能够提高系统响应速度,但对单位阶跃输入仍存在稳态误差,因此通常不作为最终方案。
(2)PI 控制通过积分作用使稳态误差趋于零,但积分也会引入一定超调和较长的调节过程。
(3)PID 控制在本例中表现出更好的综合性能:既能保证稳态误差接近零,又能明显降低超调并缩短调节时间。
(4)因此,对于该对象,优先采用数字 PID 控制器更为合理。整定时可先调 Kp,再加 Ki 消除静差,最后调 Kd 改善阻尼。
PS:PID参数整定:
1)系统是"数字控制 + ZOH",不推荐 临界比例法。
- 已经引入采样延迟
- 临界振荡点会偏移
- 结果不稳定甚至误判
2)Z-N法的典型问题
- 超调很大(通常 20%~40%)
- 只适合粗调,不适合精细设计
|----------------|-------------|--------------|---------------------------|
| 方法 | 优 点 | 缺点 | 是否 适 合本 题 |
| Z-N临界比例法 | 简单 | 超调大、对离散系统不稳定 | ❌ |
| 经验试凑法 | 灵活 | 依赖经验 | ✅ |
| MATLAB pidtune | 快速 | 黑箱 | ✅ |
| 本题方法(仿真+调整) | 可控+精确 | 需要仿真 | ⭐最优 |
本文未采用传统的 Ziegler--Nichols 临界比例法进行 PID 参数整定。该方法基于系统临界振荡点进行经验公式计算,但在数字控制系统中,由于零阶保持器和采样延迟的影响,临界振荡点难以准确获取,且整定结果通常具有较大超调,不利于性能优化。
因此,本文采用"仿真试凑与性能指标优化相结合"的方法进行参数整定。具体步骤为:首先仅保留比例环节,通过调整 KpK_pKp 提高系统响应速度;随后引入积分环节,通过调节 KiK_iKi 消除稳态误差;最后加入微分环节,通过调节 KdK_dKd 提高系统阻尼、减小超调并缩短调节时间。在 MATLAB 仿真环境下,通过多组参数对比分析,最终选取一组综合性能较优的 PID 参数。
s = tf('s');
G = 1 / ((s + 1) * (s + 2));
% 使用pidtune自动整定PID参数
[pid, info] = pidtune(G, 'PID');
% 查看整定后的PID参数
disp('整定后的PID参数:');
disp(pid);
% 绘制闭环阶跃响应
T = feedback(pid * G, 1);
step(T);
title('自动整定后的闭环阶跃响应');

