pwm.cpp math.h stdlib.h pwm.h _USE_MATH_DEFINES double double up up double double up2 up2 double double dup dup int int smer smer int int smer2 smer2 int int citac citac int int citac2 citac2 int int citac_PR citac_PR double double ladeni_pila ladeni_pila double double ladeni_ur ladeni_ur void void pwm_full_init (double Ucn, double fc, double DT) pwm_full_init double Ucn double fc double DT void void pwm_full (double *us, double *u, double *Iz, double Ucn, double Uc, double *i, double fc, double *va_char, unsigned int pocet, double h) pwm_full double * us double * u double * Iz double Ucn double Uc double * i double fc double * va_char unsigned int pocet double h void void pwm_full_new_init (double h, double fc, double DT, int citac_init, int D_smer, int D_smer2) pwm_full_new_init double h double fc double DT int citac_init int D_smer int D_smer2 void void pwm_full_new (double *us, double *u, double *Iz, double Ucn, double Uc, double *is, double *va_char, unsigned int pocet) pwm_full_new double * us double * u double * Iz double Ucn double Uc double * is double * va_char unsigned int pocet void void pwm_full_new_init_3h (double h, double fc, double DT, int citac_init, int D_smer, int D_smer2) pwm_full_new_init_3h double h double fc double DT int citac_init int D_smer int D_smer2 void void pwm_full_new_3h (double *us, double *u, double *Iz, double Ucn, double Uc, double *is, double *va_char, unsigned int pocet, unsigned int mod) pwm_full_new_3h double * us double * u double * Iz double Ucn double Uc double * is double * va_char unsigned int pocet unsigned int mod double static double ubytek (double *va_char, double I, unsigned int pocet) ubytek double * va_char double I unsigned int pocet /*modulPWMmodulace ubytkyamrtvecasy shodnaverzesPWM_FULL_LC 31.5.2007 VER.zmenenametodavypoctupily(novefunkce) 31.5.2007DoplnenaPWMsetretiharmonickou-fcepwm_full_new_3h(...)-prepinanimezisinusovouPWMa3.harmonickoupomocipriznakumod! */ #define_USE_MATH_DEFINES #include<math.h> #include<stdlib.h> #include"pwm.h" voidpwm_full_init(doubleUcn,doublefc,doubleDT); voidpwm_full(double*us,double*u,double*Iz,doubleUcn,doubleUc,double*i,doublefc,double*va_char,unsignedintpocet,doubleh); voidpwm_full_new_init(doubleh,doublefc,doubleDT,intcitac_init,intD_smer,intD_smer2); voidpwm_full_new(double*us,double*u,double*Iz,doubleUcn,doubleUc,double*is,double*va_char,unsignedintpocet); //PWMsetretiharmonickou voidpwm_full_new_init_3h(doubleh,doublefc,doubleDT,intcitac_init,intD_smer,intD_smer2); voidpwm_full_new_3h(double*us,double*u,double*Iz,doubleUcn,doubleUc,double*is,double*va_char,unsignedintpocet,unsignedintmod); staticdoubleubytek(double*va_char,doubleI,unsignedintpocet); staticdoubleup,up2,dup; staticintsmer,smer2; staticintcitac,citac2,citac_PR; doubleladeni_pila,ladeni_ur; voidpwm_full_init(doubleUcn,doublefc,doubleDT) /* Ucn...jmenovitenapetikondenzatoruvssobvodu fc...spinacifrekvence h...kroksimulace DT...velikostmrtvehocasu */ { smer=-1;smer2=1; up=Ucn/2; //up=0.; up2=up-2*Ucn*fc*DT; } voidpwm_full(double*us,double*u,double*Iz,doubleUcn,doubleUc,double*is,doublefc,double*va_char,unsignedintpocet,doubleh) /* u...pozadovanenapeti us...[usx,usy]...vystupninapetistridacev(x,y) Iz...proudvssobvodu Ucn...jmenovitenap.vssobvodu Uc...skutecnenapetinaC is...[isx,isy]...proudmotorem va_char...VA-charvykonovychspinacu pocet...pocetboduVA-charky h...kroksimulace */ { unsignedinti; doubleiabc[3],ur[3],ustr[3],ua,ub,uc; doubledtr[3],dd[3];//ubytkynapolovodicich ladeni_pila=up; iabc[0]=*is; iabc[1]=(-*is+sqrt(3.)**(is+1))/2.; iabc[2]=(-*is-sqrt(3.)**(is+1))/2.; ur[0]=*u; ur[1]=(-*u+sqrt(3.)**(u+1))/2.; ur[2]=(-*u-sqrt(3.)**(u+1))/2.; for(i=0;i<3;i++) {dtr[i]=ubytek(va_char,fabs(iabc[i]),pocet); dd[i]=dtr[i]*.73; } //implementaceubytkuamrtvychcasu for(i=0;i<3;i++) if(iabc[i]>=0) if((ur[i]>up)&&(ur[i]>up2)) ustr[i]=Uc/2-dtr[i]; else ustr[i]=-(Uc/2+dd[i]); else if((ur[i]<up)&&(ur[i]<up2)) ustr[i]=-(Uc/2-dtr[i]); else ustr[i]=Uc/2+dd[i]; //fazovanapetizateze ua=(2*ustr[0]-ustr[1]-ustr[2])/3; ub=(2*ustr[1]-ustr[0]-ustr[2])/3; uc=(2*ustr[2]-ustr[0]-ustr[1])/3; //vystupninapetistridacev(x,y) *us=(2.*ua-ub-uc)/3.; *(us+1)=(ub-uc)/sqrt(3.); //vypocetpilyproPWMapilypromrtvecasy dup=2.*Ucn*fc*h; up+=smer*dup; if(up>Ucn/2) {up-=2*dup; smer=-1; } if(up<-Ucn/2) {up+=2.*dup; smer=1; } up2+=smer2*dup; if(up2>Ucn/2) {up2-=2.*dup; smer2=-1; } if(up2<-Ucn/2) {up2+=2.*dup; smer2=1; } *Iz=(ustr[0]>0)*iabc[0]+(ustr[1]>0)*iabc[1]+(ustr[2]>0)*iabc[2]; } staticdoubleubytek(double*va_char,doubleI,unsignedintpocet) { unsignedintii; doubledelta_u; ii=0; while((*(va_char+ii)<I)&&(ii<(pocet-1))) ii++; if(ii==(pocet-1))//konecva_char-predpokladnasycenicharky delta_u=*(va_char+ii+pocet); else if(ii==0) delta_u=0; else delta_u=*(va_char+ii-1+pocet)+(I-*(va_char+ii-1))/(*(va_char+ii)-*(va_char+ii-1))*(*(va_char+ii+pocet)-*(va_char+ii-1+pocet)); returndelta_u; } voidpwm_full_new(double*us,double*u,double*Iz,doubleUcn,doubleUc,double*is,double*va_char,unsignedintpocet) /* u...pozadovanenapeti us...[usx,usy]...vystupninapetistridacev(x,y) Iz...proudvssobvodu Ucn...jmenovitenap.vssobvodu Uc...skutecnenapetinaC is...[isx,isy]...proudmotorem va_char...VA-charvykonovychspinacu pocet...pocetboduVA-charky t...aktualnicassimulace */ { unsignedinti; doubleiabc[3],ur[3],ustr[3],ua,ub,uc; doubledtr[3],dd[3];//ubytkynapolovodicich //vypocetpily up=(double)citac/citac_PR*Ucn/2.; up2=(double)citac2/citac_PR*Ucn/2.; ladeni_pila=up; iabc[0]=*is; iabc[1]=(-*is+sqrt(3.)**(is+1))/2.; iabc[2]=(-*is-sqrt(3.)**(is+1))/2.; ur[0]=*u; ur[1]=(-*u+sqrt(3.)**(u+1))/2.; ur[2]=(-*u-sqrt(3.)**(u+1))/2.; for(i=0;i<3;i++) {dtr[i]=ubytek(va_char,fabs(iabc[i]),pocet); dd[i]=dtr[i]*.73; } //implementaceubytkuamrtvychcasu for(i=0;i<3;i++) if(iabc[i]>=0) if((ur[i]>up)&&(ur[i]>up2)) ustr[i]=Uc/2-dtr[i]; else ustr[i]=-(Uc/2+dd[i]); else if((ur[i]<up)&&(ur[i]<up2)) ustr[i]=-(Uc/2-dtr[i]); else ustr[i]=Uc/2+dd[i]; //fazovanapetizateze ua=(2*ustr[0]-ustr[1]-ustr[2])/3; ub=(2*ustr[1]-ustr[0]-ustr[2])/3; uc=(2*ustr[2]-ustr[0]-ustr[1])/3; //vystupninapetistridacev(x,y) *us=(2.*ua-ub-uc)/3.; *(us+1)=(ub-uc)/sqrt(3.); *Iz=(ustr[0]>0)*iabc[0]+(ustr[1]>0)*iabc[1]+(ustr[2]>0)*iabc[2]; //posunpily...inkrementcitacu if((citac==citac_PR)||(citac==-citac_PR))smer*=-1; if((citac2==citac_PR)||(citac2==-citac_PR))smer2*=-1; citac+=smer; citac2+=smer2; } voidpwm_full_new_init(doubleh,doublefc,doubleDT,intcitac_init,intD_smer,intD_smer2) /* fc...spinacifrekvence h...kroksimulace DT...velikostmrtvehocasu citac_init...pocatecninastavenicitace D_smer,D_smer1...pocatecninastavenismerucitani */ { smer=D_smer;smer2=D_smer2; citac=citac_init; citac2=citac_init-(int)(DT/h); citac_PR=(int)(1./4./fc/h); } voidpwm_full_new_init_3h(doubleh,doublefc,doubleDT,intcitac_init,intD_smer,intD_smer2) /* fc...spinacifrekvence h...kroksimulace DT...velikostmrtvehocasu citac_init...pocatecninastavenicitace D_smer,D_smer1...pocatecninastavenismerucitani */ { smer=D_smer;smer2=D_smer2; citac=citac_init; citac2=abs(citac_init-(int)(DT/h)); citac_PR=(int)(1./2./fc/h); } voidpwm_full_new_3h(double*us,double*u,double*Iz,doubleUcn,doubleUc,double*is,double*va_char,unsignedintpocet,unsignedintmod) /* u...pozadovanenapetiveformatuu={Um,beta} us...[usx,usy]...vystupninapetistridacev(x,y) Iz...proudvssobvodu Ucn...jmenovitenap.vssobvodu Uc...skutecnenapetinaC is...[isx,isy]...proudmotorem va_char...VA-charvykonovychspinacu pocet...pocetboduVA-charky t...aktualnicassimulace mod...mod=-sinusovaPWM;mod=1-PWMse3.harmonickou */ { unsignedinti; doubleiabc[3],ur[3],ustr[3],ua,ub,uc; doubledtr[3],dd[3];//ubytkynapolovodicich doubleUm,beta; doubleU3;//korekce3.harmonickou Um=*u; beta=*(u+1); //vypocetpily //up=(double)citac/citac_PR*Ucn/2.; //up2=(double)citac2/citac_PR*Ucn/2.; //vypocetpilypresnejakovprocesoru up=((double)citac/citac_PR-0.5)*Ucn; up2=((double)citac2/citac_PR-0.5)*Ucn; ladeni_pila=up; iabc[0]=*is; iabc[1]=(-*is+sqrt(3.)**(is+1))/2.; iabc[2]=(-*is-sqrt(3.)**(is+1))/2.; if(mod==0)//sinusovaPWM { ur[0]=Um*cos(beta); ur[1]=Um*cos(beta-2./3.*M_PI); ur[2]=Um*cos(beta+2./3.*M_PI); } else//PWMse3.harmonickou { //dleKarla //U3=0.13*cos(3.*beta); //moje U3=0.17*cos(3.*beta); ur[0]=Um*(cos(beta)-U3); ur[1]=Um*(cos(beta-2./3.*M_PI)-U3); ur[2]=Um*(cos(beta+2./3.*M_PI)-U3); } ladeni_ur=ur[0]; for(i=0;i<3;i++) {dtr[i]=ubytek(va_char,fabs(iabc[i]),pocet); dd[i]=dtr[i]*.73; } //implementaceubytkuamrtvychcasu for(i=0;i<3;i++) if(iabc[i]>=0) if((ur[i]>up)&&(ur[i]>up2)) ustr[i]=Uc/2-dtr[i]; else ustr[i]=-(Uc/2+dd[i]); else if((ur[i]<up)&&(ur[i]<up2)) ustr[i]=-(Uc/2-dtr[i]); else ustr[i]=Uc/2+dd[i]; //fazovanapetizateze ua=(2.*ustr[0]-ustr[1]-ustr[2])/3.; ub=(2.*ustr[1]-ustr[0]-ustr[2])/3.; uc=(2.*ustr[2]-ustr[0]-ustr[1])/3.; //vystupninapetistridacev(x,y) *us=(2.*ua-ub-uc)/3.; *(us+1)=(ub-uc)/sqrt(3.); *Iz=(ustr[0]>0)*iabc[0]+(ustr[1]>0)*iabc[1]+(ustr[2]>0)*iabc[2]; //posunpily...inkrementcitacu //if((citac==citac_PR)||(citac==-citac_PR))smer*=-1; //if((citac2==citac_PR)||(citac2==-citac_PR))smer2*=-1; if((citac==citac_PR)||(citac==0))smer*=-1; if((citac2==citac_PR)||(citac2==0))smer2*=-1; citac+=smer; citac2+=smer2; }