
基于PID的Simulink控制系统仿真
基于PID的Simulink控制系统仿真
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。
PID控制原理
在模拟控制系统中,控制器最常用的控制规律是PID控制。模拟PID控制系统原理框图如图7-1所示。系统由模拟PID控制器和被控对象组成。
PID控制器是一种线性控制器,它根据给定值y_d\left(t\right)与实际输出值y\left(t\right)构成控制偏差:
PID的控制规律为:
或可以写成传递函数的形式,
式中,k_p为比例系数,T_1积分时间常数,T_D为微分时间常数。
基于PID的控制仿真
程序进行仿真
根据PID控制算法,对下列对象进行控制:
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跟踪误差');
使用Simulink进行仿真
采用MATLAB/Simulink中PID控制器进行模型控制,搭建相应的PID控制仿真文件如图7-4所示:
PID控制器参数设置如图7-5所示:
PID控制参数为:k_p = 8, k_i = 0.10, k_d = 10,对其进行仿真输出图形如图所示:
自己搭建PID控制器进行仿真
对应的控制输出如图所示:
基于S函数的PID控制系统仿真
考虑一电动机被控对象传递函数:
采用MATLAB脚本文件,利用ode45的方法求解该连续对象方程,输入指令方程为一正弦函数:
采用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
考虑被控对象为三阶传递函数
采用Simulink模块与Interpreted MATLAB Fcn函数相结合的形式,利用ode45的方法求解。
输入指令方程为一正弦函数
采用PID控制方法设计控制器,其中采用PID参数为:k_p = 2.5, k_i = 0.02, k_d = 0.5,搭建PID控制仿真模型,如图所示:

其中控制器程序如下:
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('误差')
运行画图程序输出图形如图所示。
采用Simulink模块与S函数的方法进行对象建模求解
输入指令方程为一正弦函数
采用PID控制方法设计控制器,其中采用PID参数为:k_p = 1.5, k_i = 2.0, k_d = 0.05,搭建PID控制仿真模型,如图所示:
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('误差')
基于PID的倒立摆小车控制仿真
暂时省略,参考意义不大:
直线式倒立摆中,小车只有水平方向的直线运动,模型的非线性因素比较少,有利于倒立摆的控制;而在直线式倒立摆中,旋臂处在绕轴转动的状态,同时具有水平和垂直两个方向的运动,模型中非线性因素较多,对倒立摆的控制算法较高。
- 感谢你赐予我前进的力量