滑模变结构控制--刘金琨学习

matlab仿真

上述仿真按照书上例子所作采用了s function模块、mux模块、scope模块

 

 两者的命名要对应才能调用

 chap1_1input模块代码

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,%%因为是连续系统所以flag只用到0、1、3,且flag值随着仿真过程自动变化
    sys=mdlOutputs(t,x,u);
  case {2,4,9}
    sys=[];
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;%定义一个输出
sizes.NumInputs      = 0;
sizes.DirFeedthrough = 1;%输入与输出有直接联系
sizes.NumSampleTimes = 0;  
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [];
function sys=mdlOutputs(t,x,u)
thd = 1.0;%设置输出即目标角度为1
sys(1) = thd;

且上述input代码表示无输入单输出,输出为目标角度

 chap1_1ctrl模块代码

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
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;%定义一个输出
sizes.NumInputs      = 3;%定义三个输入
sizes.DirFeedthrough = 1;%输入与输出直接相关
sizes.NumSampleTimes = 0;  
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [];
function sys=mdlOutputs(t,x,u)
J = 2;%定义转动惯量为2
thd = u(1);%输入1为目标角度
th = u(2);%输入2为实际角度
dth = u(3);%输入3为实际角度的微分

e = th - thd;%e为实际角度与目标角度的差值
de = dth;%对差值求导
c = 10;%滑模控制参数
s = c*e + de;%滑模面函数
xite = 1.1;%趋近律参数

k = 0;%趋近律参数
ut = J*(-c*dth-1/J*(k*s+xite*sign(s)));%滑模控制律

sys(1) = ut;%输出滑模控制律

ctrl模块代码为三输入单输出,输入为实际角度、实际角度的微分、目标角度、输出为滑模控制律的控制输入

 chap1_1plant模块代码

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
    DAStudio.error('Simulink:blocks:unhandledFlag', 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 = 0;
sizes.NumSampleTimes = 1;%需要的样本时间  
sys = simsizes(sizes);
x0  = [0 0];%系统初始状态
str = [];
ts  = [0 0];%采样时间间隔、采样开始时间
function sys=mdlDerivatives(t,x,u)
J = 2;%转动惯量设置为2
dt = sin(t);%扰动设为正弦函数
ut = u(1);%输入为滑模控制律的控制输入
sys(1) = x(2);%表示x(1) = 角度,x(1)的导数为x(2)等于角速度,
sys(2) = 1/J*(ut+dt);%x(2)的导数为角加速度,即为电机的动态模型方程转化而来
function sys=mdlOutputs(t,x,u)
sys(1) = x(1);%输出状态变量1即角度
sys(2) = x(2);%输出状态变量2即角速度

plant模块代码为单输入双输出,其中输入为滑模控制律的控制输入,输出为角度和角速度

当k = 0时

当k = 10时

 逻辑我认为是在input模块输入目标角度,在ctrl模块设计滑模面函数和滑模控制律,在plant模块进行模拟电机系统,给系统一个输入,输出角度与角速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值