经典PID控制器的主要缺陷为:阶跃信号下的初始误差较大,系统存在快速性与超调之间的矛盾;微分器对噪声敏感,微分信号容易被噪声淹没失去作用;误差积分容易使系统产生振动,对扰动的抑制响应较慢。
自抗扰控制(ADRC)技术的核心思想是将简单的积分串联型视为标准模型,把系统模型中不同于标准型的部分和外部干扰之和视为总扰动,并将其扩张为一个新的状态。通过状态估计,反馈线性化等将被控对象还原为标准的积分串联系统,最后为该积分串联系统设计状态反馈控制律,简化设计使得结构简单,物理意义明确。
自抗扰控制器由TD、ESO、和NLSEF这三个各具独特优点的主要部分组成,具有结构简单,响应速度快、动静态性能良好、不依赖于被控对象的精确模型、抗扰动能力强等诸多优点,在非线性控制领域以及其他复杂控制环境中得到了大量应用和认可。ADRC中的TD用来安排合适的过渡过程,得到输入信号快速且无超调的跟踪信号和优质的微分信号。ESO是ADRC的核心,其作用是跟踪被控对象的输出,同时给出受控对象的各阶状态变量以及系统总扰动的实时估计,将其补偿到控制器中,实现动态补偿线性化。NLSEF采用非线性函数把TD产生的跟踪及微分信号与ESO给出的状态变量估计值之间的误差进行非线性组合得到初级控制量,然后同总扰动的补偿量一起生成最终的控制信号。
过渡过程中的fhan(x1,x2,r,h)函数计算公式为:
扩张观测器中的fal()函数为:
作为位置控制器的仿真如下:
一阶状态变量为角度,二阶状态变量为转速,控制信号量为指令转速:
令一个高阶状态变量为
上式变为:
式中最后一项f()代表各类误差,内外扰动构成的综合扰动项,表达式计算复杂,建模难以保证准确,扰动变量无法预测,因此很难得到可靠的解析解。但如果能得到这个非实际状态变量的实时近似观测值,同样也可以对系统进行误差补偿。扩张观测器经过非线性逼近的方式,得到足够接近X3的值,那么令,即可达到闭环。
S-Function代码如下:
function [sys,x0,str,ts,simStateCompliance]=sfun_ADRC(t,x,u,flag,r,h)
switch flag
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
case 2
sys=mdlUpdate(t,x,u,r,h);
case 3
sys=mdlOutputs(t,x,u);
case {1,4,9}
sys=[];
otherwise
DAStudio.error('simulink:blocks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=8;
sizes.NumOutputs=8;
sizes.NumInputs=2;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[0;0;0;0;0;0;0;0];
str=[];
ts=[1e-6 0];
simStateCompliance='UnknownSimstate';
function sys=mdlUpdate(t,x,u,r,h)
b=0.01;
h_1=0.1;
h_2=0.01;
delta=0.01;
beta0=0;
beta1=150;
beta2=150;
beta01=100;
beta02=500;
beta03=1000;
alpha0=0.001;
alpha1=5;
alpha2=1.2;
z1=x(1);
z2=x(2);
z3=x(3);
v1=x(4);
v2=x(5);
e0=x(6);
e1=x(7);
uf=x(8);
v=u(1);
y=u(2);
%% TD
v1=v1+h_1*v2;
v2=v2+h_1*fhan(v1-v,v2,r,h);
%% ESO
e=z1-y;
z1=z1+h_2*(z2-beta01*e);
z2=z2+h_2*(z3-beta02*fal(e,0.5,delta)+b*uf);
z3=z3+h_2*(-beta03*fal(e,0.25,delta));
%% NLSEF
e1=v1-z1;
e0=e0+e1;
if e0>1000
e0=1000;
else if e0<-1000
e0=-1000;
end
end
e2=v2-z2;
u0=beta1*fal(e1,alpha1,delta)+beta2*fal(e2,alpha2,delta)+beta0*fal(e0,alpha0,delta);
% u0=-fhan(e1,c*e2,r0,h);
uf=(u0-z3)/b;
if uf>3000
uf=3000;
else if uf<-3000
uf=-3000;
end
end
sys=[z1;z2;z3;v1;v2;e0;e1;uf];
function sys=mdlOutputs(t,x,u)
sys=x;
搭建模型如下:
其中r和h的取值为:
得到的位置响应为:
作为速度控制器:
将机械运动方程改写为:,其中
看作系统内外部扰动之和。
S-Function代码如下:
function [sys,x0,str,ts,simStateCompliance]=sfun_VelADRC2(t,x,u,flag,r,h)
switch flag
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
case 2
sys=mdlUpdate(t,x,u,r,h);
case 3
sys=mdlOutputs(t,x,u);
case {1,4,9}
sys=[];
otherwise
DAStudio.error('simulink:blocks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=8;
sizes.NumOutputs=8;
sizes.NumInputs=2;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[0;0;0;0;0;0;0;0];
str=[];
ts=[1e-6 0];
simStateCompliance='UnknownSimstate';
function sys=mdlUpdate(t,x,u,r,h)
b=10;
h_1=0.1;
h_2=0.01;
delta=0.001;
beta0=10;
beta1=40;
beta2=200;
beta01=100;
beta02=500;
beta03=1000;
alpha0=0.5;
alpha1=0.5;
alpha2=0.25;
z1=x(1);
z2=x(2);
z3=x(3);
v1=x(4);
v2=x(5);
e0=x(6);
e1=x(7);
uf=x(8);
v=u(1);
y=u(2);
%% TD
v1=v1+h_1*v2;
v2=v2+h_1*fhan(v1-v,v2,r,h);
%% ESO
e=z1-y;
z1=z1+h_2*(z2-beta01*e);
z2=z2+h_2*(z3-beta02*fal(e,0.5,delta)+b*uf);
z3=z3+h_2*(-beta03*fal(e,0.25,delta));
%% NLSEF
e1=v1-z1;
e0=e0+e1;
if e0>1000
e0=1000;
else if e0<-1000
e0=-1000;
end
end
e2=v2-z2;
u0=beta1*fal(e1,alpha1,delta)+beta2*fal(e2,alpha2,delta)+beta0*fal(e0,alpha0,delta);
% u0=-fhan(e1,c*e2,r0,h);
uf=(u0-z3)/b;
if uf>7.5
uf=7.5;
else if uf<-7.5
uf=-7.5;
end
end
sys=[z1;z2;z3;v1;v2;e0;e1;uf];
function sys=mdlOutputs(t,x,u)
sys=x;
搭建模型为:
r,h的值及内部模型如下:
得到的位置和速度响应如下:
参考文献:
[1]留若宸. 多电机伺服系统同步控制研究[D].浙江大学,2020.DOI:10.27461/d.cnki.gzjdx.2020.000807. |
[2]黄文俊. 基于优化ADRC的伺服控制技术的研究与开发[D].江南大学,2017. |