Matlab--积分分离PID控制算法及其仿真

  在普通PID控制中引入积分环节的目的,主要是为了消除静差,提高控制精度。但在过程的启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,致使控制量超过执行机构可能允许的最大动作范围对应的极限控制量,引起系统较大的超调,甚至引起系统较大的振荡。这在生产中是绝对不允许的。
  积分分离控制基本思路是:当被控量与设定值偏差较大时,取消积分作用,以免由于积分作用使系统稳定性降低,超调量增大;当被控量接近给定值时,引入积分控制,以便消除静差,提高控制精度。其具体实现步骤如下;
(1)根据实际情况,人为设定阀值c>0;
(2)当lerror(k)>c时,采用PD控制,可避免产生过大的超调,又使系统有较快的响应;
(3)当error(k)≤c时,采用PID控制,以保证系统的控制精度。
积分分离控制算法可表示: u ( k ) = k p  error  ( k ) + β k i ∑ j = 0 k error ⁡ ( j ) T + k d ( error ⁡ ( k ) − error ⁡ ( k − 1 ) ) / T u(k)=k_{p} \text { error }(k)+\beta k_{i} \sum_{j=0}^{k} \operatorname{error}(j) T+k_{d}(\operatorname{error}(k)-\operatorname{error}(k-1)) / T u(k)=kp error (k)+βkij=0kerror(j)T+kd(error(k)error(k1))/T
式中,T为采样时间;B为积分项的开关系数。 β = { 1 ∣  error  ( k ) ∣ ≤ ε 0 ∣  error  ( k ) ∣ > ε \beta=\left\{\begin{array}{l}{1 | \text { error }(k) | \leq \varepsilon} \\ {0 | \text { error }(k) |>\varepsilon}\end{array}\right. β={1 error (k)ε0 error (k)>ε
根据积分分离式PID控制算法得到其程序框图如图所示。
Matlab--积分分离PID控制算法及其仿真_第1张图片

%Integration Separation PID Controller//积分分离PID控制算法及其仿真
clear all;
close all;

ts=20;
%Delay plant
sys=tf([1],[60,1],'inputdelay',80);      //构造连续函数的模型
dsys=c2d(sys,ts,'zoh');                  //将连续的传递函数离散化
[num,den]=tfdata(dsys,'v');              //该离散化模型的分子分母多项式系数

u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
error_1=0;error_2=0;
ei=0;
for k=1:1:200
time(k)=k*ts;  //时间的采集

%Delay plant   //延迟系统的输出
y(k)=-den(2)*y_1+num(2)*u_5;    

%I separation                         //积分的隔离
yd(k)=40;
error(k)=yd(k)-y(k);
ei=ei+error(k)*ts;

M=2;
if M==1            %Using integration separation
   if abs(error(k))>=30
      beta=0.0;
   elseif abs(error(k))>=20&abs(error(k))<=30
      beta=0.6;
   elseif abs(error(k))>=10&abs(error(k))<=20
      beta=0.9;
   else
      beta=1.0;
   end
elseif M==2
       beta=1.0;   %Not using integration separation
end

kp=0.80;
ki=0.005;
kd=3.0;
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+beta*ki*ei;

if u(k)>=110       % Restricting the output of controller
   u(k)=110;
end
if u(k)<=-110
   u(k)=-110;
end

u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);   
y_3=y_2;y_2=y_1;y_1=y(k);
   
error_2=error_1;
error_1=error(k);
end
figure(1);
plot(time,yd,'r',time,y,'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('Ideal position signal','Position tracking');
figure(2);
plot(time,u,'r','linewidth',2);
xlabel('time(s)');ylabel('Control input');

你可能感兴趣的:(Matlab)