1. PID控制器参数整定与仿真
任务说明
本案例要求实现一个离散PID控制器,采用Ziegler-Nichols开环阶跃响应法整定参数,并在Simulink中搭建闭环仿真模型验证阶跃响应,最终分析超调量与调节时间。为便于独立复现,以下同时提供MATLAB脚本(含仿真替代方案)与Simulink模型构建步骤。
1. Ziegler-Nichols参数整定
采用开环阶跃响应法(Process Reaction Curve):对被控对象施加单位阶跃,记录响应曲线,提取等效一阶惯性加纯滞后模型的参数K(稳态增益)、L(纯滞后时间)、T(时间常数),然后按Ziegler-Nichols第一法查表计算PID参数。
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搭建步骤:
- 新建模型,添加
Step模块(Final value=1)、Sum(加减)、PID Controller模块; - 双击PID模块,选择Time domain为Continuous time,输入整定后的Kp、Ti、Td;
- 添加
Transfer Fcn(分子[K_obj],分母[T_obj 1]); - 添加
Transport Delay(Time delay = L); - 连接形成闭环,输出接
Scope; - 仿真时间设为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版本、离散化方法略有差异,但超调量范围与调节时间数量级应保持一致。