PID控制系统仿真
什么是PID
PID 算法可以用于温度控制、水位控制、飞行姿态控制等领域。
后面我们通过PID 控制电机进行说明。
PID控制仿真示例
例 对以下对象进行PID控制,PID控制参数为
k
p
=
8
,
k
i
=
0.10
,
k
d
=
10
k_p=8, k_i=0.10, k_d=10
kp=8,ki=0.10,kd=10。
G
(
s
)
=
400
s
2
+
50
s
G(s) = \frac{400}{s^2+50s}
G(s)=s2+50s400
解:(1) 采用MATLAB程序编程实现PID控制
% 增量式PID控制器
clc, clear, close all
ts = 0.001; % 采样时间
sys = tf(400, [1,50,0]); % 传递函数
dsys = c2d(sys, ts, 'z'); % 连续模型离散化
[num, den] = tfdata(dsys, 'v'); % 获得分子分母
% PID控制量
u_1 = 0.0; u_2 = 0.0; u_3 = 0.0;
y_1 = 0; y_2 = 0; y_3 = 0;
x = [0, 0, 0]';
% 误差
error_1 = 0;
error_2 = 0;
for k = 1:1:1000
time(k) = k*ts;
yd(k) = 1.0;
% PID参数
kp = 8; % 比例参数
ki = 0.10; % 积分参数
kd = 10; % 微分参数
du(k) = kp*x(1) + kd*x(2) + ki*x(3);
u(k) = u_1 + du(k);
if u(k) >= 10
u(k) = 10;
end
if u(k) <= -10
u(k) = -10;
end
y(k) = -den(2)*y_1 - den(3)*y_2 + num(2)*u_1 + num(3)*u_2;
error = yd(k) - y(k);
u_3 = u_2; u_2 = u_1; u_1 = u(k);
y_3 = y_2; y_2 = y_1; y_1 = y(k);
x(1) = error - error_1; % 计算 P
x(2) = error - 2*error_1 + error_2; % 计算 D
x(3) = error; % 计算 I
error_2 = error_1;
error_1 = error;
end
figure(1);
plot(time, yd, 'r', time, y, 'b', 'LineWidth', 2);
xlabel('时间/s'); ylabel('yd,y'); grid on
title('增量式PID追踪响应曲线')
legend('理想位置信号','位置追踪');
figure(2);
plot(time, yd-y, 'r', 'LineWidth',2);
xlabel('时间/s'); ylabel('误差'); grid on
title('增量式PID跟踪误差')
增量式PID阶跃结果如图所示。
(2) 采用MATLAB/Simulink中PID控制器进行模型控制 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0837e0a3b6644003ba7a1c6f18e8da52.png) * *使用到的模块:* Step、Add、PID Controller、Transfer Fcn、Scope Step模块阶跃时间: 0 对其仿真,输出图形如图所示(停止时间0.2s) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3ef0f37c117b47a0ae0f44d01a5729ec.png)(3) 自行搭建PID控制器
- 使用到的模块: Step、Add、Gain、Integrator、Derivative、Mux、Transfer Fcn、Scope
相应的控制输出结果如图所示(停止时间10s)
例 被控对象为如下所示的三阶传递函数,输入一正弦函数 y d ( k ) = 0.05 sin ( 2 π t ) y_d(k)=0.05\sin(2\pi t) yd(k)=0.05sin(2πt),试采用PID控制方法在Simulink中设计控制器,其中PID参数为 k d = 0.5 , k i = 0.02 , k d = 0.5 k_d=0.5, k_i=0.02, k_d=0.5 kd=0.5,ki=0.02,kd=0.5。
G ( s ) = 523500 s 3 + 87.35 s 2 + 10470 s G(s) = \frac{523500}{s^3+87.35s^2+10470s} G(s)=s3+87.35s2+10470s523500
解: 采用Simulink模块与Interpreted MATLAB Fcn函数相结合的形式,利用ode45的方法求解。搭建PID控制仿真模型如图所示。
模块参数设置如下:
其中控制器程序如下:
function [u]=Pidsimfcontrol(u1,u2)
persistent errori error_1
t=u1;
if t==0
errori=0;
error_1=0;
end
kp=2.5;
ki=0.02;
kd=0.5;
error=u2;
errord=error-error_1;
errori=errori+error;
u=kp*error+kd*errord+ki*errori;
error_1=error;
示波器输出结果如图所示(停止时间1s)
仿真数据自动保存到工作区中,运行画图程序
close all;
t = out.t;
y = out.y;
figure(1);
plot(t, y(:,1), 'r', t, y(:,2), 'k', 'LineWidth', 2);
xlabel('时间(s)'); ylabel('yd,y');
legend('实际信号', '仿真结果');
figure(2);
plot(t, y(:,1)-y(:,2), 'r', 'LineWidth', 2);
xlabel('时间(s)'); ylabel('误差');
title('误差')
画图程序输出图形如图所示