svpwm222.m
来自「MATLAB中SVPWM空间电压矢量模块的m语言实现」· M 代码 · 共 95 行
M
95 行
%==========================================================================
function [sys,x0,str,ts] =svpwm222(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case {1,9}
sys=[];
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 3;
sizes.NumOutputs = 3;
sizes.NumInputs =3;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0;1;0];
str = [];
ts = [-2 0];
%=============================================================================
%更新状态变量
% 其中:u(1)为合成空间电压矢量模值
% u(2)为检测到的直流母线电压
% u(3)为合成矢量的同步旋转角,为弧度值。
% x(1)为由u(1)和u(2)所合成的新的矢量(相当于和占空比有关)
% x(2)指6个扇区:1,2,3,4,5,6
% x(3)指合成的空间电压矢量在一个扇区的相对角度(θ-k*60),为角度值。运算时要变换为弧度值(θ-k*60)*pi/180
function sys=mdlUpdate(t,x,u)
x(1)=(3*u(1))/(2*u(2));
if x(1)>=sqrt(3/4)
x(1)=sqrt(3/4);
end
if x(1)<=0
x(1)=0;
end
x(2)=floor(u(3)*180/(60*pi))+1;
x(3)=u(3)*180/pi-(x(2)-1)*60
sys=x;
%=============================================================================
% 计算输出时间
function sys=mdlOutputs(t,x,u)
T=0.0001;% SVPWM波的开关周期
T1=T*x(1)*cos(x(3)*pi/180)-1/sqrt(3)*T*x(1)*sin(x(3)*pi/180);
T2=2/sqrt(3)*T*x(1)*sin(x(3)*pi/180);
T0=T-T1-T2;
switch (x(2))
case [1]
state=[T1+T2+T0/2,T2+T0/2,T0/2];
case [2]
state=[T1+T0/2,T1+T2+T0/2,T0/2];
case [3]
state=[T0/2,T1+T2+T0/2,T2+T0/2];
case [4]
state=[T0/2,T1+T0/2,T1+T2+T0/2];
case [5]
state=[T2+T0/2,T0/2,T1+T2+T0/2];
case [6]
state=[T1+T2+T0/2,T0/2,T1+T0/2];
end
sys=state;
%=============================================================================
%计算下一采样时间点
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampletime=0.0001;
sys=t+sampletime;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?