Open Loop Vector Space Vector PWM
Fork of Vector_Open_SVPWM by
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sat Jul 30 2022 12:59:39 by
1.7.2
