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模块进行模拟电机系统,给系统一个输入,输出角度与角速度