um=6;
kp=0.85;ki=9.0;kd=0.0;
rin=30;
for k=1:1:800 time(k)=k*ts;
u(k)=kp*x(1)+kd*x(2)+ki*x(3);
if u(k)>=um u(k)=um; end
if u(k)<=-um u(k)=-um; end
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;
error(k)=rin-yout(k);
M=2; %M为1或2 if M==1 if u(k)>=um if error(k)>0 alpha=0; else
alpha=1; end
elseif u(k)<=-um if error(k)>0 alpha=1; else
alpha=0; end else
alpha=1; end
elseif M==2 alpha=1; end
u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k);
error_1=error(k); x(1)=error(k);
x(2)=(error(k)-error_1)/ts; x(3)=x(3)+alpha*error(k)*ts; xi(k)=x(3); end M=1;
if M==1 if u(k)>=um
if error(k)>0 alpha=0; else
alpha=1; end
elseif u(k)<=-um if error(k)>0 alpha=1; else alpha=0; end else
alpha=1; end
elseif M==2 alpha=1; end
u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k); error_1=error(k);
x(1)=error(k); x(2)=(error(k)-error_1)/ts; x(3)=x(3)+alpha*error(k)*ts;
xi(k)=x(3);
figure(1); subplot(311);
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('Position tracking'); subplot(312); plot(time,u,'r');
xlabel('time(s)');ylabel('Controller output'); subplot(313); plot(time,xi,'r');
xlabel('time(s)');ylabel('Integration');
输出:
M=1时 Position tracking4020000.10.20.30.4time(s)0.50.60.70.8Controller output100-1000.10.20.30.4time(s)0.50.60.70.8Integration0.10.05000.10.20.30.4time(s)0.50.60.70.8 M=2时
Position tracking50000.10.20.30.4time(s)0.50.60.70.8Controller output100-1000.10.20.30.4time(s)0.50.60.70.8Integration21000.10.20.30.4time(s)0.50.60.70.8 结论:
加抗积分饱和后超调量明显减小,而且系统能较快的达到稳定值,系统的稳定性和精确性得到改善。积分饱和和积分分离是两个不同的概念,从他们的原理可知,积分分离是偏差来决定是否加入积分作用;而积分饱和则是由前一控制器的输出值和当前的偏差值的情况共同决定是否加积分作用。
源程序:
clear all ts=0.001;
sys=tf(5.235e005,[1,87.35,1.047e004,0]); dsys=c2d(sys,ts,'z');
[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; yy_1=0;
error_1=0;error_2=0;ei=0;
sys1=tf([1],[0.04,1]); dsys1=c2d(sys1,ts,'tucsin'); [num1,den1]=tfdata(dsys1,'v'); f_1=0;
for k=1:1:2000 time(k)=k*ts;
rin(k)=1;
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+... num(3)*u_2+num(4)*u_3;
D(k)=0.50*rands(1); yyout(k)=yout(k)+D(k);
filty(k)=-den1(2)*f_1+num1(1)*(yyout(k)+yy_1); error(k)=rin(k)-filty(k);
if abs(error(k))<=0.20 ei=ei+error(k)*ts; else
ei=0; end
kp=0.50;ki=0.10;kd=0.020;
u(k)=kp*error(k)+ki*ei+kd*(error(k)-error_1)/ts;
M=2; %M为1或者2 if M==1
u(k)=u(k); elseif M==2
if abs(error(k))<=0.10 u(k)=0; end end
if u(k)>=10 u(k)=10; end
if u(k)<=-10 u(k)=-10;