ADRC自抗扰实验测试
1.ADRC的MATLAB实验仿真
ADRC主要由三部分组成:
微分跟踪器TD、扩张状态观测器ESO和非线性误差反馈律组成。
本次实验基于韩京清老师提出的非线性ADRC进行实验测试
整体代码如下所示:
clc
clear
close all
h=0.001;%采样时间
h0=10*h;h1=10;
b=2;
c=1.5;%阻尼因子
b0=2;%假设已知参数b
r0=20;r=20;%自己设定的参数
beta1=12;%关键参数,ESO的参数需要调节的
num=1;
den=[1 1 1];
ts=0.001;
sys=tf(num,den);
dsys=c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');
y_1=0.0;y_2=0.0;
u_1=0.0;u_2=0.0;
e_1=0.0;
delta=8*h;
tend=25;
t=0:h:tend;
v=sin(t);
dv=cos(t);
x1=zeros(tend/h,1);
x2=zeros(tend/h,1);
z1=zeros(tend/h,1);
z2=zeros(tend/h,1);
z3=zeros(tend/h,1);
e1=zeros(tend/h,1);
e2=zeros(tend/h,1);
u0=zeros(tend/h,1);
u=zeros(tend/h+1,1);
y=zeros(tend/h+1,1);
kasy=zeros(tend/h,1);
%%
for k=1:1:tend/h
% TD微分跟踪以及过渡过程:
fh=fhan((x1(k)-v(k)),x2(k),r0,h0);
x1(k+1)=x1(k)+h*x2(k);
x2(k+1)=x2(k)+h*fh;
% NLSEF函数设计
e1(k)=x1(k)-z1(k);
e2(k)=x2(k)-z2(k);
%u0(k)=fhan(e1(k),c*e2(k),r,h1);
u0(k)=50*fal(e1(k),0.8,delta)+50*fal(e2(k),1.5,delta);
u(k)=(u0(k)-z3(k))/b0;
%被控对象传函描述
%二阶系统被控对象传函
y(k)=-den(3)*y_2-den(2)*y_1+num(2)*u_1+num(3)*u_2;
%扩张状态观测ESO设计
kasy(k)=z1(k)-y(k);
z1(k+1)=z1(k)+h*(z2(k)-beta1*kasy(k));
z2(k+1)=z2(k)+h*(z3(k)-beta1*fal(kasy(k),1/2,delta)+b*u(k));
z3(k+1)=z3(k)-h*beta1*fal(kasy(k),1/4,delta);
%更新状态
u_1=u(k);
y_2=y_1;
y_1=y(k);
end
%%
figure(1)
plot(t,v,t,z1,'linewidth',2)
legend("v(t)","z1(t)")
grid on
figure(2)
plot(t,y,t,v,'linewidth',2)
legend("y(t)","v(t)")
grid on
figure(3)
plot(t,z3,'linewidth',2)
ADRC测试结果验证
状态观测器构建的状态z1可以有效跟踪上输入参数v,验证ESO有效性;
系统输出可以有效跟上模型输入v,验证了ADRC模型有效性。
与PID控制器的比较
在相同被控对象传函的条件下,进行比较:
PID测试部分代码如下:
clc
clear
close all
ts=0.001;
sys=tf(1,[1,1,1]);
dsys=c2d(sys,ts,'zoh')
[num,den]=tfdata(dsys,'v')
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
e_1=0.0;ei=0.0;
yd=1.0;
kp=8;ki=0.5;kd=0.1;
for k=1:1:30000
time(k)=k*ts;
y(k)=-den(3)*y_2-den(2)*y_1+num(2)*u_1+num(3)*u_2;
yd(k)=sin(k*ts);
e(k)=yd(k)-y(k);
ei=e(k)*ts+ei;
u(k)=kp*e(k)+ei*ki+kd*(e(k)-e_1)/ts;
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=y(k);
e_1=e(k);
end
figure(1)
plot(time,y,time,yd,'linewidth',2)
grid on
测试结果如下所示:
同样观察仿真曲线发现,PID同样可以有效跟踪上系统输入。
本次实验仅仅验证了ADRC模型有效性,未验证最优参数,所以结果可能不是最优的。