#include "DSP281x_Device.h"
#include "IQmathLib.h"
#include "han.h"
#define Cmp_Zero 0
#define Cmp_Full OurtimerPeriod
long pwmsignaltest1 = 0x0080,pwmsignaltest2 = 0;
long int tmaintemp = 0,tsubtemp = 0,tzerotemp = 0,tmain = 0,tmainQ15 = 0,tsub = 0,tsubQ15 = 0,tzero = 0,tzeroQ15 = 0;
//tmain主矢量作用时间,tsub为次矢量作用时间,tzero为零矢量作用时间;
unsigned long int numb1cmp = 0,numb2cmp = 0,numb3cmp = 0,numb1cmptemp = 0,numb2cmptemp = 0,numb3cmptemp = 0;
_iq uref_u = 0,uref_v = 0,uref_w = 0;
//???????U,V,W?????
int usingal = 0,vsingal = 0,wsingal = 0,uvwsingal = 0;
//??????????????,1???0,0???0;
_iq uref = 0,cita = 0,udcUP = 0,udcDOWN = 0;//??????,??(??),???????.
_iq udc = 0;
long int ualfa = 0,ubeta = 0,ualfa_stemp = 0,ubeta_stemp = 0,ualfa_s = 0,ubeta_s = 0;
int hexagontemp = 0,hexagon = 0,sectortemp = 0,sector = 0,positiontemp = 0,position = 0;
//????,???,?????
int A = 0,B = 0,C = 0,M = 0;
//????????????;
_iq ualfa_s3 = 0,ubeta_ssqrt3 = 0;
//?????????????????,?????????????;
extern signed int AD_RESULT[7]; //AD?????,
extern signed long int udcUPQ0,udcDOWNQ0,udcQ0,uUP_uDOWN;//????V??????;
//extern _iq Big_Current_Test_Duty_Cmp; //????????????
extern _iq UAN,UBN,UCN,Ualpha_Cacl,Ubeta_Cacl;//????,??????
extern float Cmp_temp_float;//??????
extern _iq Cmp_temp;
extern _iq Udc_No01_Q24,Udc_No02_Q24,Udc_No03_Q24;
extern _iq Ua_temp,Ub_temp,Uc_temp;//??????
extern _iq UAN_XZ,UBN_XZ,UCN_XZ;
_iq testmpy=0;
extern float Ua_temp_float,Ub_temp_float,Uc_temp_float;
//extern _iq testuuptimer,testudowntimer;
svpwm()
{
uref_u=_IQmpy(uref,_IQcosPU(cita));
if(uref_u>0) usingal=1;
else
usingal=0;
if(uref_v>0) vsingal=1;
else
vsingal=0;
if(uref_w>0) wsingal=1;
else
wsingal=0;
uvwsingal=usingal+vsingal+wsingal;
if (uvwsingal==0) hexagontemp=0;//???????UREF?CITA??0???;
else if(uvwsingal==1) //???????????hexagontemp;
{
if(usingal==1)hexagontemp=1;
else if(vsingal==1)hexagontemp=3;
else hexagontemp=5;
}
else if(uvwsingal==2)
{
if(wsingal==0)hexagontemp=2;
else if(usingal==0)hexagontemp=4;
else hexagontemp=6;
}
else
; //?????????????????;error(1)
//?????????????,??????uDC??????
//???6?????alfa and beta??????????????
////////////////////////////////////////////////////////////////////////
switch(hexagontemp)
{
case(1):
ualfa_stemp=ualfa-udc/3; //(Q15=Q15-Q15/Q0)
ubeta_stemp=ubeta; //
break;
case(2):
ualfa_stemp=ualfa-udc/6;
ubeta_stemp=ubeta-_IQdiv(udc,Sqt3Mpy2);
//???udc/2*extract(3)
break;
case(3):
ualfa_stemp=ualfa+udc/6; //(Q15=Q15-Q15/Q0)
ubeta_stemp=ubeta-_IQdiv(udc,Sqt3Mpy2);
break;
case(4):
ualfa_stemp=ualfa+udc/3; //(Q15=Q15-Q15/Q0)
ubeta_stemp=ubeta;
break;
case(5):
ualfa_stemp=ualfa+udc/6;
ubeta_stemp=ubeta+_IQdiv(udc,Sqt3Mpy2); //
break;
default: //?????????????????;error(1)
;
}//switch//??????????
//??????6?????????????????????(sectortemp);
if(ubeta_stemp>0) A=0;
else A=1;
if((_IQmpy(Sqt3,ualfa_stemp)-ubeta_stemp)>0) B=0;
else B=1;
//sqrt(3)ualfa_stemp-ubeta_stemp,sqrt(3)?Q15??=Sqt3
if((_IQmpy(Sqt3,ualfa_stemp)+ubeta_stemp)>0) C=0;
else C=1;
//sqrt(3)ualfa_stemp+ubeta_stemp,sqrt(3)?Q15??=Sqt3
M=A+2*B+2*C;
if(M==0) sectortemp=1;
else if(M==2) sectortemp=2;
else if(M==4) sectortemp=3;
else if(M==5) sectortemp=4;
else if(M==3) sectortemp=5;
else if(M==1) sectortemp=6;
else ; //???????sectortemp;
//////////////////////////////////////////////////////////////////////////////////////////////////
positiontemp=hexagontemp*10+sectortemp; //?????????????;
if(uUP_uDOWN>0)//????????
{ //testuuptimer+=1;
switch(positiontemp)
{
case(23):
hexagon=3,sector=1;break;
case(24):
hexagon=3,sector=6;break;
case(25):
hexagon=1,sector=3;break;
case(26):
hexagon=1,sector=2;break;
case(41):
hexagon=3,sector=5;break;
case(42):
hexagon=3,sector=4;break;
case(45):
hexagon=5,sector=3;break;
case(46):
hexagon=5,sector=2;break;
case(61):
hexagon=1,sector=5;break;
case(62):
hexagon=1,sector=4;break;
case(63):
hexagon=5,sector=1;break;
case(64):
hexagon=5,sector=6;break;
default:
hexagon=hexagontemp,sector=sectortemp;break;
}//switch(positiontemp)
}//if(uUP_uDOWN>=0)
else //if(uUP_uDOWN<-5) //uUP_uDOWN??0????????
{
//testudowntimer+=1;
switch(positiontemp)
{
case(12):
hexagon=2,sector=6;break;
case(13):
hexagon=2,sector=5;break;
case(14):
hexagon=6,sector=2;break;
case(15):
hexagon=6,sector=1;break;
case(34):
hexagon=4,sector=2;break;
case(35):
hexagon=4,sector=1;break;
case(31):
hexagon=2,sector=3;break;
case(36):
}//switch
}//else if(uUP_uDOWN<-10)
/* else //??+-10????????
{
hexagon=hexagontemp;
sector=sectortemp;
}//else?????????*/
////////?????????????????(??uUP_uDOWN???)
/////*************??????ualfa and ubeta??????****************/////
position=hexagon*10+sector; //???????????????;
switch(hexagon)
{
case(1):
ualfa_s=ualfa-udc/3; //(Q15=Q15-Q15/Q0)
ubeta_s=ubeta; //
break;
case(2):
ualfa_s=ualfa-udc/6;
ubeta_s=ubeta-_IQdiv(udc,Sqt3Mpy2);
//???udc/2*extract(3)
break;
case(3):
ualfa_s=ualfa+udc/6; //(Q15=Q15-Q15/Q0)
ubeta_s=ubeta-_IQdiv(udc,Sqt3Mpy2);
break;
case(4):
ualfa_s=ualfa+udc/3;
ubeta_s=ubeta;
break;
case(5):
ualfa_s=ualfa+udc/6;
ubeta_s=ubeta+_IQdiv(udc,Sqt3Mpy2); //
default: //?????????????????;error(1)
;
}
//////??????6?????ualfa_s,ubeta_s,???????????////////////
//************************?????????????**********************************//
//************************?????????????**********************************//
//??3*Va,sqrt(3)*Vb?????,????????,?????????;
ualfa_s3=_IQmpy(Const3,ualfa_s); //
ubeta_ssqrt3=_IQmpy(Sqt3,ubeta_s);//
switch(sector)
{
case(1):
tmaintemp=_IQdiv((2*ubeta_ssqrt3),udc);
tsubtemp =_IQdiv(( ualfa_s3-ubeta_ssqrt3),udc);
break;
case(2):
tmaintemp=_IQdiv(( ualfa_s3+ubeta_ssqrt3),udc);
tsubtemp =_IQdiv((-ualfa_s3+ubeta_ssqrt3),udc);
break;
case(3):
tmaintemp=_IQdiv((-ualfa_s3-ubeta_ssqrt3),udc);
tsubtemp =_IQdiv((2*ubeta_ssqrt3),udc);
break;
case(4):
tmaintemp=_IQdiv((-ualfa_s3+ubeta_ssqrt3),udc);
tsubtemp =_IQdiv((-2*ubeta_ssqrt3),udc);
break;
case(5):
tmaintemp=_IQdiv(( ualfa_s3-ubeta_ssqrt3),udc);
tsubtemp =_IQdiv((-ualfa_s3-ubeta_ssqrt3),udc);
break;
default:
break;
}
////????????????///
//tmaintemp,tsubtemp,tzero???OurtimerPer????///////////////
///////????????????????,congifer here/////////
//if (tmaintemp<ConstDot02) tmaintemp=0;
if (tmaintemp<_IQ(0.02)) tmaintemp=0;
else tmaintemp=tmaintemp;
//if (tsubtemp<ConstDot02) tsubtemp=0;
if (tsubtemp<_IQ(0.02)) tsubtemp=0;
else tsubtemp=tsubtemp;
//2%?????????
if ((tmaintemp+tsubtemp)>=_IQ(0.96))
//????????????????,?????;
//tzero??????2%,??0??
{tzero=0;
tmain=_IQdiv(tmaintemp,(tmaintemp+tsubtemp));
tsub=_IQdiv(tsubtemp,(tmaintemp+tsubtemp));
}
else
{tmain=tmaintemp;tsub=tsubtemp;tzero=_IQ(1)-tmain-tsub;} //Q24??
tmainQ15 = tmain>>9;
tsubQ15 = tsub>>9;
tzeroQ15 = tzero>>9;
///////////////Q24---------Q15/////////////////////
numb1cmptemp=_IQ15mpy(tzeroQ15/2,OurtimerPeriod);//Q15*Q0
if(numb1cmptemp<=900) //12uS
numb1cmptemp=0;
else if(numb1cmptemp>=36600)
numb1cmptemp = Ourtim
评论9