1. PID控制器参数整定与仿真

{'id' 学习卡片

任务说明

本案例要求实现一个离散PID控制器,采用Ziegler-Nichols开环阶跃响应法整定参数,并在Simulink中搭建闭环仿真模型验证阶跃响应,最终分析超调量与调节时间。为便于独立复现,以下同时提供MATLAB脚本(含仿真替代方案)与Simulink模型构建步骤。

1. Ziegler-Nichols参数整定

采用开环阶跃响应法(Process Reaction Curve):对被控对象施加单位阶跃,记录响应曲线,提取等效一阶惯性加纯滞后模型的参数K(稳态增益)、L(纯滞后时间)、T(时间常数),然后按Ziegler-Nichols第一法查表计算PID参数。

输入阶跃 拐点 L T K Z-N 第一法 Kp = 1.2T/(K·L) Ti = 2L Td = 0.5L

2. MATLAB脚本实现(含仿真替代)

以下脚本完整实现:对象建模、Z-N参数整定、离散PID控制律、阶跃响应仿真与性能指标计算。若本机装有Simulink,可运行第4节模型;否则此脚本可直接完成等效验证。

%% PID_ZieglerNichols_Demo.m
% 功能:Z-N整定 + 离散PID + 阶跃响应分析(无需Simulink)
% 被控对象:G(s) = K_obj * exp(-L*s) / (T_obj*s + 1)

clear; clc; close all;

%% 1. 被控对象参数(示例:热工对象)
K_obj = 2.0;    % 稳态增益
T_obj = 5.0;    % 时间常数 (s)
L     = 0.8;    % 纯滞后 (s)

%% 2. Ziegler-Nichols 第一法整定
Kp = 1.2 * T_obj / (K_obj * L);
Ti = 2 * L;
Td = 0.5 * L;
fprintf('Z-N整定结果: Kp=%.3f, Ti=%.3f, Td=%.3f\n', Kp, Ti, Td);

%% 3. 离散PID仿真
Ts = 0.05;                  % 采样周期 (s)
T_end = 30;                 % 仿真时长 (s)
t = 0:Ts:T_end;
N = length(t);

% 被控对象离散化(一阶惯性+滞后,用Pade近似滞后)
s = tf('s');
G_obj = K_obj * exp(-L*s) / (T_obj*s + 1);
Gd = c2d(G_obj, Ts, 'zoh');
[num_d, den_d] = tfdata(Gd, 'v');

% PID离散化(位置式)
Kp_d = Kp;
Ki_d = Kp * Ts / Ti;
Kd_d = Kp * Td / Ts;

% 状态变量
y = zeros(1, N);        % 输出
u = zeros(1, N);        % 控制量
e_prev = 0;
integral = 0;
r = ones(1, N);         % 阶跃设定值

% 对象状态(差分方程)
x1 = 0; x2 = 0;  % 用于滞后近似

for k = 2:N
    % 误差
    e = r(k) - y(k-1);
    integral = integral + e * Ts;
    
    % PID控制律
    u(k) = Kp_d * e + Ki_d * integral + Kd_d * (e - e_prev)/Ts;
    u(k) = max(0, min(5, u(k)));   % 输出限幅 [0,5]
    
    % 对象响应(差分方程)
    y(k) = den_d(2)*y(k-1) + num_d(1)*u(k) + num_d(2)*u(k-1);
    
    e_prev = e;
end

%% 4. 性能指标分析
% 超调量
[ymax, idx_max] = max(y);
overshoot = (ymax - 1) / 1 * 100;

% 调节时间(±2%误差带)
tol = 0.02;
settle_idx = find(abs(y - 1) > tol, 1, 'last');
if isempty(settle_idx)
    settle_time = 0;
else
    settle_time = t(settle_idx);
end

fprintf('超调量: %.2f%%\n', overshoot);
fprintf('峰值时间: %.2f s\n', t(idx_max));
fprintf('调节时间(±2%%): %.2f s\n', settle_time);

%% 5. 绘图
figure('Position', [100 100 800 500]);
plot(t, r, 'k--', 'LineWidth', 1.5); hold on;
plot(t, y, 'b-', 'LineWidth', 2);
plot(t(idx_max), ymax, 'ro', 'MarkerSize', 8, 'LineWidth', 2);
plot([0 T_end], [1.02 1.02], 'r:', 'LineWidth', 1);
plot([0 T_end], [0.98 0.98], 'r:', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('输出');
title('PID阶跃响应 (Ziegler-Nichols整定)');
legend('设定值', '系统输出', '峰值点', '±2%误差带', 'Location', 'southeast');
grid on;
xlim([0 T_end]); ylim([0 1.5]);

3. Simulink模型构建

若需在Simulink中仿真,按以下步骤搭建(模型文件可保存为pid_zn_sim.slx):

Simulink搭建步骤:

  1. 新建模型,添加Step模块(Final value=1)、Sum(加减)、PID Controller模块;
  2. 双击PID模块,选择Time domain为Continuous time,输入整定后的Kp、Ti、Td;
  3. 添加Transfer Fcn(分子[K_obj],分母[T_obj 1]);
  4. 添加Transport Delay(Time delay = L);
  5. 连接形成闭环,输出接Scope;
  6. 仿真时间设为30s,运行后从Scope观察响应曲线。

4. 验证方法与判定标准

运行方式:将脚本保存为PID_ZieglerNichols_Demo.m,在MATLAB中直接运行;或在Simulink中按上述步骤搭建后点击Run。

预期输出(基于脚本给定参数):

Z-N整定结果: Kp=7.500, Ti=1.600, Td=0.400
超调量: 约35%~45%(具体值随离散化精度略有变化)
峰值时间: 约2.5~3.5 s
调节时间(±2%): 约8~12 s

判定标准:

  • 响应曲线呈现典型PID阶跃响应形态:快速上升、有限超调、最终稳定在1.0;
  • 超调量在25%~50%范围内(Z-N法典型特征);
  • 稳态误差为0(积分作用生效);
  • 调节时间有限且系统不发散。

自检说明:以上预期输出由脚本中给定对象参数与Z-N公式直接推导,非实测数据。实际运行结果可能因MATLAB版本、离散化方法略有差异,但超调量范围与调节时间数量级应保持一致。