VSC/SMC(三)——基于饱和切换函数的滑模控制(含程序模型)

目录

前言

1.倒立摆系统

2.控制律

3.Simulink仿真分析

3.1利用S函数编写被控对象

3.2Simulink模型

 4.结果分析

5.更正


前言

 在上篇文章的基础上,由于符号函数的斗振很大,本文决定采用饱和函数sat(s)代替符号函数sign(s),但其缺点时属于不连续函数,不适合需要对切换函数求导的场合,所以后面本文也会采用连续切换的双曲正切函数代替饱和函数进行仿真分析。

饱和函数:

 其中,Δ为边界层。

双曲正切函数:

其中,ε > 0,ε值的大小决定了双曲正切光滑函数拐点的变化快慢。

取Δ = 0.05,ε = 0.5,s = [-20,20],绘制饱和函数和双曲正切光滑函数曲线,程序如下:

ts = 0.01;
for k = 1:1:4001
    s(k) = (k-1)*ts-20;
    delta = 0.05;%边界层
    kk = 1/delta;
    if abs(s(k))<=delta
        sats(k) = kk*s(k);
    else
        sats(k) = sign(s(k));
    end
    y1 = sats;%饱和函数
    epsilon = 0.5;
    y2(k) = tanh(s(k)/epsilon);%双曲正切光滑函数
end
figure
plot(s,y1,'r',s,y2,'k','linewidth',1)
xlabel('s');ylabel('y')
legend('饱和函数','双曲正切光滑函数')

曲线对比:

 饱和函数和双曲正切光滑函数

对于一般的二阶系统:θ'' = f+g*u+d(t),d(t)为模型的不确定部分+扰动,本文将d(t)选取为sin(t)的扰动,暂不考虑模型的不确定部分。

1.倒立摆系统

2.控制律

这里不再推导,与上篇文章不同在于函数f和g换成了倒立摆的系统方程,符号函数sign(s)换成了饱和函数sat(s),其余一致,即

s = e'+c*e,e = θd-θ

所以s' = e''+c*e' = θd''-θ''+c*e' = θd''-(f+g*u+d(t))+c*e' = 指数趋近律 = -ε*sign(s)-k*s

得到控制律u = (-f+dc+c*e'+ε*sign(s)+k*s)/g。

其中,dc和上篇文章一样,为需要设计满足系统稳定性得有干扰的界相关的数 ,这里直接用上篇文章证明的结论,dc = d2-d1*sign(s)。

3.Simulink仿真分析

本文选取扰动上界dU = 10,扰动下界dL = -10,外部扰动d(t) = sin(t)取理想信号θd(t) = 0.1*sint(t),即跟踪该正弦曲线;选取被控对象状态变量为[θ θ’],初始状态为[pi/60,0]

3.1利用S函数编写被控对象

程序如下:

function [sys,x0,str,ts]=Plant_2_3(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      = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[pi/60 0];%倒立摆初始状态
str=[];
ts=[];

function sys=mdlDerivatives(t,x,u)
g=9.8;mc=1.0;m=0.1;l=0.5;
S=l*(4/3-m*(cos(x(1)))^2/(mc+m));
fx=g*sin(x(1))-m*l*x(2)^2*cos(x(1))*sin(x(1))/(mc+m);
fx=fx/S;
gx=cos(x(1))/(mc+m);
gx=gx/S;
dx1=x(2);%x1'
dt = u(1);
dx2=fx+gx*u(2)+dt;%x2'
sys = [dx1;dx2];

function sys=mdlOutputs(t,x,u)
sys = x;

3.2Simulink模型

扰动d(t) = sin(t),建立如下模型:

 4.结果分析

角度θ  

角速度 θ'

误差e 

 误差变化率de

 控制输入u

结论:从角位置和角速度可见,该滑模控制器能实现较好的追踪效果,即使前面短时间由于初始状态扰动有较小偏差,但也能很快追踪;误差和误差变化率看,有较小的抖动出现,但在扰动下基本能够通过控制力消除误差,体现了滑膜控制的鲁棒性;但是从控制输入看,完全不符合实际,不知道是自己设计的问题还是怎么回事,希望有大牛可以指点一二,非常感谢!

       在笔者看来换成了双曲正切函数效果上并没有什么差距,但是双曲正切函数适用于替换当切换函数需要进行求导的场合,因为从图像上可知,饱和函数可以有效克制滑膜抖动,但缺点是不属于连续函数,不适合需要对切换函数求导的场合。

如果有帮助,麻烦帮忙点个赞是我最大的分享动力,非常感谢!

5.更正

出现控制力很大的原因是因为对跟踪信号θd求导时,不能直接用simulink的微分derivative模块,其求出来的倒数是有问题的,如下就是用微分模块的曲线dsin(t)和ddsin(t):

 重新构建simulink模型

 控制器部分,只需将dthetad和ddthetad更正即可,如下:

thetad = u(1);%理想位置信号θd
dthetad = 0.1*cos(t);%θd'
ddthetad = -0.1*sin(t);%θd''
x1 = u(2);
x2 = u(3);

 得到的控制力:

 可以看到还是出现较大的抖动,所以个人暂时没理解更换趋近律消抖的现象,可能后续的学习会有体会吧!

注:仅为便利自己学习,错误在所难免,如有侵权,请联系删除,有兴趣的学者可以参考学习交流,谢谢!

  • 15
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr. 邹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值