基于PID的Simulink控制系统仿真

在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。

PID控制原理

在模拟控制系统中,控制器最常用的控制规律是PID控制。模拟PID控制系统原理框图如图7-1所示。系统由模拟PID控制器和被控对象组成。

image-20231019174019421

PID控制器是一种线性控制器,它根据给定值y_d\left(t\right)与实际输出值y\left(t\right)构成控制偏差:

error(t)=y_d(t)-y(t)

PID的控制规律为:

u\left(t\right)=k_p\left[error\left(t\right)+\frac1{T_1}\int_0^terror\left(t\right)dt+\frac{T_Dderror(t)}{dt}\right]

或可以写成传递函数的形式,

G(s)=\frac{U(s)}{E\left(s\right)}=k_{p}\left(1+\frac1{T_{s}s}+T_{D}s\right)

式中,k_p为比例系数,T_1积分时间常数,T_D为微分时间常数。

基于PID的控制仿真

程序进行仿真

根据PID控制算法,对下列对象进行控制:

G\left(s\right)=\frac{400}{s^2+50s}

PID控制参数为:k_p = 8, k_i = 0.10, k_d = 10

MATLAB程序如下:

%%
%增量式PID Increment PID Controller
clc% 清屏
clear all;%删除workplace变量
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;             %Calculating P
    x(2)=error-2*error_1+error_2;   %Calculating D
    x(3)=error;                     %Calculating I

    error_2=error_1;
    error_1=error;
end
figure(1);
plot(time,yd,'r',time,y,'b','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
grid on
title('增量式PID跟踪响应曲线')
legend('Ideal position signal','Position tracking');
figure(2);
plot(time,yd-y,'r','linewidth',2);
xlabel('time(s)');ylabel('error');
grid on
title('增量式PID跟踪误差');

image-20231019175606806

image-20231019175633296

使用Simulink进行仿真

采用MATLAB/Simulink中PID控制器进行模型控制,搭建相应的PID控制仿真文件如图7-4所示:

image-20231019180158337

PID控制器参数设置如图7-5所示:
image-20231019180233177

PID控制参数为:k_p = 8, k_i = 0.10, k_d = 10,对其进行仿真输出图形如图所示:

image-20231019180421707

自己搭建PID控制器进行仿真

image-20231019180651710

对应的控制输出如图所示:

image-20231019180822768

基于S函数的PID控制系统仿真

考虑一电动机被控对象传递函数:

G\left(s\right)=\frac1{0.0067s^2+0.1s}

采用MATLAB脚本文件,利用ode45的方法求解该连续对象方程,输入指令方程为一正弦函数:

y_d(k)=0.5\sin(2\pi t)

采用PID控制方法设计控制器,其中采用PID参数为:k_p = 20, k_d = 0.5

编写MATLAB PID控制程序如下:

clear all;
close all;
 
ts=0.001;  %Sampling time
xk=zeros(2,1);
e_1=0;
u_1=0;
 
for k=1:1:2000
time(k) = k*ts;
 
yd(k)=0.50*sin(1*2*pi*k*ts);
  
para=u_1;
tSpan=[0 ts];
[tt,xx]=ode45('ysw13_3plant',tSpan,xk,[],para);
xk = xx(length(xx),:);
y(k)=xk(1); 
e(k)=yd(k)-y(k);
de(k)=(e(k)-e_1)/ts; 
 
u(k)=20.0*e(k)+0.50*de(k);
%Control limit
if u(k)>10.0
   u(k)=10.0;
end
if u(k)<-10.0
   u(k)=-10.0;
end
 
u_1=u(k);
e_1=e(k);
end
figure(1);
plot(time,yd,'r',time,y,'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('实际信号','仿真结果'); 
figure(2);
plot(time,yd-y,'r','linewidth',2);
xlabel('time(s)'),ylabel('误差');
title('误差')


function dy = PlantModel(t,y,flag,para)
u=para;
J=0.0067;B=0.1;
 
dy=zeros(2,1);
dy(1) = y(2);
dy(2) = -(B/J)*y(2) + (1/J)*u;
end

image-20231019181817063

image-20231019181828917

考虑被控对象为三阶传递函数

G(\mathrm{s})=\frac{523.5}{s^3+87.35s^2+10.47s}

采用Simulink模块与Interpreted MATLAB Fcn函数相结合的形式,利用ode45的方法求解。

输入指令方程为一正弦函数

y_d\left(k\right)=0.05\sin(2\pi t)

采用PID控制方法设计控制器,其中采用PID参数为:k_p = 2.5, k_i = 0.02, k_d = 0.5,搭建PID控制仿真模型,如图所示:

image-20231019192133372

image-20231019192351325

image-20231019192406123

其中控制器程序如下:

function [u]=pidsimf(u1,u2)
persistent pidmat errori error_1
t=u1;
if t==0
   errori=0;
   error_1=0;
end   
 
kp=2.5;
ki=0.020;
kd=0.50;
 
error=u2;
errord=error-error_1;
errori=errori+error;
 
u=kp*error+kd*errord+ki*errori;
error_1=error;
end

​ 运行仿真程序,仿真数据自动保存到工作区中,采用如下画图程序进行数据显示。

close all;
figure(1);
plot(t,y(:,1),'r',t,y(:,2),'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('实际信号','仿真结果');
figure(2);
plot(t,y(:,1)-y(:,2),'r','linewidth',2);
xlabel('time(s)'),ylabel('误差');
title('误差')

​ 运行画图程序输出图形如图所示。

image-20231019192609778

image-20231019193030018

采用Simulink模块与S函数的方法进行对象建模求解

输入指令方程为一正弦函数

y_d\left(k\right)=0.05\sin(2\pi t)

采用PID控制方法设计控制器,其中采用PID参数为:k_p = 1.5, k_i = 2.0, k_d = 0.05,搭建PID控制仿真模型,如图所示:

image-20231019193841026

function [sys,x0,str,ts]=exp_pidf(t,x,u,flag)
switch flag,
case 0           % initializations
    [sys,x0,str,ts] = mdlInitializeSizes;
case 2           % discrete states updates
    sys = mdlUpdates(x,u);
case 3           % computation of control signal
%    sys = mdlOutputs(t,x,u,kp,ki,kd,MTab);
    sys=mdlOutputs(t,x,u);
case {1, 4, 9}   % unused flag values
    sys = [];
otherwise        % error handling
    error(['Unhandled flag = ',num2str(flag)]);
end;

%==============================================================
% when flag=0, perform system initialization
%==============================================================
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;        % read default control variables
sizes.NumContStates = 0; % no continuous states
sizes.NumDiscStates = 3; % 3 states and assume they are the P/I/D components
sizes.NumOutputs = 1;    % 2 output variables: control u(t) and state x(3)
sizes.NumInputs = 2;     % 4 input signals
sizes.DirFeedthrough = 1;% input reflected directly in output
sizes.NumSampleTimes = 1;% single sampling period
sys = simsizes(sizes);   % 
x0 = [0; 0; 0];          % zero initial states
str = []; 
ts = [-1 0];             % sampling period
%==============================================================
% when flag=2, updates the discrete states
%==============================================================
function sys = mdlUpdates(x,u)
T=0.001;
sys=[ u(1); 
      x(2)+u(1)*T;
      (u(1)-u(2))/T];

%==============================================================
% when flag=3, computates the output signals
%==============================================================
function sys = mdlOutputs(t,x,u,kp,ki,kd,MTab)

kp=1.5;
ki=2.0;
kd=0.05;

%sys=[kp,ki,kd]*x;
sys=kp*x(1)+ki*x(2)+kd*x(3);

运行仿真程序,仿真数据自动保存到工作区中,采用如下画图程序进行数据显示。

close all;
figure(1);
plot(t,y(:,1),'r',t,y(:,2),'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('实际信号','仿真结果');
figure(2);
plot(t,y(:,1)-y(:,2),'r','linewidth',2);
xlabel('time(s)'),ylabel('误差');
title('误差')

image-20231019193958369

基于PID的倒立摆小车控制仿真

暂时省略,参考意义不大:

直线式倒立摆中,小车只有水平方向的直线运动,模型的非线性因素比较少,有利于倒立摆的控制;而在直线式倒立摆中,旋臂处在绕轴转动的状态,同时具有水平和垂直两个方向的运动,模型中非线性因素较多,对倒立摆的控制算法较高。