一、自抗扰控制算法简介
自抗扰控制(Active Disturbance Rejection Control, ADRC)是由韩京清先生于1998年正式提出,其独特之处在于它把作用于被控对象的所有不确定因素归结为“未知扰动”,而用对象的输入输出数据对它进行估计并补偿[1]。自抗扰控制最大的优点就是不要求被控对象有精确的数学模型,是不依赖模型的控制算法,其控制结构图如下:
二、自抗扰控制各模块的Simulink实现
本文以二阶被控对象为基础建立二阶自抗扰控制器的Simulink模型,算法以朱斌老师编著的《自抗扰控制入门》[2]一书为准。
设有二阶对象:
(1)
(2)
- 跟踪-微分器(TD)与安排过渡过程
其算法如下:
对应的离散算法如下:
(3)
式中, x1 为输入信号v的跟踪信号; x2 为 x1 的微分信号; h 为采样周期; r0 决定信号的跟踪速度,称为”速度因子“; h0 对信号的噪声起滤波作用,称为”滤波因子“;fhan() 为一种最速综合函数,其作用为较好的安排参考信号的过渡过程,使之不发生超调。具体形式如下:
(4)
注:标红处原书为 r ,此处更改为 r0 。
其中, r0 、 h0 为控制器可调参数。
跟踪微分器的Simulink模块搭建如下图所示:
图中的Matlab Function模块为 fhan() 函数,内容如下:
% ADRC中的fhan函数(最速综合函数,TD、NLSEF使用)
function fhan = fhan(x1,x2,r0,h0)
d = r0 * (h0^2);
a0 = h0 * x2;
y = x1 + a0;
a1 = sqrt(d * (d + 8 * abs(y)));
a2 = a0 + sign(y) * (a1 - d)/2;
sy = (sign(y + d) - sign(y - d))/2;
a = (a0 + y - a2) * sy + a2;
sa = (sign(a + d) - sign(a - d))/2;
fhan = -r0 * (a / d - sign(a)) * sa - r0 * sign(a);
下面以单位阶跃信号的跟踪效果来验证离散跟踪微分器的能力。搭建Simulink模块如下:
设置解算器为固定步长,采样周期 h=0,01 , h0=0.01 , r0=1 ,得到以下图形:
- 非线性状态误差反馈控制律(NLSEF)
NLSEF有两种组合形式。
- NLSEF第一种形式如下:
(5)
(6)
第一种非线性状态误差反馈控制律的Simulink模块搭建如下图所示:
图中的Matlab Function模块为 fal() 函数,内容如下:
% ADRC中的fal函数(非线性函数,ESO及NLSEF使用)
function y = fal(x,a,delta) % delta代表δ
if abs(x) <= delta % abs()函数为取绝对值或者复数的幅值
y = x / (delta^(1-a));
else
y = sign(x) * (abs(x)^a); % sign()为符号函数
end
2. NLSEF的第二种形式如下:
(7)
式中, c 为阻尼因子; r 为控制器增益; h1 为精度因子; fhan() 与(4)式定义相同。
第二种非线性状态误差反馈控制律的Simulink模块搭建如下图所示:
图中的Matlab Function模块为 fhan() 函数,内容见上文。
- 扩张状态观测器(ESO)
扩张状态观测器是ADRC的控制理念体现,是ADRC中最重要的一环。它将系统总扰动扩张成一个新的系统状态量,通过系统的控制输入、输出将扩张的状态变量观测出来并加以补偿。其算法如下:
(8)
对应的离散形式如下:
(9)
h 为采样周期;其余参数与上文定义相同。
离散形式的扩张状态观测器Simulink模块搭建如下图所示:
下面以正弦信号输入来验证扩张状态观测器的观测效果。搭建Simulink模块如下:
三、结语
- 基于目前对自抗扰控制的认知有限,且对Matlab使用还不太熟悉的情况,文中可能会有些错误的地方,希望能在今后的研究中及时发现错误、改正错误;
- 下一步将对以上模块进行封装并添加自定义库,便于今后的仿真模块搭建。
评论(1)
您还未登录,请登录后发表或查看评论