天天看點

基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真

目錄

​​一、理論基礎​​

​​二、核心程式​​

​​三、仿真測試結果​​

一、理論基礎

      SVPWM算法很适合在數字系統中使用,有很高的直流電壓使用率,而且可以有效降低電機的轉矩脈振和噪音,其基本結構如下:

基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真

      三相靜止ABC坐标系下的交流信号跟蹤問題,在經過Clark變換和Park變換後,轉換為兩相旋轉坐标系下的直流信号跟蹤問題,于是,同志們又可以愉快的使用PID控制了。

      瞬時空間磁鍊矢量圓軌迹法(SVPWM)就是在很短的一段時間間隔内,通過對電壓型逆變器的開關狀态的線性組合,得到磁鍊矢量軌迹為圓形的PWM方式。SVPWM控制算法的思想是:運用定子磁鍊空間矢量跟蹤的思想,在正弦波永磁同步電機内部空間産生旋轉的圓形磁場,進而産生穩定的電磁轉矩。

      三相逆變器對PMSM供電時,SVPWM技術産生的PWM波控制着三相逆變器的六個開關管的開通與關閉。逆變器結構如圖1所示,逆變器由三個橋臂六個開關管組成,為避免短路,逆變器同一個橋臂上的兩個電子開關交替導通。

 1.1PARK變換

基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真
基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真

1.2CLARK變換

基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真
基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真

二、核心程式

基于PARK-Clark的雙閉環PI的永磁同步電機SVPVM控制系統simulink仿真
function [sys,x0,str,ts] = func_N_calculation(t,x,u,flag)
%A=0;B=0;
%C=0;N=0;


global A B C N;
switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 1,
    sys=[];
  case 2,
    sys=[];
  case 3,
    sys=mdlOutputs(t,x,u,A,B,C,N);
  case 4,
    sys=[];
  case 9,
    sys=[];
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end


function [sys,x0,str,ts]=mdlInitializeSizes

sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 3;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);
x0  = [0 0 0];
str = [];
ts  = [0 0];

%u(1)=Uafa;u(2)=Ubta
function sys=mdlOutputs(t,x,u,A,B,C,N)
x(1)=u(2);                         %x(1)=Ua
x(2)=1/2*(sqrt(3)*u(1)-u(2));      %x(2)=Ub
x(3)=1/2*(-sqrt(3)*u(1)-u(2));    %x(3)=Uc

if (x(1)>0);    %A
   A=1;
else
   A=0; 
end
if (x(2)>0);     %B
   B=1;
else
   B=0; 
end
if (x(3)>0);
   C=1;          %C
else
   C=0; 
end
N=4*C+2*B+A;   %N
sys=N;      
function [sys,x0,str,ts] = func_T1T2_cal(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
    error(['Unhandled flag = ',num2str(flag)]);
end


function [sys,x0,str,ts]=mdlInitializeSizes

sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 2;
sizes.NumInputs      = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];

%u(1)=N;u(2)=Uafa;u(3)=Ubta;u(4)=Udc;u(5)=Ts
function sys=mdlOutputs(t,x,u)
global T1 T2 Ts
Ts=u(5);
switch u(1)
    case 1
        T1=-1*u(2)+3^0.5/3*u(3);
        T2=1*u(2)+3^0.5/3*u(3);
    case 2
        T1=1*u(2)+3^0.5/3*u(3);
        T2=0*u(2)-2*3^0.5/3*u(3);
    case 3
        T1=1*u(2)-3^0.5/3*u(3);
        T2=2*3^0.5/3*u(3);
    case 4
        T1=-2*3^0.5/3*u(3);
        T2=-1*u(2)+3^0.5/3*u(3);
    case 5
        T1=2*3^0.5/3*u(3);
        T2=-1*u(2)-3^0.5/3*u(3);
    case 6
        T1=-1*u(2)-3^0.5/3*u(3);
        T2=1*u(2)-3^0.5/3*u(3);
end 
T1=T1*u(5)/u(4)/2*3;
T2=T2*u(5)/u(4)/2*3;

if (T1+T2<=Ts);
    sys(1)=T1;
    sys(2)=T2;   
else
    sys(1)=T1*Ts/(T1+T2);
    sys(2)=T2*Ts/(T1+T2);
end




      

三、仿真測試結果

繼續閱讀