首页 > 其他 > 详细

使用滑模控制对sin(t)曲线追踪

时间:2021-03-04 19:01:33      阅读:31      评论:0      收藏:0      [点我收藏+]

结合:【Matlab】简单的滑模控制程序及Simulink仿真本片文章观看,此篇文章是在这篇文章的基础上进行修改的

输出u的推导过程

技术分享图片

 

 如果不明白控制量输出u的推到过成请看:【控制理论】滑模控制最强解析这篇文章

根据推到结果写s—function函数

控制器的s-function

function [sys,x0,str,ts] = simple_adaptive_controller(t, x, u, flag)
switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;  % 调用初始化子函数
  case 1,
    sys=[];
  case 2,
    sys=[];
  case 3,
    sys=mdlOutputs(t,x,u);    %计算输出子函数
  case 4,
    sys=[];   %计算下一仿真时刻子函数
  case 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  = 0;  %离散状态变量个数
sizes.NumOutputs     = 1;  %输出变量个数
sizes.NumInputs      = 5;   %输入变量个数
sizes.DirFeedthrough = 1;   %输入信号是否在输出端出现
sizes.NumSampleTimes = 0;   % at least one sample time is needed
 
sys = simsizes(sizes);
x0  = [];   %初始值
str = [];   
ts  = [];   %[0 0]用于连续系统,[-1 0]表示继承其前的采样时间设置
simStateCompliance = UnknownSimState;
 
function sys=mdlOutputs(t,x,u)   %计算输出子函数
 
J = 2;
thd = u(1);
dthd = u(4);
ddthd = u(5);
th = u(2);
dth = u(3);
 
e = th - thd;
de = dth;
c = 10;
s = c*e + de;
xite = 1.1;
 
k = 0;
ut = J*-c*(dth - dthd)-J*xite*sign(s) - J*ddthd ;
sys(1) = ut;

模型状态方程的s-function函数建立

function [sys,x0,str,ts] = plant(t, x, u, flag)
switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;  % 调用初始化子函数
  case 1,
    sys=mdlDerivatives(t,x,u);   %调用计算微分子函数
  case 2,
    sys=[];
  case 3,
    sys=mdlOutputs(t,x,u);    %计算输出子函数
  case 4,
    sys=[];   %计算下一仿真时刻子函数
  case 9,
    sys=[];    %终止仿真子函数
  otherwise
    DAStudio.error(Simulink:blocks:unhandledFlag, num2str(flag));
 
end
 
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes   %初始化子函数
 
sizes = simsizes;
 
sizes.NumContStates  = 2;  %连续状态变量个数
sizes.NumDiscStates  = 0;  %离散状态变量个数
sizes.NumOutputs     = 2;  %输出变量个数
sizes.NumInputs      = 1;   %输入变量个数
sizes.DirFeedthrough = 0;   %输入信号是否在输出端出现
sizes.NumSampleTimes = 1;   % at least one sample time is needed
 
sys = simsizes(sizes);
x0  = [0, 0];   %初始值
str = [];   
ts  = [0 0];   %[0 0]用于连续系统,[-1 0]表示继承其前的采样时间设置
simStateCompliance = UnknownSimState;
 
function sys = mdlDerivatives(t, x, u)    %计算微分子函数
J = 2;
dt = sin(t);
ut = u(1);
sys(1) = x(2);
sys(2) = 1/J*(ut+dt);
 
function sys=mdlOutputs(t,x,u)   %计算输出子函数
sys(1) = x(1);
sys(2) = x(2);

最终图像

蓝色是追踪角度thea曲线

黄色是sin曲线

橘红色是dthea曲线

技术分享图片

 

 

使用滑模控制对sin(t)曲线追踪

原文:https://www.cnblogs.com/zhjblogs/p/14481521.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!