regulace.cpp math.h nastaveni_regulatoru_float.h regulace.h _USE_MATH_DEFINES double double ud ud double double uq uq double double alfa alfa double double beta beta double double Sid Sid double double Siq Siq double double Surm Surm double double Iqwmax Iqwmax double double Iqw_reg Iqw_reg double double Idw_urm Idw_urm double double Sw Sw double double U U double double Um Um double double Urmf Urmf double double Kodv_ud Kodv_ud double double Kodv_uind Kodv_uind double double Isd Isd double double Isq Isq double double Fs Fs double double Fmag Fmag double double moment moment double double K_Fs K_Fs double double K_moment K_moment double double Ismaxf2 Ismaxf2 double double tmp_omezeni tmp_omezeni double double Treg Treg void void init_regulace (double Ls, double Fpm, double kp, double p, double TV) init_regulace double Ls double Fpm double kp double p double TV void void vektor_regulace (double Idw, double Iqw, double Urm_max, double Ww, double *u, double Isx, double Isy, double theta, double rychlost, double Ucn_2, double Uc, double Ucn, unsigned int rezim) vektor_regulace double Idw double Iqw double Urm_max double Ww double * u double Isx double Isy double theta double rychlost double Ucn_2 double Uc double Ucn unsigned int rezim double double pi_reg (double epsilon, double Kpf, double Kif, double MAX, double MIN, double *S) pi_reg double epsilon double Kpf double Kif double MAX double MIN double * S double double uhel (double x, double y) uhel double x double y void void filtr (double U, double *Uf, double kt) filtr double U double * Uf double kt /******************************************** VectorcontrolofPMSMDrive Control-floatingpoint Z.Peroutka Rev.16.3.2008 *********************************************/ #define_USE_MATH_DEFINES #include<math.h> #include"nastaveni_regulatoru_float.h" #include"regulace.h" voidinit_regulace(doubleLs,doubleFpm,doublekp,doublep,doubleTV); voidvektor_regulace(doubleIdw,doubleIqw,doubleUrm_max,doubleWw,double*u,doubleIsx,doubleIsy,doubletheta,doublerychlost,doubleUcn_2,doubleUc,doubleUcn,unsignedintrezim); staticdoublepi_reg(doubleepsilon,doubleKpf,doubleKif,doubleMAX,doubleMIN,double*S); staticdoubleuhel(doublex,doubley); staticvoidfiltr(doubleU,double*Uf,doublekt); //regulatoryproudu staticdoubleud,uq,alfa,beta; staticdoubleSid,Siq,Surm; //omezenimomentu staticdoubleIqwmax,Iqw_reg; staticdoubleIdw_urm; //regulatorrychlosti staticdoubleSw; staticdoubleU; staticdoubleUm,Urmf;//velikostnapeti //odvazbovaciobvod-blokvypocetnapeti staticdoubleKodv_ud,Kodv_uind; staticdoubleIsd,Isq,Fs,Fmag,moment,K_Fs,K_moment; staticdoubleIsmaxf2,tmp_omezeni; doubleTreg; doubleuhel(doublex,doubley) { doubleth; if(x==0) if(y==0)th=0.; elseif(y>0)th=M_PI/2.; elseth=-M_PI/2.; else th=atan(y/x); if(x<0)th+=M_PI; returnth; } doublepi_reg(doubleepsilon,doubleKpf,doubleKif,doubleMAX,doubleMIN,double*S) { doubleout; out=Kpf*epsilon+*S; if(out>MAX)out=MAX; elseif(out<MIN)out=MIN; else *S+=Kif*epsilon; returnout; } voidfiltr(doubleU,double*Uf,doublekt) { doubleUfpom; Ufpom=*Uf; *Uf=Ufpom+kt*(U-*Uf); } voidinit_regulace(doubleLs,doubleFpm,doublekp,doublep,doubleTV) { doubleKpd;//pomocnavelicina //parametryproodvazbeni Fmag=Fpm; Sid=0;//nulovaniintegracnislozky Siq=0; Surm=0;//nulovaniintegracnislozky Urmf=0;//filtrovanenapetiUrm //omezenimomentukvulimomentuzvratu-omezenipomocifrmax Ismaxf2=Ismax*Ismax; //blokVYPOCETNAPETI Kodv_ud=Ls; Kodv_uind=Fmag; //regulatorrychlosti Sw=0; Treg=TV; } voidvektor_regulace(doubleIdw,doubleIqw,doubleUrm_max,doubleWw,double*u,doubleIsx,doubleIsy,doubletheta,doublerychlost,doubleUcn_2,doubleUc,doubleUcn,unsignedintrezim) { //vypocetIsd,Isq Isd=Isx*cos(theta)+Isy*sin(theta); Isq=Isy*cos(theta)-Isx*sin(theta); Iqw_reg=pi_reg(Ww-rychlost,Kpw,Kpw*Treg/Tiw,MAXw,-MAXw,&Sw); if(rezim==0) Iqw_reg=Iqw;//vyrazenireg.rychlosti if(rezim==2)//zkouskamax.momentu Iqw_reg=Iqwmax;//Iqw=sqrt(Imax^2-Idw^2) //Regulatorodbuzovani Idw_urm=pi_reg(Urm_max-Urmf,Kpurm,Kpurm*Treg/Tiurm,0.,MINurm,&Surm); //regulaceprouduId,Iq ud=pi_reg(Idw_urm-Isd,Kpi,Kpi*Treg/Tii,MAXi,-MAXi,&Sid); //omezenimax.momentu(resp.max.Iqw)sohledemnamax.proud tmp_omezeni=Ismaxf2-Idw_urm*Idw_urm; if(tmp_omezeni<0)Iqwmax=0; elseIqwmax=sqrt(tmp_omezeni); if(Iqw_reg>Iqwmax)Iqw_reg=Iqwmax; if(Iqw_reg<-Iqwmax)Iqw_reg=-Iqwmax; uq=pi_reg(Iqw_reg-Isq,Kpi,Kpi*Treg/Tii,MAXi,-MAXi,&Siq); ud-=Kodv_ud*rychlost*Iqw_reg; uq+=Kodv_ud*rychlost*Idw_urm+Kodv_uind*rychlost; //omezeni-saturacenapeti-stejneomezenijakoureg.proudu if(ud>MAXi)ud=MAXi; if(ud<-MAXi)ud=-MAXi; if(uq>MAXi)uq=MAXi; if(uq<-MAXi)uq=-MAXi; //velikostapolohavektorunapeti Um=sqrt(ud*ud+uq*uq); alfa=uhel(ud,uq); //vypocetpolohyvektorunapetivestojicimsouradnemsystemu beta=alfa+theta; //vypocetUrmfprodalsiperioduvzorkovani filtr(Um/Ucn_2,&Urmf,Treg/Tfurm); //saturationofmodulationdepthgoingtoPWM if(Um>Ucn_2*Urm_max)Um=Ucn_2*Urm_max;//linearmodulationareaonly-ensuremax.modulationdepth *u=Um; *(u+1)=beta; }