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 + -
显示快捷键?