Open Loop Vector Space Vector PWM

Dependencies:   mbed-rtos mbed

Fork of Vector_Open_SVPWM by akiyoshi oguro

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include <math.h>
00004 #define TS1 0.2
00005 
00006 float PI=3.141592;
00007 int t=0,q=0,i=0;
00008 int START=7;
00009 PwmOut mypwmA(PA_8); 
00010 PwmOut mypwmB(PA_9); 
00011 PwmOut mypwmC(PA_10);
00012 
00013 PwmOut  Current_Ref(PB_4);
00014 
00015 DigitalOut Vector(PC_4);
00016 DigitalOut EN1(PC_10);
00017 DigitalOut EN2(PC_11);
00018 DigitalOut EN3(PC_12);
00019 
00020 
00021 
00022 //AnalogIn V_adc(PB_1);  //volume
00023 AnalogIn V_adc(PC_2); // Gaibu Potention
00024 
00025 AnalogIn  Vshuntu(PA_1);
00026 AnalogIn  Vshuntv(PA_0);
00027 AnalogIn  Vshuntw(PB_0);
00028 
00029 AnalogIn BEMF1(PC_3);//C7_37
00030 AnalogIn BEMF2(PB_0);//C7_34
00031 AnalogIn BEMF3(PA_7);//C10_26
00032 
00033 DigitalIn GPIO_BEMF(PC_9);
00034 DigitalIn CPOUT(PA_12);
00035 AnalogIn Curr_ui(PA_0);
00036 AnalogIn Curr_vi(PC_1);
00037 AnalogIn Curr_wi(PA_1);
00038 
00039 InterruptIn  HA(PA_15);
00040 InterruptIn  HB(PB_3);
00041 InterruptIn  HC(PB_10);
00042 Timer uT;
00043 Timer vT;
00044 Timer wT;
00045 
00046 AnalogOut SWAVE(PA_4);
00047 
00048 Serial pc(USBTX,USBRX);
00049 
00050 DigitalOut myled(LED1);
00051 float sq32=sqrt(3.0f/2.0f);
00052 float sq23=2.0f/sqrt(3.0f);
00053 float sq3=1.0f/sqrt(3.0f);
00054 float VDC=1.8;
00055 float Vdlink=1/VDC;  
00056 float aVa;
00057 float a3Vb;
00058 float Vr_adc;
00059 
00060 Timer Timer1; 
00061 float freq=0;
00062 float z=1.0; //0.5
00063 float Wt,Va,Vb,Vq,Vd;
00064 float d1,d2,d3,d4,d5,d6,d07;
00065 float du,dv,dw;
00066 bool  cu,cv,cw;
00067 float ave=0,aveo=0,avsum=0;
00068 
00069 float ut=0,ut1=0,ut2=0,usi=0;
00070 float vt=0,vt1=0,vt2=0,vsi=0;
00071 float wt=0,wt1=0,wt2=0,wsi=0;
00072 float Speed;
00073 
00074 void HAH(){
00075    
00076     ut1=uT.read_us();
00077     ut=0;  
00078      
00079       }
00080  void HAL(){
00081   
00082     ut2=uT.read_us(); 
00083     uT.reset();
00084     
00085      }
00086  void HBH(){
00087   
00088     vt1=vT.read_us();   
00089     
00090      }
00091  void HBL(){
00092    
00093     vt2=vT.read_us();
00094    
00095     vT.reset();
00096      }
00097  void HCH(){
00098     wt1=wT.read_us();
00099     
00100      }
00101      
00102  void HCL(){
00103     wt2=wT.read_us();
00104     
00105     wT.reset();
00106      }   
00107      
00108   
00109 
00110 void CPLT(){
00111   pc.printf("%.3f , %.3f \r" ,Speed ,Vr_adc);
00112   }
00113      
00114    void timerTS1(void const*argument){
00115    CPLT();
00116   } 
00117 int main() {
00118   Timer1.start();  
00119    EN1=1;
00120    EN2=1;
00121    EN3=1;
00122      uT.start();
00123      vT.start();
00124      wT.start();
00125    
00126     mypwmA.period_us(20);
00127    
00128     mypwmB.period_us(20);
00129    
00130     mypwmC.period_us(20);
00131     
00132     pc.baud(128000);
00133      RtosTimer RtosTimerTS1(timerTS1);
00134      RtosTimerTS1.start((unsigned int)(TS1*5000)); //3000
00135      Thread::wait(100); 
00136    
00137       
00138  while(1) {
00139          
00140         HA.rise(&HAH);
00141         HC.fall(&HCL);
00142         HB.rise(&HBH);
00143         HA.fall(&HAL);
00144         HC.rise(&HCH);
00145         HB.fall(&HBL);
00146     Speed=60*(1/(7.0*2.0*usi*1E-6));
00147          usi=ut2-ut1;
00148          vsi=vt2-vt1;
00149          wsi=wt2-wt1;
00150          Vd=0;
00151      
00152         float s = Timer1.read();
00153         Vr_adc=V_adc.read();
00154         myled = ((int)s) % 2 == 0; /* LED output(0.5Hz) */
00155    
00156         
00157 if((Vr_adc>0.08f)&&(q==0)){
00158 while(q<30){   
00159     
00160     mypwmA.write(0.5f);
00161     mypwmB.write(0);
00162     mypwmC.write(0);
00163     wait_ms(START);
00164            
00165     mypwmA.write(0);
00166     mypwmB.write(0.5f);
00167     mypwmC.write(0.0);
00168     wait_ms(START);
00169          
00170     mypwmA.write(0);
00171     mypwmB.write(0.0);
00172     mypwmC.write(0.5f);
00173     wait_ms(START);
00174     q++;
00175     
00176     }
00177     }
00178   if(Vr_adc < 0.05f){
00179          q=0;
00180          Vr_adc=0; 
00181          
00182        }  
00183         
00184      aveo=Vr_adc;   
00185   
00186        if((aveo<=0.15)&&(aveo>0.1)){
00187         Wt=fmodf(s * 50, 1) * PI* 2; 
00188         Vq=0.4;
00189        }
00190         if((aveo<=0.2)&&(aveo>0.15)){
00191         Wt=fmodf(s * 55, 1) * PI* 2; 
00192          Vq=0.45;
00193        }
00194         if((aveo<=0.25)&&(aveo>0.2)){
00195         Wt=fmodf(s * 60, 1) * PI* 2; 
00196          Vq=0.5;
00197        }
00198         if((aveo<=0.3)&&(aveo>0.25)){
00199         Wt=fmodf(s * 70, 1) * PI* 2;
00200          Vq=0.55;
00201        }
00202         if((aveo<=0.35)&&(aveo>0.3)){
00203         Wt=fmodf(s * 80, 1) * PI* 2; 
00204          Vq=0.6;
00205        }
00206         if((aveo<=0.4)&&(aveo>0.35)){
00207         Wt=fmodf(s * 90, 1) * PI* 2; 
00208          Vq=0.65;
00209        }
00210         if((aveo<=0.45)&&(aveo>0.4)){
00211         Wt=fmodf(s * 100, 1) * PI* 2; 
00212          Vq=0.7;
00213        }
00214         if((aveo<=0.5)&&(aveo>0.45)){
00215         Wt=fmodf(s * 110, 1) * PI* 2;
00216          Vq=0.7;
00217        }
00218         if((aveo<=0.55)&&(aveo>0.5)){
00219         Wt=fmodf(s * 120, 1) * PI* 2; 
00220          Vq=0.7;
00221        }
00222         if((aveo<=0.6)&&(aveo>0.55)){
00223         Wt=fmodf(s * 130, 1) * PI* 2; 
00224          Vq=0.7;
00225        }
00226        if((aveo<=0.65)&&(aveo>0.6)){
00227         Wt=fmodf(s * 140, 1) * PI* 2; 
00228          Vq=0.7;
00229        }
00230         if((aveo<=0.7)&&(aveo>0.65)){
00231         Wt=fmodf(s * 150, 1) * PI* 2; 
00232          Vq=0.8;
00233        }
00234         if((aveo<=0.75)&&(aveo>0.7)){
00235         Wt=fmodf(s * 160, 1) * PI* 2; 
00236          Vq=0.8;
00237        }
00238         if((aveo<=0.8)&&(aveo>0.75)){
00239         Wt=fmodf(s * 170, 1) * PI* 2; 
00240          Vq=0.8;
00241        }
00242         if((aveo<=0.85)&&(aveo>0.8)){
00243         Wt=fmodf(s * 180, 1) * PI* 2; 
00244          Vq=0.8;
00245        }
00246         if((aveo<=0.9)&&(aveo>0.85)){
00247         Wt=fmodf(s * 190, 1) * PI* 2; 
00248          Vq=0.9;
00249        }
00250         if((aveo<=0.95)&&(aveo>0.9)){
00251         Wt=fmodf(s * 200, 1) * PI* 2; 
00252          Vq=0.9;
00253        }
00254          if(aveo>0.95){
00255         Wt=fmodf(s * 210, 1) * PI* 2; 
00256          Vq=0.9;
00257        }
00258        
00259 if(aveo<0.1){  
00260    mypwmA.write(0);
00261       mypwmB.write(0);
00262        mypwmC.write(0);
00263 
00264 }
00265 else{    
00266         Va=cos(Wt)*Vd-sin(Wt)*Vq;
00267         Vb=sin(Wt)*Vd+cos(Wt)*Vq;
00268         aVa=abs(Va);
00269         a3Vb=abs(sq3*Vb);
00270       
00271     if((Va>=0)&&(Vb>=0)&&(aVa>=a3Vb)){  //sect 0
00272      
00273        d1=sq32*(Va-sq3*Vb)*Vdlink;
00274        d2=sq32*(sq23*Vb)*Vdlink;
00275        d07=(z-(d1+d2))*0.5;
00276       // d07=0;
00277        du=d1+d2+d07;
00278        dv=d2+d07;
00279        dw=d07;
00280      
00281      }
00282     if((aVa<=sq3*Vb)){  //sect 1
00283      
00284        d3=sq32*(-Va+sq3*Vb)*Vdlink;
00285        d2=sq32*(Va+sq3*Vb)*Vdlink;
00286        d07=(z-(d2+d3))*0.5;
00287        //d07=0;
00288        du=d2+d07;
00289        dv=d2+d3+d07;
00290        dw=d07;
00291      } 
00292          
00293     if((Va<=0)&&(Vb>=0)&&(aVa>=a3Vb)){  //sect 2
00294      
00295        d3=sq32*sq23*Vb*Vdlink;
00296        d4=sq32*(-Va-sq3*Vb)*Vdlink;
00297        d07=(z-(d3+d4))*0.5;
00298       // d07=0;
00299        du=d07;
00300        dv=d3+d4+d07;
00301        dw=d4+d07;
00302      } 
00303      
00304     if((Va<=0)&&(Vb<=0)&&(aVa>=a3Vb)){  //sect 3
00305      
00306        d5=-sq32*sq23*Vb*Vdlink;
00307        d4=sq32*(-Va+sq3*Vb)*Vdlink;
00308        d07=(z-(d4+d5))*0.5;
00309        //d07=0;
00310        du=d07;
00311        dv=d4+d07;
00312        dw=d4+d5+d07;
00313      }  
00314    
00315     if((aVa<=-sq3*Vb)){  //sect 4
00316      
00317        d5=sq32*(-Va-sq3*Vb)*Vdlink;;
00318        d6=sq32*(Va-sq3*Vb)*Vdlink;
00319        d07=(z-(d5+d6))*0.5;
00320        //d07=0;
00321        du=d6+d07;
00322        dv=d07;
00323        dw=d5+d6+d07;
00324      }  
00325      
00326      if((Va>=0)&&(Vb<=0)&&(aVa>=a3Vb)){  //sect 5
00327      
00328        d1=sq32*(Va+sq3*Vb)*Vdlink;;
00329        d6=-sq32*sq23*Vb*Vdlink;;
00330        d07=(z-(d1+d6))*0.5;
00331        //d07=0;
00332        du=d1+d6+d07;
00333        dv=d07;
00334        dw=d6+d07;
00335      }   
00336     
00337      mypwmA.write(du);
00338       mypwmB.write(dv);
00339        mypwmC.write(dw);
00340     }
00341        
00342          SWAVE=dw;
00343        
00344      }
00345      }