akiyoshi oguro
/
Vector_SVPWM_drive_F302R8
Vector SVPWM Drive SPMSM
main.cpp@0:866aafac0128, 2019-04-02 (annotated)
- Committer:
- oguro
- Date:
- Tue Apr 02 04:38:25 2019 +0000
- Revision:
- 0:866aafac0128
- Child:
- 1:74d7a989b741
Vector SVPWM SPMSM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
oguro | 0:866aafac0128 | 1 | #include "mbed.h" |
oguro | 0:866aafac0128 | 2 | #include "rtos.h" |
oguro | 0:866aafac0128 | 3 | #define TS1 0.2 |
oguro | 0:866aafac0128 | 4 | #include <math.h> |
oguro | 0:866aafac0128 | 5 | int q=0,START=10,i=0,r=0,s=0; |
oguro | 0:866aafac0128 | 6 | float uii=0,ut=0,ut1=0,ut2=0,usi=0; |
oguro | 0:866aafac0128 | 7 | float vii=0,vt=0,vt1=0,vt2=0,vsi=0; |
oguro | 0:866aafac0128 | 8 | float wii=0,wt=0,wt1=0,wt2=0,wsi=0; |
oguro | 0:866aafac0128 | 9 | |
oguro | 0:866aafac0128 | 10 | unsigned int ui=0,vi=0,wi=0,et=0; |
oguro | 0:866aafac0128 | 11 | float su=0,sv=0,sw=0,suv=0,svv=0,swv=0; |
oguro | 0:866aafac0128 | 12 | float uci=0,uc=0; |
oguro | 0:866aafac0128 | 13 | float vst=0,vstt=0,vsti=0,vstf=0,Edw=0,PI=3.141592; |
oguro | 0:866aafac0128 | 14 | float Speed; |
oguro | 0:866aafac0128 | 15 | float Wnon,Ednon,W,PLL; |
oguro | 0:866aafac0128 | 16 | float uti,vti,wti; |
oguro | 0:866aafac0128 | 17 | PwmOut mypwmA(PA_8); //PWM_OUT 8 |
oguro | 0:866aafac0128 | 18 | PwmOut mypwmB(PA_9); //9 |
oguro | 0:866aafac0128 | 19 | PwmOut mypwmC(PA_10);//10 |
oguro | 0:866aafac0128 | 20 | |
oguro | 0:866aafac0128 | 21 | PwmOut Current_Ref(PB_4); |
oguro | 0:866aafac0128 | 22 | |
oguro | 0:866aafac0128 | 23 | DigitalOut Vector(PC_4); |
oguro | 0:866aafac0128 | 24 | DigitalOut EN1(PC_10); |
oguro | 0:866aafac0128 | 25 | DigitalOut EN2(PC_11); |
oguro | 0:866aafac0128 | 26 | DigitalOut EN3(PC_12); |
oguro | 0:866aafac0128 | 27 | |
oguro | 0:866aafac0128 | 28 | DigitalOut vcl(PC_8); |
oguro | 0:866aafac0128 | 29 | |
oguro | 0:866aafac0128 | 30 | InterruptIn HA(PA_15); |
oguro | 0:866aafac0128 | 31 | InterruptIn HB(PB_3); |
oguro | 0:866aafac0128 | 32 | InterruptIn HC(PB_10); |
oguro | 0:866aafac0128 | 33 | |
oguro | 0:866aafac0128 | 34 | //AnalogIn V_adc(PB_1); //volume |
oguro | 0:866aafac0128 | 35 | AnalogIn V_adc(PC_2); // Gaibu Potention |
oguro | 0:866aafac0128 | 36 | |
oguro | 0:866aafac0128 | 37 | |
oguro | 0:866aafac0128 | 38 | /*AnalogIn Vshuntu(PA_0); |
oguro | 0:866aafac0128 | 39 | AnalogIn Vshuntv(PC_1); |
oguro | 0:866aafac0128 | 40 | AnalogIn Vshuntw(PC_0);*/ |
oguro | 0:866aafac0128 | 41 | |
oguro | 0:866aafac0128 | 42 | AnalogIn BEMF1(PC_3);//C7_37 |
oguro | 0:866aafac0128 | 43 | AnalogIn BEMF2(PB_0);//C7_34 |
oguro | 0:866aafac0128 | 44 | AnalogIn BEMF3(PA_7);//C10_26 |
oguro | 0:866aafac0128 | 45 | |
oguro | 0:866aafac0128 | 46 | |
oguro | 0:866aafac0128 | 47 | DigitalIn GPIO_BEMF(PC_9); |
oguro | 0:866aafac0128 | 48 | DigitalIn CPOUT(PA_12); |
oguro | 0:866aafac0128 | 49 | |
oguro | 0:866aafac0128 | 50 | AnalogIn Curr_ui(PA_0); |
oguro | 0:866aafac0128 | 51 | AnalogIn Curr_vi(PC_1); |
oguro | 0:866aafac0128 | 52 | AnalogIn Curr_wi(PC_0); //PA_1 |
oguro | 0:866aafac0128 | 53 | Timer uT; |
oguro | 0:866aafac0128 | 54 | Timer vT; |
oguro | 0:866aafac0128 | 55 | Timer wT; |
oguro | 0:866aafac0128 | 56 | AnalogOut SWAVE(PA_4); |
oguro | 0:866aafac0128 | 57 | |
oguro | 0:866aafac0128 | 58 | Serial pc(USBTX,USBRX); |
oguro | 0:866aafac0128 | 59 | |
oguro | 0:866aafac0128 | 60 | DigitalOut myled(LED1); |
oguro | 0:866aafac0128 | 61 | |
oguro | 0:866aafac0128 | 62 | float r2=sqrt(2.0f),r3=sqrt(3.0f); |
oguro | 0:866aafac0128 | 63 | float Cuvw[2][3]={{r2/r3,-1.0f/r2/r3,-1.0f/r2/r3}, |
oguro | 0:866aafac0128 | 64 | {0,1.0f/r2,-1.0f/r2}}; |
oguro | 0:866aafac0128 | 65 | float iuvw[3]; |
oguro | 0:866aafac0128 | 66 | float iab[2],Vab[2]; |
oguro | 0:866aafac0128 | 67 | float idq[2],idqi[2],idqo[2]; |
oguro | 0:866aafac0128 | 68 | float thave,th,thu,thv,thw,Ed,Vd,Vq,Vqi,West,Wz,Wo,Icom,Wcom; |
oguro | 0:866aafac0128 | 69 | float zet=sqrt(2.0f/3.0f),cos23=cos((2.0f/3.0f)*PI); |
oguro | 0:866aafac0128 | 70 | float cos43=cos((4.0f/3.0f)*PI),sin23=sin((2.0f/3.0f)*PI),sin43=sin((4.0f/3.0f)*PI); |
oguro | 0:866aafac0128 | 71 | float Curr_u,Curr_v,Curr_w; |
oguro | 0:866aafac0128 | 72 | float Xin,Xout; |
oguro | 0:866aafac0128 | 73 | float Idin,Vdout,Iqin,Vqout,Xsi; |
oguro | 0:866aafac0128 | 74 | int vstctle=0,vstctlz=0; |
oguro | 0:866aafac0128 | 75 | float Vr_adc=0.0f,iso=0,Vqp;; |
oguro | 0:866aafac0128 | 76 | int adc,vtv=1; |
oguro | 0:866aafac0128 | 77 | |
oguro | 0:866aafac0128 | 78 | float therr,dth,eth,phm; |
oguro | 0:866aafac0128 | 79 | float sq32=sqrt(3.0f/2.0f); |
oguro | 0:866aafac0128 | 80 | float sq23=2.0f/sqrt(3.0f); |
oguro | 0:866aafac0128 | 81 | float sq3=1.0f/sqrt(3.0f); |
oguro | 0:866aafac0128 | 82 | float Vdlink=0.6; //3.0f/5.0f; 0.45 |
oguro | 0:866aafac0128 | 83 | float aVa; |
oguro | 0:866aafac0128 | 84 | float a3Vb; |
oguro | 0:866aafac0128 | 85 | |
oguro | 0:866aafac0128 | 86 | float z=0.5;//0.7 |
oguro | 0:866aafac0128 | 87 | float Va,Vb; |
oguro | 0:866aafac0128 | 88 | float d1,d2,d3,d4,d5,d6,d07; |
oguro | 0:866aafac0128 | 89 | float du,dv,dw; |
oguro | 0:866aafac0128 | 90 | bool cu,cv,cw; |
oguro | 0:866aafac0128 | 91 | |
oguro | 0:866aafac0128 | 92 | Ticker sinTime; |
oguro | 0:866aafac0128 | 93 | |
oguro | 0:866aafac0128 | 94 | void HAH(){ |
oguro | 0:866aafac0128 | 95 | ut1=uT.read_us(); |
oguro | 0:866aafac0128 | 96 | ut=0; |
oguro | 0:866aafac0128 | 97 | ui=0; |
oguro | 0:866aafac0128 | 98 | |
oguro | 0:866aafac0128 | 99 | } |
oguro | 0:866aafac0128 | 100 | void HAL(){ |
oguro | 0:866aafac0128 | 101 | ut2=uT.read_us(); |
oguro | 0:866aafac0128 | 102 | uT.reset(); |
oguro | 0:866aafac0128 | 103 | ui=0; |
oguro | 0:866aafac0128 | 104 | |
oguro | 0:866aafac0128 | 105 | } |
oguro | 0:866aafac0128 | 106 | void HBH(){ |
oguro | 0:866aafac0128 | 107 | |
oguro | 0:866aafac0128 | 108 | vt1=vT.read_us(); |
oguro | 0:866aafac0128 | 109 | vi=0; |
oguro | 0:866aafac0128 | 110 | |
oguro | 0:866aafac0128 | 111 | } |
oguro | 0:866aafac0128 | 112 | void HBL(){ |
oguro | 0:866aafac0128 | 113 | vt2=vT.read_us(); |
oguro | 0:866aafac0128 | 114 | vT.reset(); |
oguro | 0:866aafac0128 | 115 | |
oguro | 0:866aafac0128 | 116 | } |
oguro | 0:866aafac0128 | 117 | void HCH(){ |
oguro | 0:866aafac0128 | 118 | wt1=wT.read_us(); |
oguro | 0:866aafac0128 | 119 | wi=0; |
oguro | 0:866aafac0128 | 120 | et=0; |
oguro | 0:866aafac0128 | 121 | |
oguro | 0:866aafac0128 | 122 | } |
oguro | 0:866aafac0128 | 123 | |
oguro | 0:866aafac0128 | 124 | void HCL(){ |
oguro | 0:866aafac0128 | 125 | wt2=wT.read_us(); |
oguro | 0:866aafac0128 | 126 | wT.reset(); |
oguro | 0:866aafac0128 | 127 | |
oguro | 0:866aafac0128 | 128 | } |
oguro | 0:866aafac0128 | 129 | |
oguro | 0:866aafac0128 | 130 | void CPLT(){ |
oguro | 0:866aafac0128 | 131 | pc.printf("%.3f , %.3f \r" ,Speed ,Vr_adc); |
oguro | 0:866aafac0128 | 132 | } |
oguro | 0:866aafac0128 | 133 | |
oguro | 0:866aafac0128 | 134 | void timerTS1(void const*argument){ |
oguro | 0:866aafac0128 | 135 | CPLT(); |
oguro | 0:866aafac0128 | 136 | } |
oguro | 0:866aafac0128 | 137 | |
oguro | 0:866aafac0128 | 138 | Timer Timer1; |
oguro | 0:866aafac0128 | 139 | int main() { |
oguro | 0:866aafac0128 | 140 | pc.baud(128000); |
oguro | 0:866aafac0128 | 141 | |
oguro | 0:866aafac0128 | 142 | Timer1.start(); |
oguro | 0:866aafac0128 | 143 | EN1=1; |
oguro | 0:866aafac0128 | 144 | EN2=1; |
oguro | 0:866aafac0128 | 145 | EN3=1; |
oguro | 0:866aafac0128 | 146 | |
oguro | 0:866aafac0128 | 147 | mypwmA.period_us(20); //20 |
oguro | 0:866aafac0128 | 148 | |
oguro | 0:866aafac0128 | 149 | mypwmB.period_us(20); |
oguro | 0:866aafac0128 | 150 | |
oguro | 0:866aafac0128 | 151 | mypwmC.period_us(20); |
oguro | 0:866aafac0128 | 152 | |
oguro | 0:866aafac0128 | 153 | Current_Ref.period_us(50); |
oguro | 0:866aafac0128 | 154 | Current_Ref.write(0.55); |
oguro | 0:866aafac0128 | 155 | uT.start(); |
oguro | 0:866aafac0128 | 156 | vT.start(); |
oguro | 0:866aafac0128 | 157 | wT.start(); |
oguro | 0:866aafac0128 | 158 | |
oguro | 0:866aafac0128 | 159 | RtosTimer RtosTimerTS1(timerTS1); |
oguro | 0:866aafac0128 | 160 | RtosTimerTS1.start((unsigned int)(TS1*5000)); //3000 |
oguro | 0:866aafac0128 | 161 | Thread::wait(100); |
oguro | 0:866aafac0128 | 162 | |
oguro | 0:866aafac0128 | 163 | while(1) { |
oguro | 0:866aafac0128 | 164 | |
oguro | 0:866aafac0128 | 165 | Vr_adc=V_adc.read(); |
oguro | 0:866aafac0128 | 166 | |
oguro | 0:866aafac0128 | 167 | if((Vr_adc>0.15f)&&(q==0)){ |
oguro | 0:866aafac0128 | 168 | |
oguro | 0:866aafac0128 | 169 | while(q<50){ |
oguro | 0:866aafac0128 | 170 | |
oguro | 0:866aafac0128 | 171 | mypwmA.write(0.5f); |
oguro | 0:866aafac0128 | 172 | mypwmB.write(0); |
oguro | 0:866aafac0128 | 173 | mypwmC.write(0); |
oguro | 0:866aafac0128 | 174 | wait_ms(START); |
oguro | 0:866aafac0128 | 175 | |
oguro | 0:866aafac0128 | 176 | mypwmA.write(0); |
oguro | 0:866aafac0128 | 177 | mypwmB.write(0.5f); |
oguro | 0:866aafac0128 | 178 | mypwmC.write(0.0); |
oguro | 0:866aafac0128 | 179 | wait_ms(START); |
oguro | 0:866aafac0128 | 180 | |
oguro | 0:866aafac0128 | 181 | mypwmA.write(0); |
oguro | 0:866aafac0128 | 182 | mypwmB.write(0.0); |
oguro | 0:866aafac0128 | 183 | mypwmC.write(0.5f); |
oguro | 0:866aafac0128 | 184 | wait_ms(START); |
oguro | 0:866aafac0128 | 185 | |
oguro | 0:866aafac0128 | 186 | |
oguro | 0:866aafac0128 | 187 | q++; |
oguro | 0:866aafac0128 | 188 | |
oguro | 0:866aafac0128 | 189 | } |
oguro | 0:866aafac0128 | 190 | } |
oguro | 0:866aafac0128 | 191 | //i++; |
oguro | 0:866aafac0128 | 192 | |
oguro | 0:866aafac0128 | 193 | HA.rise(&HAH); |
oguro | 0:866aafac0128 | 194 | HC.fall(&HCL); |
oguro | 0:866aafac0128 | 195 | HB.rise(&HBH); |
oguro | 0:866aafac0128 | 196 | HA.fall(&HAL); |
oguro | 0:866aafac0128 | 197 | HC.rise(&HCH); |
oguro | 0:866aafac0128 | 198 | HB.fall(&HBL); |
oguro | 0:866aafac0128 | 199 | |
oguro | 0:866aafac0128 | 200 | |
oguro | 0:866aafac0128 | 201 | Speed=60*(1/(7.0*2.0*usi*1E-6)); |
oguro | 0:866aafac0128 | 202 | |
oguro | 0:866aafac0128 | 203 | if(Vr_adc < 0.08f){ |
oguro | 0:866aafac0128 | 204 | q=0; |
oguro | 0:866aafac0128 | 205 | Vr_adc=0; |
oguro | 0:866aafac0128 | 206 | r=0; |
oguro | 0:866aafac0128 | 207 | vst=0; |
oguro | 0:866aafac0128 | 208 | i=0; |
oguro | 0:866aafac0128 | 209 | } |
oguro | 0:866aafac0128 | 210 | |
oguro | 0:866aafac0128 | 211 | |
oguro | 0:866aafac0128 | 212 | ui=ui+1; |
oguro | 0:866aafac0128 | 213 | vi=vi+1; |
oguro | 0:866aafac0128 | 214 | wi=wi+1; |
oguro | 0:866aafac0128 | 215 | et=et+1; |
oguro | 0:866aafac0128 | 216 | |
oguro | 0:866aafac0128 | 217 | uti=fabs(ut1-ut2)/float(ui)*1E-6; |
oguro | 0:866aafac0128 | 218 | vti=fabs(vt1-vt2)/float(vi)*1E-6; |
oguro | 0:866aafac0128 | 219 | wti=fabs(wt1-wt2)/float(wi)*1E-6; |
oguro | 0:866aafac0128 | 220 | //pc.printf("%.3f %.3f %.3f \r\n", uti, vti, wti); |
oguro | 0:866aafac0128 | 221 | //pc.printf(" %d \r\n",ui); |
oguro | 0:866aafac0128 | 222 | thu=2*PI*(1/(2*usi*1E-6))*ui*1.3E-4; //usi 1.3E-4 vst |
oguro | 0:866aafac0128 | 223 | thv=2*PI*(1/(2*vsi*1E-6))*vi*1.3E-4; |
oguro | 0:866aafac0128 | 224 | thw=2*PI*(1/(2*wsi*1E-6))*wi*1.3E-4; |
oguro | 0:866aafac0128 | 225 | |
oguro | 0:866aafac0128 | 226 | if(r==0){ |
oguro | 0:866aafac0128 | 227 | thave=(thu+thv+thw)/3; |
oguro | 0:866aafac0128 | 228 | th=thu; |
oguro | 0:866aafac0128 | 229 | |
oguro | 0:866aafac0128 | 230 | s=0; |
oguro | 0:866aafac0128 | 231 | } |
oguro | 0:866aafac0128 | 232 | if(r==1){ |
oguro | 0:866aafac0128 | 233 | |
oguro | 0:866aafac0128 | 234 | if((Speed > 1000)&&(Speed <=1500)){ |
oguro | 0:866aafac0128 | 235 | iso=-0.3; |
oguro | 0:866aafac0128 | 236 | Vqp=0.3*Vq; |
oguro | 0:866aafac0128 | 237 | Vdlink=0.3; |
oguro | 0:866aafac0128 | 238 | |
oguro | 0:866aafac0128 | 239 | z=0.7; |
oguro | 0:866aafac0128 | 240 | } |
oguro | 0:866aafac0128 | 241 | if((Speed > 1500)&&(Speed <=2000)){ |
oguro | 0:866aafac0128 | 242 | iso=0.7; |
oguro | 0:866aafac0128 | 243 | Vqp=0.3*Vq; |
oguro | 0:866aafac0128 | 244 | Vdlink=0.3; |
oguro | 0:866aafac0128 | 245 | |
oguro | 0:866aafac0128 | 246 | z=0.7; |
oguro | 0:866aafac0128 | 247 | } |
oguro | 0:866aafac0128 | 248 | if((Speed > 2000)&&(Speed <=3000)){ |
oguro | 0:866aafac0128 | 249 | iso=0.8; |
oguro | 0:866aafac0128 | 250 | Vqp=0.3*Vq; |
oguro | 0:866aafac0128 | 251 | Vdlink=0.35; |
oguro | 0:866aafac0128 | 252 | |
oguro | 0:866aafac0128 | 253 | z=0.7; |
oguro | 0:866aafac0128 | 254 | } |
oguro | 0:866aafac0128 | 255 | if((Speed > 3000)&&(Speed <=4000)){ |
oguro | 0:866aafac0128 | 256 | iso=1.2; |
oguro | 0:866aafac0128 | 257 | Vqp=0.4*Vq; |
oguro | 0:866aafac0128 | 258 | Vdlink=0.5; |
oguro | 0:866aafac0128 | 259 | |
oguro | 0:866aafac0128 | 260 | z=0.7; |
oguro | 0:866aafac0128 | 261 | } |
oguro | 0:866aafac0128 | 262 | if((Speed > 4000)&&(Speed <=5000)){ |
oguro | 0:866aafac0128 | 263 | iso=1.8; |
oguro | 0:866aafac0128 | 264 | Vqp=0.5*Vq; |
oguro | 0:866aafac0128 | 265 | Vdlink=0.5; |
oguro | 0:866aafac0128 | 266 | |
oguro | 0:866aafac0128 | 267 | z=0.7; |
oguro | 0:866aafac0128 | 268 | } |
oguro | 0:866aafac0128 | 269 | if((Speed > 5000)&&(Speed <=5500)){ |
oguro | 0:866aafac0128 | 270 | iso=2.2; |
oguro | 0:866aafac0128 | 271 | Vqp=0.5*Vq; |
oguro | 0:866aafac0128 | 272 | Vdlink=0.5; |
oguro | 0:866aafac0128 | 273 | |
oguro | 0:866aafac0128 | 274 | z=0.8; |
oguro | 0:866aafac0128 | 275 | } |
oguro | 0:866aafac0128 | 276 | if((Speed > 5500)&&(Speed <=6000)){ |
oguro | 0:866aafac0128 | 277 | iso=2.8; |
oguro | 0:866aafac0128 | 278 | Vqp=0.7*Vq; |
oguro | 0:866aafac0128 | 279 | Vdlink=0.6; |
oguro | 0:866aafac0128 | 280 | |
oguro | 0:866aafac0128 | 281 | z=0.9; |
oguro | 0:866aafac0128 | 282 | } |
oguro | 0:866aafac0128 | 283 | if((Speed > 6000)){ |
oguro | 0:866aafac0128 | 284 | iso=3.2; |
oguro | 0:866aafac0128 | 285 | Vqp=0.7*Vq; |
oguro | 0:866aafac0128 | 286 | Vdlink=0.9; |
oguro | 0:866aafac0128 | 287 | |
oguro | 0:866aafac0128 | 288 | z=0.95; |
oguro | 0:866aafac0128 | 289 | } |
oguro | 0:866aafac0128 | 290 | |
oguro | 0:866aafac0128 | 291 | |
oguro | 0:866aafac0128 | 292 | // th=(W*et*1.9E-4)+iso; //1.9E-4 |
oguro | 0:866aafac0128 | 293 | // th=(W*et*7.0E-4)+iso; //5.0E-4 +iso 1.9 |
oguro | 0:866aafac0128 | 294 | // th=Wo*wi*1.85E-4; |
oguro | 0:866aafac0128 | 295 | } |
oguro | 0:866aafac0128 | 296 | |
oguro | 0:866aafac0128 | 297 | if(r==0){ |
oguro | 0:866aafac0128 | 298 | su=(sin(thu)+0.2);//-0.2f; // p51 0.5 |
oguro | 0:866aafac0128 | 299 | sv=(sin(thv)+0.2);//-0.05f; |
oguro | 0:866aafac0128 | 300 | sw=(sin(thw)+0.2);//-0.05f;//-0.7 |
oguro | 0:866aafac0128 | 301 | |
oguro | 0:866aafac0128 | 302 | mypwmA.write(su*Vr_adc); |
oguro | 0:866aafac0128 | 303 | mypwmB.write(sv*Vr_adc); |
oguro | 0:866aafac0128 | 304 | mypwmC.write(sw*Vr_adc); |
oguro | 0:866aafac0128 | 305 | } |
oguro | 0:866aafac0128 | 306 | if(r==1){ |
oguro | 0:866aafac0128 | 307 | mypwmA.write(du); |
oguro | 0:866aafac0128 | 308 | mypwmB.write(dv); |
oguro | 0:866aafac0128 | 309 | mypwmC.write(dw); |
oguro | 0:866aafac0128 | 310 | } |
oguro | 0:866aafac0128 | 311 | |
oguro | 0:866aafac0128 | 312 | |
oguro | 0:866aafac0128 | 313 | myled = !myled; |
oguro | 0:866aafac0128 | 314 | // } |
oguro | 0:866aafac0128 | 315 | // } |
oguro | 0:866aafac0128 | 316 | |
oguro | 0:866aafac0128 | 317 | Curr_u=(Curr_ui); |
oguro | 0:866aafac0128 | 318 | Curr_v=(Curr_vi); |
oguro | 0:866aafac0128 | 319 | Curr_w=(Curr_wi); |
oguro | 0:866aafac0128 | 320 | |
oguro | 0:866aafac0128 | 321 | float Itau=1.0E-6,Idt=1.0E-6; // Itau=1.0E-6,Idt=1.0E-6; |
oguro | 0:866aafac0128 | 322 | /****Filter Iu********/ |
oguro | 0:866aafac0128 | 323 | float Iu1,Iu2,Iu3,Iu4;//0.01 |
oguro | 0:866aafac0128 | 324 | Iu1=Idt*(Curr_u-iuvw[0])/Itau; |
oguro | 0:866aafac0128 | 325 | Iu2=Idt*(Curr_u-(iuvw[0]+Iu1/2.0))/Itau; |
oguro | 0:866aafac0128 | 326 | Iu3=Idt*(Curr_u-(iuvw[0]+Iu2/2.0))/Itau; |
oguro | 0:866aafac0128 | 327 | Iu4=Idt*(Curr_u-(iuvw[0]+Iu3/2.0))/Itau; |
oguro | 0:866aafac0128 | 328 | iuvw[0]=iuvw[0]+(Iu1+2.0*Iu2+2.0*Iu3+Iu4)/6.0; |
oguro | 0:866aafac0128 | 329 | /*************************************/ |
oguro | 0:866aafac0128 | 330 | /****Filter Iv********/ |
oguro | 0:866aafac0128 | 331 | float Iv1,Iv2,Iv3,Iv4;//0.01 |
oguro | 0:866aafac0128 | 332 | Iv1=Idt*(Curr_v-iuvw[1])/Itau; |
oguro | 0:866aafac0128 | 333 | Iv2=Idt*(Curr_v-(iuvw[1]+Iv1/2.0))/Itau; |
oguro | 0:866aafac0128 | 334 | Iv3=Idt*(Curr_v-(iuvw[1]+Iv2/2.0))/Itau; |
oguro | 0:866aafac0128 | 335 | Iv4=Idt*(Curr_v-(iuvw[1]+Iv3/2.0))/Itau; |
oguro | 0:866aafac0128 | 336 | iuvw[1]=iuvw[1]+(Iv1+2.0*Iv2+2.0*Iv3+Iv4)/6.0; |
oguro | 0:866aafac0128 | 337 | /*************************************/ |
oguro | 0:866aafac0128 | 338 | /****Filter Iw********/ |
oguro | 0:866aafac0128 | 339 | float Iw1,Iw2,Iw3,Iw4;//0.01 |
oguro | 0:866aafac0128 | 340 | Iw1=Idt*(Curr_w-iuvw[2])/Itau; |
oguro | 0:866aafac0128 | 341 | Iw2=Idt*(Curr_w-(iuvw[2]+Iw1/2.0))/Itau; |
oguro | 0:866aafac0128 | 342 | Iw3=Idt*(Curr_w-(iuvw[2]+Iw2/2.0))/Itau; |
oguro | 0:866aafac0128 | 343 | Iw4=Idt*(Curr_w-(iuvw[2]+Iw3/2.0))/Itau; |
oguro | 0:866aafac0128 | 344 | iuvw[2]=iuvw[2]+(Iw1+2.0*Iw2+2.0*Iw3+Iw4)/6.0; |
oguro | 0:866aafac0128 | 345 | /*************************************/ |
oguro | 0:866aafac0128 | 346 | |
oguro | 0:866aafac0128 | 347 | |
oguro | 0:866aafac0128 | 348 | iab[0]=(iuvw[0]+iuvw[1]*cos23+iuvw[2]*cos43)*zet; |
oguro | 0:866aafac0128 | 349 | iab[1]=(iuvw[1]*sin23+iuvw[2]*sin43)*zet; |
oguro | 0:866aafac0128 | 350 | |
oguro | 0:866aafac0128 | 351 | |
oguro | 0:866aafac0128 | 352 | idq[0]=cos(th)*iab[0]+sin(th)*iab[1]+0.5; //thave |
oguro | 0:866aafac0128 | 353 | idq[1]=-sin(th)*iab[0]+cos(th)*iab[1]+0.5; //th |
oguro | 0:866aafac0128 | 354 | |
oguro | 0:866aafac0128 | 355 | |
oguro | 0:866aafac0128 | 356 | /****Filter Id********/ |
oguro | 0:866aafac0128 | 357 | idqo[0]=idq[0]; |
oguro | 0:866aafac0128 | 358 | float Id1,Id2,Id3,Id4;//0.01 |
oguro | 0:866aafac0128 | 359 | float Idtau= 1.0E-6,Iddt=1.0E-6; //1E-1 |
oguro | 0:866aafac0128 | 360 | Id1=Iddt*(idqi[0]-idqo[0])/Idtau; |
oguro | 0:866aafac0128 | 361 | Id2=Iddt*(idqi[0]-(idqo[0]+Id1/2.0))/Idtau; |
oguro | 0:866aafac0128 | 362 | Id3=Iddt*(idqi[0]-(idqo[0]+Id2/2.0))/Idtau; |
oguro | 0:866aafac0128 | 363 | Id4=Iddt*(idqi[0]-(idqo[0]+Id3))/Idtau; |
oguro | 0:866aafac0128 | 364 | idq[0]=idqo[0]+(Id1+2.0*Id2+2.0*Id3+Id4)/6.0; |
oguro | 0:866aafac0128 | 365 | /*************************************/ |
oguro | 0:866aafac0128 | 366 | |
oguro | 0:866aafac0128 | 367 | /****Filter Iq********/ |
oguro | 0:866aafac0128 | 368 | idqo[1]=idq[1]; |
oguro | 0:866aafac0128 | 369 | float Iq1,Iq2,Iq3,Iq4;//0.01 |
oguro | 0:866aafac0128 | 370 | float Iqtau= 1.0E-6,Iqdt=1.0E-6; |
oguro | 0:866aafac0128 | 371 | Iq1=Iqdt*(idqi[1]-idqo[1])/Iqtau; |
oguro | 0:866aafac0128 | 372 | Iq2=Iqdt*(idqi[1]-(idqo[1]+Iq1/2.0))/Iqtau; |
oguro | 0:866aafac0128 | 373 | Iq3=Iqdt*(idqi[1]-(idqo[1]+Iq2/2.0))/Iqtau; |
oguro | 0:866aafac0128 | 374 | Iq4=Iqdt*(idqi[1]-(idqo[1]+Iq3/2.0))/Iqtau; |
oguro | 0:866aafac0128 | 375 | idq[1]=idqo[1]+(Iq1+2.0*Iq2+2.0*Iq3+Iq4)/6.0; |
oguro | 0:866aafac0128 | 376 | /*************************************/ |
oguro | 0:866aafac0128 | 377 | |
oguro | 0:866aafac0128 | 378 | /*****PID Id *****/ |
oguro | 0:866aafac0128 | 379 | Idin=(-0.25)-idq[0]; |
oguro | 0:866aafac0128 | 380 | float adi,bdi,cdi,workdi[2]; |
oguro | 0:866aafac0128 | 381 | float kpdi=1.0,kidi=0.5,kddi=0.0; |
oguro | 0:866aafac0128 | 382 | float dtdi=1.0E-6;//1E-6 |
oguro | 0:866aafac0128 | 383 | adi=Idin; |
oguro | 0:866aafac0128 | 384 | bdi=workdi[1]+(Idin+workdi[0])/2.0*dtdi; |
oguro | 0:866aafac0128 | 385 | cdi=(Idin-workdi[0])/dtdi; |
oguro | 0:866aafac0128 | 386 | workdi[0]=Idin; |
oguro | 0:866aafac0128 | 387 | workdi[1]=bdi; |
oguro | 0:866aafac0128 | 388 | Vd=adi*kpdi+bdi*kidi+cdi*kddi; |
oguro | 0:866aafac0128 | 389 | /**********************************/ |
oguro | 0:866aafac0128 | 390 | |
oguro | 0:866aafac0128 | 391 | /*****PID Iq *****/ |
oguro | 0:866aafac0128 | 392 | Iqin=Vr_adc-idq[1]; |
oguro | 0:866aafac0128 | 393 | float aqi,bqi,cqi,workqi[2]; |
oguro | 0:866aafac0128 | 394 | float kpqi=2.0,kiqi=1.2,kdqi=0.0; // 1.5 0.8 |
oguro | 0:866aafac0128 | 395 | float dtqi=1.0E-6;//1E-2 |
oguro | 0:866aafac0128 | 396 | aqi=Iqin; |
oguro | 0:866aafac0128 | 397 | bqi=workqi[1]+(Iqin+workqi[0])/2.0*dtqi; |
oguro | 0:866aafac0128 | 398 | cqi=(Iqin-workqi[0])/dtqi; |
oguro | 0:866aafac0128 | 399 | workqi[0]=Iqin; |
oguro | 0:866aafac0128 | 400 | workdi[1]=bqi; |
oguro | 0:866aafac0128 | 401 | Vq=aqi*kpqi+bqi*kiqi+cqi*kdqi; |
oguro | 0:866aafac0128 | 402 | /**********************************/ |
oguro | 0:866aafac0128 | 403 | |
oguro | 0:866aafac0128 | 404 | //if(i<10000){ |
oguro | 0:866aafac0128 | 405 | //if(r==0){ |
oguro | 0:866aafac0128 | 406 | usi=ut2-ut1; |
oguro | 0:866aafac0128 | 407 | vsi=vt2-vt1; |
oguro | 0:866aafac0128 | 408 | wsi=wt2-wt1; |
oguro | 0:866aafac0128 | 409 | if(i<10000){ |
oguro | 0:866aafac0128 | 410 | vst=vsi; |
oguro | 0:866aafac0128 | 411 | vstf=vst; |
oguro | 0:866aafac0128 | 412 | } |
oguro | 0:866aafac0128 | 413 | //} |
oguro | 0:866aafac0128 | 414 | else { //kokokara else |
oguro | 0:866aafac0128 | 415 | //if(r==1){ |
oguro | 0:866aafac0128 | 416 | // usi=vstf;vsi=vstf;wsi=vstf; |
oguro | 0:866aafac0128 | 417 | vst=vstf; |
oguro | 0:866aafac0128 | 418 | |
oguro | 0:866aafac0128 | 419 | i=10000; |
oguro | 0:866aafac0128 | 420 | |
oguro | 0:866aafac0128 | 421 | // } |
oguro | 0:866aafac0128 | 422 | // r=i%100; |
oguro | 0:866aafac0128 | 423 | // i++; |
oguro | 0:866aafac0128 | 424 | |
oguro | 0:866aafac0128 | 425 | |
oguro | 0:866aafac0128 | 426 | Wz=(2*PI)/(vst*1E-6); //vst |
oguro | 0:866aafac0128 | 427 | Ed= (Vq)-0.11f*idq[1]-Wz*0.018E-3*idq[0];//0.018E-3 |
oguro | 0:866aafac0128 | 428 | phm=Ed/(Wz); |
oguro | 0:866aafac0128 | 429 | dth=(Vd-0.11f*(idq[0])+Wz*0.018E-3*(idq[1]))/(Wz*phm); //0.018E-3 |
oguro | 0:866aafac0128 | 430 | eth=asin(dth); |
oguro | 0:866aafac0128 | 431 | |
oguro | 0:866aafac0128 | 432 | /*****PID θ *****/ |
oguro | 0:866aafac0128 | 433 | |
oguro | 0:866aafac0128 | 434 | PLL=4.0; |
oguro | 0:866aafac0128 | 435 | //float WPLL=150.0; |
oguro | 0:866aafac0128 | 436 | float as,bs,cs,works[2]; |
oguro | 0:866aafac0128 | 437 | float kps=PLL,kis=PLL*PLL/5.0,kds=0.0; |
oguro | 0:866aafac0128 | 438 | float dts=1.0E-6; |
oguro | 0:866aafac0128 | 439 | Xsi=5.0-eth; |
oguro | 0:866aafac0128 | 440 | as=Xsi; |
oguro | 0:866aafac0128 | 441 | bs=works[1]+(Xsi+works[0])/2.0*dts; |
oguro | 0:866aafac0128 | 442 | cs=(Xsi-works[0])/dts; |
oguro | 0:866aafac0128 | 443 | works[0]=Xsi; |
oguro | 0:866aafac0128 | 444 | works[1]=bs; |
oguro | 0:866aafac0128 | 445 | therr=as*kps+bs*kis+cs*kds; |
oguro | 0:866aafac0128 | 446 | /*******PLL W ***********/ |
oguro | 0:866aafac0128 | 447 | if(therr>0.01){ |
oguro | 0:866aafac0128 | 448 | W=(2*PI)/((vst*1E-6)+(therr/Wz)); |
oguro | 0:866aafac0128 | 449 | } |
oguro | 0:866aafac0128 | 450 | if(therr<-0.01){ |
oguro | 0:866aafac0128 | 451 | W=(2*PI)/((vst*1E-6)-(therr/Wz)); |
oguro | 0:866aafac0128 | 452 | } |
oguro | 0:866aafac0128 | 453 | |
oguro | 0:866aafac0128 | 454 | /*****PID ω *****/ |
oguro | 0:866aafac0128 | 455 | Xin=5500*(1.07-Vr_adc)-vstf; // 5500 1.05 |
oguro | 0:866aafac0128 | 456 | float a,b,c,work[2]; |
oguro | 0:866aafac0128 | 457 | float kp=2.0,ki=0.5,kd=0.0; // 1.2 0.7 |
oguro | 0:866aafac0128 | 458 | float dt=1.0E-6;//10.0E-6 |
oguro | 0:866aafac0128 | 459 | a=Xin; |
oguro | 0:866aafac0128 | 460 | b=work[1]+(Xin+work[0])/2.0*dt; |
oguro | 0:866aafac0128 | 461 | c=(Xin-work[0])/dt; |
oguro | 0:866aafac0128 | 462 | work[0]=Xin; |
oguro | 0:866aafac0128 | 463 | work[1]=b; |
oguro | 0:866aafac0128 | 464 | Xout=a*kp+b*ki+c*kd; |
oguro | 0:866aafac0128 | 465 | |
oguro | 0:866aafac0128 | 466 | vstt=Xout; |
oguro | 0:866aafac0128 | 467 | /********************************/ |
oguro | 0:866aafac0128 | 468 | if(2000>abs(vst-vstt)){ // ie 1000 |
oguro | 0:866aafac0128 | 469 | vsti=vstf; |
oguro | 0:866aafac0128 | 470 | // vsti=vst; |
oguro | 0:866aafac0128 | 471 | r=1; |
oguro | 0:866aafac0128 | 472 | } |
oguro | 0:866aafac0128 | 473 | /*else{ |
oguro | 0:866aafac0128 | 474 | vsti=vst; |
oguro | 0:866aafac0128 | 475 | r=0; |
oguro | 0:866aafac0128 | 476 | }*/ |
oguro | 0:866aafac0128 | 477 | /****Filter********/ |
oguro | 0:866aafac0128 | 478 | float vstfo=vstf; |
oguro | 0:866aafac0128 | 479 | float dttt=10.0E-6;//100E-6 |
oguro | 0:866aafac0128 | 480 | float k11,k22,k33,k44,tau1=0.01;//0.01 |
oguro | 0:866aafac0128 | 481 | k11=dttt*(vsti-vstfo)/tau1; |
oguro | 0:866aafac0128 | 482 | k22=dttt*(vsti-(vstfo+k11/2.0))/tau1; |
oguro | 0:866aafac0128 | 483 | k33=dttt*(vsti-(vstfo+k22/2.0))/tau1; |
oguro | 0:866aafac0128 | 484 | k44=dttt*(vsti-(vstfo+k33))/tau1; |
oguro | 0:866aafac0128 | 485 | vstf=vstfo+(k11+2.0*k22+2.0*k33+k44)/6.0; |
oguro | 0:866aafac0128 | 486 | //vstf=vsti; |
oguro | 0:866aafac0128 | 487 | /*************************************/ |
oguro | 0:866aafac0128 | 488 | |
oguro | 0:866aafac0128 | 489 | |
oguro | 0:866aafac0128 | 490 | |
oguro | 0:866aafac0128 | 491 | }//else kokomade |
oguro | 0:866aafac0128 | 492 | |
oguro | 0:866aafac0128 | 493 | |
oguro | 0:866aafac0128 | 494 | |
oguro | 0:866aafac0128 | 495 | Va=cos(th)*Vd-sin(th)*Vq; //Vqp |
oguro | 0:866aafac0128 | 496 | Vb=sin(th)*Vd+cos(th)*Vq; //Vqp |
oguro | 0:866aafac0128 | 497 | |
oguro | 0:866aafac0128 | 498 | aVa=abs(Va); |
oguro | 0:866aafac0128 | 499 | a3Vb=abs(sq3*Vb); |
oguro | 0:866aafac0128 | 500 | if((Va>=0)&&(Vb>=0)&&(aVa>=a3Vb)){ //sect 0 |
oguro | 0:866aafac0128 | 501 | |
oguro | 0:866aafac0128 | 502 | d1=sq32*(Va-sq3*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 503 | d2=sq32*(sq23*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 504 | d07=(z-(d1+d2))*0.5; |
oguro | 0:866aafac0128 | 505 | // d07=0; |
oguro | 0:866aafac0128 | 506 | du=d1+d2+d07; |
oguro | 0:866aafac0128 | 507 | dv=d2+d07; |
oguro | 0:866aafac0128 | 508 | dw=d07; |
oguro | 0:866aafac0128 | 509 | |
oguro | 0:866aafac0128 | 510 | } |
oguro | 0:866aafac0128 | 511 | if((aVa<=sq3*Vb)){ //sect 1 |
oguro | 0:866aafac0128 | 512 | |
oguro | 0:866aafac0128 | 513 | d3=sq32*(-Va+sq3*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 514 | d2=sq32*(Va+sq3*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 515 | d07=(z-(d2+d3))*0.5; |
oguro | 0:866aafac0128 | 516 | //d07=0; |
oguro | 0:866aafac0128 | 517 | du=d2+d07; |
oguro | 0:866aafac0128 | 518 | dv=d2+d3+d07; |
oguro | 0:866aafac0128 | 519 | dw=d07; |
oguro | 0:866aafac0128 | 520 | } |
oguro | 0:866aafac0128 | 521 | |
oguro | 0:866aafac0128 | 522 | if((Va<=0)&&(Vb>=0)&&(aVa>=a3Vb)){ //sect 2 |
oguro | 0:866aafac0128 | 523 | |
oguro | 0:866aafac0128 | 524 | d3=sq32*sq23*Vb*Vdlink; |
oguro | 0:866aafac0128 | 525 | d4=sq32*(-Va-sq3*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 526 | d07=(z-(d3+d4))*0.5; |
oguro | 0:866aafac0128 | 527 | // d07=0; |
oguro | 0:866aafac0128 | 528 | du=d07; |
oguro | 0:866aafac0128 | 529 | dv=d3+d4+d07; |
oguro | 0:866aafac0128 | 530 | dw=d4+d07; |
oguro | 0:866aafac0128 | 531 | } |
oguro | 0:866aafac0128 | 532 | |
oguro | 0:866aafac0128 | 533 | if((Va<=0)&&(Vb<=0)&&(aVa>=a3Vb)){ //sect 3 |
oguro | 0:866aafac0128 | 534 | |
oguro | 0:866aafac0128 | 535 | d5=-sq32*sq23*Vb*Vdlink; |
oguro | 0:866aafac0128 | 536 | d4=sq32*(-Va+sq3*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 537 | d07=(z-(d4+d5))*0.5; |
oguro | 0:866aafac0128 | 538 | //d07=0; |
oguro | 0:866aafac0128 | 539 | du=d07; |
oguro | 0:866aafac0128 | 540 | dv=d4+d07; |
oguro | 0:866aafac0128 | 541 | dw=d4+d5+d07; |
oguro | 0:866aafac0128 | 542 | } |
oguro | 0:866aafac0128 | 543 | |
oguro | 0:866aafac0128 | 544 | if((aVa<=-sq3*Vb)){ //sect 4 |
oguro | 0:866aafac0128 | 545 | |
oguro | 0:866aafac0128 | 546 | d5=sq32*(-Va-sq3*Vb)*Vdlink;; |
oguro | 0:866aafac0128 | 547 | d6=sq32*(Va-sq3*Vb)*Vdlink; |
oguro | 0:866aafac0128 | 548 | d07=(z-(d5+d6))*0.5; |
oguro | 0:866aafac0128 | 549 | //d07=0; |
oguro | 0:866aafac0128 | 550 | du=d6+d07; |
oguro | 0:866aafac0128 | 551 | dv=d07; |
oguro | 0:866aafac0128 | 552 | dw=d5+d6+d07; |
oguro | 0:866aafac0128 | 553 | } |
oguro | 0:866aafac0128 | 554 | |
oguro | 0:866aafac0128 | 555 | if((Va>=0)&&(Vb<=0)&&(aVa>=a3Vb)){ //sect 5 |
oguro | 0:866aafac0128 | 556 | |
oguro | 0:866aafac0128 | 557 | d1=sq32*(Va+sq3*Vb)*Vdlink;; |
oguro | 0:866aafac0128 | 558 | d6=-sq32*sq23*Vb*Vdlink;; |
oguro | 0:866aafac0128 | 559 | d07=(z-(d1+d6))*0.5; |
oguro | 0:866aafac0128 | 560 | //d07=0; |
oguro | 0:866aafac0128 | 561 | du=d1+d6+d07; |
oguro | 0:866aafac0128 | 562 | dv=d07; |
oguro | 0:866aafac0128 | 563 | dw=d6+d07; |
oguro | 0:866aafac0128 | 564 | } |
oguro | 0:866aafac0128 | 565 | |
oguro | 0:866aafac0128 | 566 | |
oguro | 0:866aafac0128 | 567 | |
oguro | 0:866aafac0128 | 568 | // SWAVE=Vd; |
oguro | 0:866aafac0128 | 569 | // SWAVE=th/4; |
oguro | 0:866aafac0128 | 570 | // SWAVE=Vq; |
oguro | 0:866aafac0128 | 571 | // SWAVE=West/5000; |
oguro | 0:866aafac0128 | 572 | //SWAVE=Wo/5000; |
oguro | 0:866aafac0128 | 573 | //SWAVE=Wz/5000; |
oguro | 0:866aafac0128 | 574 | // SWAVE=sin(suv); |
oguro | 0:866aafac0128 | 575 | // SWAVE=iab[0]+0.5; |
oguro | 0:866aafac0128 | 576 | // SWAVE=Ed/10; |
oguro | 0:866aafac0128 | 577 | // SWAVE=idq[1]; |
oguro | 0:866aafac0128 | 578 | // SWAVE=sin(th); |
oguro | 0:866aafac0128 | 579 | // SWAVE=vst/5000; |
oguro | 0:866aafac0128 | 580 | //SWAVE=Vb; |
oguro | 0:866aafac0128 | 581 | //SWAVE=iuvw[0]; |
oguro | 0:866aafac0128 | 582 | SWAVE=su; |
oguro | 0:866aafac0128 | 583 | Vector=r; |
oguro | 0:866aafac0128 | 584 | i++; |
oguro | 0:866aafac0128 | 585 | } |
oguro | 0:866aafac0128 | 586 | } |