ADRC自抗扰控制器的simulink仿真,ESO和TD等模块使用S函数开发
最近在研究控制算法这块,ADRC(自抗扰控制器)着实引起了我的兴趣。今天就来跟大家分享一下ADRC在Simulink中的仿真实现,特别是ESO(扩张状态观测器)和TD(跟踪微分器)模块使用S函数开发的过程。
ADRC简介
ADRC是一种不依赖于精确模型的新型控制技术,它把系统中的未知动态当作扰动,通过扩张状态观测器对扰动进行实时估计和补偿,从而提高系统的控制性能。简单来说,它就像是给控制系统安装了一双“眼睛”,能实时“看”到外界干扰并及时做出调整。
Simulink仿真搭建
ESO模块的S函数开发
ESO在ADRC里起着至关重要的作用,它负责估计系统的状态和总扰动。下面咱们就看看ESO的S函数代码实现。
function [sys,x0,str,ts] = ESO(t,x,u,flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; case 1, sys=mdlDerivatives(t,x,u); case 3, sys=mdlOutputs(t,x,u); case {2, 4, 9 } sys = []; otherwise error(['Unhandled flag = ',num2str(flag)]); end % 初始化部分 function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 3; % ESO的状态变量个数 sizes.NumDiscStates = 0; sizes.NumOutputs = 3; % 输出个数 sizes.NumInputs = 2; % 输入个数,一般是系统输出和控制输入 sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = [0;0;0]; % 初始状态 str = []; ts = [0 0]; % 导数计算部分 function sys=mdlDerivatives(t,x,u) beta1 = 100; beta2 = 200; beta3 = 500; y = u(1); u0 = u(2); e = y - x(1); sys(1) = x(2) + beta1*e; sys(2) = x(3) + beta2*e - 5*u0; sys(3) = beta3*e; % 输出计算部分 function sys=mdlOutputs(t,x,u) sys = x;这段代码中,mdlInitializeSizes函数用于初始化S函数的基本参数,比如状态变量个数、输入输出个数等。mdlDerivatives函数则根据ESO的数学模型来计算状态变量的导数,这里通过设定beta1、beta2、beta3等参数来调整观测器的性能。mdlOutputs函数简单地将当前的状态变量作为输出。
TD模块的S函数开发
TD主要用于安排过渡过程,跟踪输入信号并给出其微分信号。
function [sys,x0,str,ts] = TD(t,x,u,flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; case 1, sys=mdlDerivatives(t,x,u); case 3, sys=mdlOutputs(t,x,u); case {2, 4, 9 } sys = []; otherwise error(['Unhandled flag = ',num2str(flag)]); end % 初始化部分 function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 2; % TD的状态变量个数 sizes.NumDiscStates = 0; sizes.NumOutputs = 2; % 输出个数 sizes.NumInputs = 1; % 输入个数,一般是参考输入 sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = [0;0]; % 初始状态 str = []; ts = [0 0]; % 导数计算部分 function sys=mdlDerivatives(t,x,u) r = 10; h = 0.01; fh0 = x(2); fh1 = r*(sign(x(1)-u+fh0*h/2)-sign(x(1)-u-fh0*h/2)); sys(1) = x(2); sys(2) = fh1; % 输出计算部分 function sys=mdlOutputs(t,x,u) sys = x;在TD的S函数中,mdlInitializeSizes同样负责初始化相关参数。mdlDerivatives函数根据TD的算法,通过设置r(速度因子)和h(采样时间)等参数来计算状态变量的导数。mdlOutputs函数将TD的两个状态变量输出,分别为跟踪信号和其微分信号。
整体仿真模型搭建
在Simulink中,将开发好的ESO和TD的S函数模块添加进来,再结合系统模型和控制器部分,就可以搭建出完整的ADRC仿真模型。通过调整各个模块的参数,可以观察系统在不同情况下的响应,比如抗干扰能力、跟踪性能等。
ADRC自抗扰控制器的simulink仿真,ESO和TD等模块使用S函数开发
通过这次基于S函数开发ESO和TD模块的ADRC Simulink仿真实践,对ADRC的工作原理和实现细节有了更深入的理解。也希望这篇博文能给同样在研究ADRC的小伙伴们一些启发,一起探索控制领域的奇妙世界!