⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stctrl.m

📁 直接转矩电机控制
💻 M
字号:
function out=DTC_ST(udc,isa,isb,spdfeed)
global Rs ts np;
global  FsAMP_H_BW FsAMP_ref tq_H_BW spd_ref tqMAX kp_spd ki_spd kd_spd;
global PWM;
global Fsalfa Fsbeta;
%######################################
%rebuild usalfa, usbeta by sa,sb,sc,udc with none-deadzone
%######################################
sa=PWM(1);
sb=PWM(2);
sc=PWM(3);
usalfa=sqrt(2/3)*udc*(sa-1/2*sb-1/2*sc);
usbeta=sqrt(2/3)*udc*(sqrt(3)/2*sb-sqrt(3)/2*sc);
%######################################
%stator current 3s-2s transform
%######################################
isc=-isa-isb;
isalfa=(isa-1/2*isb-1/2*isc)*2/3;
isbeta=(sqrt(3)/2*isb-sqrt(3)/2*isc)*2/3;
%######################################
%U-I model, caculate the stator flux
%######################################
EMFalfa=usalfa-isalfa*Rs;
EMFbeta=usbeta-isbeta*Rs;

Fsalfa=Fsalfa+EMFalfa*ts;
Fsbeta=Fsbeta+EMFbeta*ts;

FsAMP=sqrt(Fsalfa*Fsalfa+Fsbeta*Fsbeta);
%######################################
%estimate torque
%######################################
tq=np*(isbeta*Fsalfa-isalfa*Fsbeta);
%######################################
%speed loop->tq_ref spdfeed
%######################################
global error_spd_prev error_spd_prev2 tq_ref;
error_spd=spd_ref-spdfeed;
d_out_spd=kp_spd*(error_spd-error_spd_prev)+ki_spd*error_spd+kd_spd*(error_spd-2*error_spd_prev+error_spd_prev2);
tq_ref=tq_ref+d_out_spd;
error_spd_prev2=error_spd_prev;
error_spd_prev=error_spd;
if tq_ref>tqMAX
    tq_ref=tqMAX;
elseif tq_ref<-tqMAX
    tq_ref=-tqMAX;
end
%######################################
%stator flux bang-bang controllor
%######################################
global flux_index;
error_FsAMP=FsAMP_ref-FsAMP;
if error_FsAMP>FsAMP_H_BW/2
    flux_index=1;
elseif error_FsAMP<-FsAMP_H_BW/2
    flux_index=0;
end

%######################################
%tq bang-bang controllor
%######################################
global tq_index1 tq_index2;
error_tq=tq_ref-tq;
if error_tq>tq_H_BW/2
    tq_index1=1;
elseif error_tq<0
    tq_index1=0;
end

if error_tq>0
    tq_index2=0;
elseif error_tq<-tq_H_BW/2
    tq_index2=-1;
end
tq_index=tq_index1+tq_index2;

%######################################
%voltage sector NO.
%######################################
global sector;
if Fsalfa==0&Fsbeta>0
    Fstheta=pi/2;
elseif Fsalfa==0&Fsbeta==0
    Fstheta=0;
elseif Fsalfa==0&Fsbeta<0
    Fstheta=3*pi/2;
elseif Fsalfa>0&Fsbeta>=0
    Fstheta=atan(Fsbeta/Fsalfa);
elseif Fsalfa>0&Fsbeta<0
    Fstheta=atan(Fsbeta/Fsalfa)+2*pi;
else
    Fstheta=atan(Fsbeta/Fsalfa)+pi;
end

if Fstheta>=0&Fstheta<pi/3
    sector=1;
elseif Fstheta>=pi/3&Fstheta<pi*2/3
    sector=2;
elseif Fstheta>=pi*2/3&Fstheta<pi
    sector=3;
elseif Fstheta>=pi&Fstheta<pi*4/3
    sector=4;
elseif Fstheta>=pi*4/3&Fstheta<pi*5/3
    sector=5;
else
    sector=6;
end
%build flux first
%if error_FsAMP>4*FsAMP_H_BW
%    if sector==1
%    PWM=[1 0 0];
%    elseif sector==2
%    PWM=[1 1 0];
%    elseif sector==3
%    PWM=[0 1 0];
%    elseif sector==4
%    PWM=[0 1 1];
%    elseif sector==5
%    PWM=[0 0 1];
%    elseif sector==6
%    PWM=[1 0 1];
%    end
%    return;
%end

%######################################
%look up table VS
%######################################
if flux_index==1&tq_index==1
    if sector==1
    PWM=[1 1 0];
    elseif sector==2
    PWM=[0 1 0];
    elseif sector==3
    PWM=[0 1 1];
    elseif sector==4
    PWM=[0 0 1];
    elseif sector==5
    PWM=[1 0 1];
    elseif sector==6
    PWM=[1 0 0];
    end
elseif flux_index==1&tq_index==0
    if sector==1
    PWM=[1 0 0];
    elseif sector==2
    PWM=[1 1 0];
    elseif sector==3
    PWM=[0 1 0];
    elseif sector==4
    PWM=[0 1 1];
    elseif sector==5
    PWM=[0 0 1];
    elseif sector==6
    PWM=[1 0 1];
    end
elseif flux_index==1&tq_index==-1
    if sector==1
    PWM=[1 0 1];
    elseif sector==2
    PWM=[1 0 0];
    elseif sector==3
    PWM=[1 1 0];
    elseif sector==4
    PWM=[0 1 0];
    elseif sector==5
    PWM=[0 1 1];
    elseif sector==6
    PWM=[0 0 1];
    end
elseif flux_index==0&tq_index==-1
    if sector==1
    PWM=[0 0 1];
    elseif sector==2
    PWM=[1 0 1];
    elseif sector==3
    PWM=[1 0 0];
    elseif sector==4
    PWM=[1 1 0];
    elseif sector==5
    PWM=[0 1 0];
    elseif sector==6
    PWM=[0 1 1];
    end
elseif flux_index==0&tq_index==0
    if sector==1
    PWM=[0 1 1];
    elseif sector==2
    PWM=[0 0 1];
    elseif sector==3
    PWM=[1 0 1];
    elseif sector==4
    PWM=[1 0 0];
    elseif sector==5
    PWM=[1 1 0];
    elseif sector==6
    PWM=[0 1 0];
    end
elseif flux_index==0&tq_index==1
    if sector==1
    PWM=[0 1 0];
    elseif sector==2
    PWM=[0 1 1];
    elseif sector==3
    PWM=[0 0 1];
    elseif sector==4
    PWM=[1 0 1];
    elseif sector==5
    PWM=[1 0 0];
    elseif sector==6
    PWM=[1 1 0];
    end
end
out=[PWM(1) PWM(2) PWM(3) tq];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -