📄 stctrl.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 + -