/* ================================================================================= File name: SVGEN_MF.H ===================================================================================*/ #ifndef __SVGEN_MF_H__ #define __SVGEN_MF_H__ typedef struct { _iq Gain; // Input: reference gain voltage (pu) _iq Offset; // Input: reference offset voltage (pu) _iq Freq; // Input: reference frequency (pu) _iq FreqMax; // Parameter: Maximum step angle = 6*base_freq*T (pu) _iq Alpha; // History: Sector angle (pu) _iq NewEntry; // History: Sine (angular) look-up pointer (pu) _iq Ualpha; // Input: reference alpha-axis phase voltage _iq Ubeta; // Input: reference beta-axis phase voltage _iq Ta; // Output: reference phase-a switching function (pu) _iq Tb; // Output: reference phase-b switching function (pu) _iq Tc; // Output: reference phase-c switching function (pu) _iq StepAngle; // Variable _iq dx; // Variable _iq dy; // Variable } SVGENMF; /*----------------------------------------------------------------------------- Default initalizer for the SVGENMF object. -----------------------------------------------------------------------------*/ #define SVGENMF_DEFAULTS { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /*------------------------------------------------------------------------------ SVGENMF Macro Definitions ------------------------------------------------------------------------------*/ #define PI_THIRD _IQ(1.04719755119660) /* This is 60 degree */ #define Gain_30 _IQ(0.020083365564211236) /*0.000087655548754014668´ËΪ30hz£¬Ê¾Îª10hz*/ #define Coe1_30 _IQ(-1.5610180758007182) /*-1.973344249781299*/ #define Coe2_30 _IQ( 0.64135153805756318) /*0.97369487197631521*/ float dy1; float dy2; _iq dy11,dy21; _iq dy12,dy22; extern _iq i1,i2,i3; _iq idmax=-_IQ(2.5),iddmax=-_IQ(2.5),idmin=0,iddmin=0; _iq ia1,ib2,ic3; _iq ialpha,ibeta,id,iq,idd,iqq; _iq tempd=0,tempq=0; _iq Outputd=0,Outputq=0; _iq Inputd,Inputq; _iq PreInput1d=0; _iq PreInput2d=0; _iq PreOutputd=0; _iq PreInput1q=0; _iq PreInput2q=0; _iq PreOutputq=0; float DB=0; _iq temp_sv1; _iq temp_sv2; _iq Va; _iq Vb; _iq Vc; _iq t1; _iq t2; _iq t12; _iq alpha; _iq beta; _iq dua,dub,duc; _iq dalpha,dbeta; int rgcn; _iq rgc[50]; Uint32 Isr=0; Uint32 Sector; // History: Sector number (Q0) - independently with global Q #define SVGENMF_MACRO(v) \ /* Normalise the freq input to appropriate step angle */ \ /* Here, 1 pu. = 60 degree */ \ v.StepAngle = _IQmpy(v.Freq,v.FreqMax); \ /* Calculate new angle alpha */ \ v.Alpha = v.Alpha + v.StepAngle; \ if (v.Alpha >= _IQ(6.0)) \ v.Alpha = v.Alpha-_IQ(6.0); \ v.NewEntry = v.Alpha; \ v.dy = _IQmpy(v.NewEntry,PI_THIRD); /* v.dy = sin(NewEntry) */ \ dy1 =((float)v.dy)/16777216; \ dy1 = sin(dy1); \ v.dy = (long)(dy1*16777216); \ v.dx = _IQ(1.5707963)-_IQmpy(v.NewEntry,PI_THIRD); /* v.dx = sin(90-NewEntry) */ \ dy2 =((float)v.dx)/16777216; \ dy2 = sin(dy2); \ v.dx = (long)(dy2*16777216); \ v.Ualpha = _IQmpy(v.dx,v.Gain); \ v.Ubeta = _IQmpy(v.dy,v.Gain); \ /* Determine which sector */ \ Sector = 0; \ temp_sv1=_IQmpy(_IQ(0.5),v.Ubeta); \ temp_sv2=_IQmpy(_IQ(0.8660254),v.Ualpha); /* 0.8660254 = sqrt(3)/2*/ \ \ /* Inverse clarke transformation */ \ Va = v.Ubeta; \ Vb = -temp_sv1 + temp_sv2; \ Vc = -temp_sv1 - temp_sv2; \ /* 60 degree Sector determination */ \ if (Va>_IQ(0)) Sector = 1; \ if (Vb>_IQ(0)) Sector = Sector+2; \ if (Vc>_IQ(0)) Sector = Sector+4; \ /* X,Y,Z (Va,Vb,Vc) calculations X = Va, Y = Vb, Z = Vc */ \ Va = v.Ubeta; \ Vb = temp_sv1 + temp_sv2; \ Vc = temp_sv1 - temp_sv2; \ /* Sector 0: this is special case for (Ualpha,Ubeta) = (0,0)*/ \ \ switch(Sector) \ { \ case 0: \ v.Ta = _IQ(0.5); \ v.Tb = _IQ(0.5); \ v.Tc = _IQ(0.5); \ break; \ case 1: /*Sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc)*/ \ t1 = Vc; \ t2 = Vb; \ t12 = t1 + t2; \ if(t12>_IQ(1)){t1=_IQdiv(t1,t12);t2=_IQdiv(t2,t12);} \ v.Tb = (_IQ(1)-t1-t2)>>1; /* tbon = (1-t1-t2)/2 */ \ v.Ta = v.Tb+t1; /* taon = tbon+t1 */ \ v.Tc = v.Ta+t2; /* tcon = taon+t2 */ \ break; \ case 2: /* Sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb)*/ \ t1 = Vb; \ t2 = -Va; \ t12 = t1 + t2; \ if(t12>_IQ(1)){t1=_IQdiv(t1,t12);t2=_IQdiv(t2,t12);} \ v.Ta = (_IQ(1)-t1-t2)>>1; /* taon = (1-t1-t2)/2 */ \ v.Tc = v.Ta+t1; /* tcon = taon+t1 */ \ v.Tb = v.Tc+t2; /* tbon = tcon+t2 */ \ break; \ case 3: /* Sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc)*/ \ t1 = -Vc; \ t2 = Va; \ t12 = t1 + t2; \ if(t12>_IQ(1)){t1=_IQdiv(t1,t12);t2=_IQdiv(t2,t12);} \ v.Ta = (_IQ(1)-t1-t2)>>1; /* taon = (1-t1-t2)/2 */ \ v.Tb = v.Ta+t1; /* tbon = taon+t1 */ \ v.Tc = v.Tb+t2; /* tcon = tbon+t2 */ \ break; \ case 4: /* Sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta)*/ \ t1 = -Va; \ t2 = Vc; \ t12 = t1 + t2; \ if(t12>_IQ(1)){t1=_IQdiv(t1,t12);t2=_IQdiv(t2,t12);} \ v.Tc = (_IQ(1)-t1-t2)>>1; /* tcon = (1-t1-t2)/2 */ \ v.Tb = v.Tc+t1; /* tbon = tcon+t1 */ \ v.Ta = v.Tb+t2; /* taon = tbon+t2 */ \ break; \ case 5: /* Sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta)*/ \ t1 = Va; \ t2 = -Vb; /* tbon = (1-t1-t2)/2 */ \ t12 = t1 + t2; \ if(t12>_IQ(1)){t1=_IQdiv(t1,t12);t2=_IQdiv(t2,t12);} \ v.Tb = (_IQ(1)-t1-t2)>>1; /* tcon = tbon+t1 */ \ v.Tc = v.Tb+t1; /* taon = tcon+t2 */ \ v.Ta = v.Tc+t2; \ break; \ case 6: /* Sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb)*/ \ t1 = -Vb; \ t2 = -Vc; \ t12 = t1 + t2; \ if(t12>_IQ(1)){t1=_IQdiv(t1,t12);t2=_IQdiv(t2,t12);} \ v.Tc = (_IQ(1)-t1-t2)>>1; /* tcon = (1-t1-t2)/2 */ \ v.Ta = v.Tc+t1; /* taon = tcon+t1 */ \ v.Tb = v.Ta+t2; /* tbon = taon+t2 */ \ break; \ } \ /* Convert the unsigned GLOBAL_Q format (ranged (0,1)) ->.. */ \ /* ..signed GLOBAL_Q format (ranged (-1,1))*/ \ v.Ta = (v.Ta-_IQ(0.5))<<1; \ v.Tb = (v.Tb-_IQ(0.5))<<1; \ v.Tc = (v.Tc-_IQ(0.5))<<1; \ #endif // __SVGEN_MF_H__