目录
前言
1.什么叫终端滑模控制?
所谓终端滑模控制就是在普通的滑动超平面的设计中引入非线性函数,简单的说就是滑模面有非线性项。
2.为什么要引入终端滑模控制?
因为普通的滑模控制是系统到达滑动模态后,可以通过调参使跟踪误差渐进收敛到0,但是可能由于抖阵无法在有限时间收敛为0,通过构造terminal滑模面,使误差在有限时间收敛到0。
往期文章:
基于LMI的线性化系统控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
基于LMI的线性系统滑模鲁棒控制_Mr. 邹的博客-CSDN博客
使用hinfric和hinflmi函数设计H∞输出反馈控制器(含白嫖代码)_Mr. 邹的博客-CSDN博客
VSC/SMC(一)——基于趋近律的滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客_滑模面的选取
VSC/SMC(二)——基于趋近律的滑模鲁棒控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
VSC/SMC(三)——基于饱和切换函数的滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
VSC/SMC(四)——基于线性化反馈的滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
VSC/SMC(五)——基于参考模型的滑模控制_Mr. 邹的博客-CSDN博客
基于参考模型的主动悬架滑模控制(详细滑模控制推导)_Mr. 邹的博客-CSDN博客
VSC/SMC(六)——基于低通滤波器的滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
VSC/SMC(七)——基于高增益观测器的滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
VSC/SMC(八)——基于慢时变干扰观测器的滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客_慢时变干扰观测器 SMC/VSC(九)——控制器容错自适应滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
VSC/SMC(十)——主辅电机的协调滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
SMC/VSC(十一)——基于趋近律的离散滑模控制(白嫖程序模型)_Mr. 邹的博客-CSDN博客
想学好滑模控制器和LMI控制的的同学,欢迎白嫖我的程序和模型!
1.非线性系统
(公式太难敲了,看懂了就直接复制粘贴刘老师书中的内容上来了,仅作为学术交流,侵权删!谢谢理解!)
2. 控制器设计
关键在于滑模面的设计,求取控制律还是“三部曲”:
①选取滑模面s
②求解滑模导函数s',令其s' = 0,求到等效项ueq;选取趋近律,求得鲁棒项usw
③Lyapunov证明闭环系统稳定性。
具体例子可以查看我的往期文章,有几篇详细推导。
3.Simulink仿真分析
可以看到由于需要使用到e(0)及其导数,即Terminal函数p(t)多项式的系统需要"固定",所以需要使用持久变量/全局静态变量Persistent,其与全局变量Global类似,但又不同:
3.1全局变量Global和持久变量Persistent
Perisistent:
①和global变量很像,和global不同的是,persistent只被定义persistent的函数所知晓/访问,其他函数无法访问或改变它的值。当m文件被从内存中清除或m文件改变时,persistent变量才会被清除。
②如果persistent变量中第一次使用时未进行初始化赋值,则初始化为空矩阵。
③如果workspace中已经有同名变量,则声明persistent变量会出错。
Global:
用matlab写代码时,如果有多个.m文件,且之间存在相互调用关系;每个.m文件中的变量,都为局部变量,都有自己的工作区域/Workspace,当函数调用结束之后,其变量的声明周期也就结束了(记住,变量的声明周期随着子函数的结束而结束);
如果定义了全局变量/global,则需要注意几点:
1、在每一个子函数/.m文件中,都需要先声明,然后再进行操作;
2、global/全局变量,只占一个workspace,即在某一个地方修改,同时在变量存在的地方全部修改;
3、定义多个global/全局变量方式为: global var1 var2 var3 ……;
4、去掉/消除某一个或多个全局变量方式为:clear var1 var2 var3……;
以上全局变量和局部静态变量解释来自:matlab 编程之全局变量(global)和永久变量(persistent)_枯荣有常的博客-CSDN博客_global变量
3.2 S函数编写被控对象
function [sys,x0,str,ts] = spacemodel(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;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;%按理输入u和输出有直接关系,为什么设置为0也可以仿真?
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0.5;0];
str = [];
ts = [0 0];
function sys=mdlDerivatives(t,x,u)
dt=3.0*sin(2*pi*t);
sys(1)=x(2);
sys(2)=-25*x(1)+133*u+dt;
function sys=mdlOutputs(t,x,u)
sys = x;
3.2 求解Terminal函数多项式p(t)
close all;
clear all;
A1=[1 1 1;3 4 5;6 12 20];
b1=[-1;0;0];
x1=A1\b1;
A2=[1 1 1;3 4 5;6 12 20];
b2=[-1;-1;0];
x2=A2\b2;
A3=[1 1 1;3 4 5;6 12 20];
b3=[-1/2;-1;-1];
x3=A3\b3;
3.3 Simulink模型
3.4 仿真结果
这里为了消抖,使用饱和切换函数。
3.4.1 Terminal指定收敛时间T = 3
3.4.2 Terminal指定收敛时间T = 0.5
3.5 结论
优点:可以看到Termianl滑模控制最大的优点在于稳态误差可以调整趋近时间快速趋于0,并且控制力的大小以及跟踪抖阵几乎不增加。
缺点:但是滑模面中的Terminal函数的构造较难;在实际设计控制器中会导致变量较多。
4 学习问题
①对于持久变量在这里控制器的作用没有理解到位
②如果换了系统,那么Terminal多项式该如何构造?
③刘老师书中描述和代码有些不符,所以读者需要自己去设计学习,否则只是过一遍,达不到掌握的效果。
如果有帮助,麻烦帮忙点个赞是我最大的分享动力,非常感谢!
注:仅为便利自己学习,错误在所难免,如有侵权,请联系删除,有兴趣的学者可以参考学习交流,谢谢!
参考资料:
《滑模变结构控制MATLAB仿真:基本理论与设计方法第四版》---刘金琨