pmsm.h stat/libFN.h work/git/mixpp/pmsm/pmsm_mix.cpp work/git/mixpp/pmsm/pmsm_sim.cpp work/git/mixpp/pmsm/pmsm_sim2.cpp work/git/mixpp/pmsm/pmsm_sim3.cpp work/git/mixpp/pmsm/pmsm_unkQ.cpp work/git/mixpp/pmsm/pmsm_unkQpf.cpp work/git/mixpp/pmsm/sim_var.cpp work/git/mixpp/pmsm/testbidiff.cpp IMpmsm IMpmsmStat OMpmsm RV RV rx ("{ia ib om th }") rx RV RV ru ("{ua ub }") ru RV RV ry ("{oia oib }") ry #ifndefPMSM_H #definePMSM_H #include<stat/libFN.h> //TODOhardcodedRVs!!! RVrx("{iaibomth}"); RVru("{uaub}"); RVry("{oiaoib}"); //classuipmsm:publicuibase{ //doubleRs,Ls,dt,Ypm,kp,p,J,Mz; //}; classIMpmsm:publicdiffbifn{ protected: doubleRs,Ls,dt,Ypm,kp,p,J,Mz; public: IMpmsm():diffbifn(rx.count(),rx,ru){}; voidset_parameters(doubleRs0,doubleLs0,doubledt0,doubleYpm0,doublekp0,doublep0,doubleJ0,doubleMz0){Rs=Rs0;Ls=Ls0;dt=dt0;Ypm=Ypm0;kp=kp0;p=p0;J=J0;Mz=Mz0;} veceval(constvec&x0,constvec&u0){ //laststate doubleiam=x0(0); doubleibm=x0(1); doubleomm=x0(2); doublethm=x0(3); doubleuam=u0(0); doubleubm=u0(1); vecxk=zeros(4); //ia xk(0)=(1.0-Rs/Ls*dt)*iam+Ypm/Ls*dt*omm*sin(thm)+uam*dt/Ls; //ib xk(1)=(1.0-Rs/Ls*dt)*ibm-Ypm/Ls*dt*omm*cos(thm)+ubm*dt/Ls; //om xk(2)=omm+kp*p*p*Ypm/J*dt*(ibm*cos(thm)-iam*sin(thm))-p/J*dt*Mz; //th xk(3)=thm+omm*dt;//<0..2pi> if(xk(3)>pi)xk(3)-=2*pi; if(xk(3)<-pi)xk(3)+=2*pi; returnxk; } voiddfdx_cond(constvec&x0,constvec&u0,mat&A,boolfull=true){ doubleiam=x0(0); doubleibm=x0(1); doubleomm=x0(2); doublethm=x0(3); //dia A(0,0)=(1.0-Rs/Ls*dt);A(0,1)=0.0; A(0,2)=Ypm/Ls*dt*sin(thm);A(0,3)=Ypm/Ls*dt*omm*(cos(thm)); //dib A(1,0)=0.0;A(1,1)=(1.0-Rs/Ls*dt); A(1,2)=-Ypm/Ls*dt*cos(thm);A(1,3)=Ypm/Ls*dt*omm*(sin(thm)); //dom A(2,0)=kp*p*p*Ypm/J*dt*(-sin(thm)); A(2,1)=kp*p*p*Ypm/J*dt*(cos(thm)); A(2,2)=1.0; A(2,3)=kp*p*p*Ypm/J*dt*(-ibm*sin(thm)-iam*cos(thm)); //dth A(3,0)=0.0;A(3,1)=0.0;A(3,2)=dt;A(3,3)=1.0; } voiddfdu_cond(constvec&x0,constvec&u0,mat&A,boolfull=true){it_error("notneeded");}; }; classIMpmsmStat:publicIMpmsm{ IMpmsmStat():IMpmsm(){}; voidset_parameters(doubleRs0,doubleLs0,doubledt0,doubleYpm0,doublekp0,doublep0,doubleJ0,doubleMz0){Rs=Rs0;Ls=Ls0;dt=dt0;Ypm=Ypm0;kp=kp0;p=p0;J=J0;Mz=Mz0;} veceval(constvec&x0,constvec&u0){ //laststate doubleiam=x0(0); doubleibm=x0(1); doubleomm=x0(2); doublethm=x0(3); doubleuam=u0(0); doubleubm=u0(1); vecxk=zeros(4); //ia xk(0)=(1.0-Rs/Ls*dt)*iam+Ypm/Ls*dt*omm*sin(thm)+uam*dt/Ls; //ib xk(1)=(1.0-Rs/Ls*dt)*ibm-Ypm/Ls*dt*omm*cos(thm)+ubm*dt/Ls; //om xk(2)=omm;//+kp*p*p*Ypm/J*dt*(ibm*cos(thm)-iam*sin(thm))-p/J*dt*Mz; //th xk(3)=rem(thm+omm*dt,2*pi);//<0..2pi> returnxk; } voiddfdx_cond(constvec&x0,constvec&u0,mat&A,boolfull=true){ //doubleiam=x0(0); //doubleibm=x0(1); doubleomm=x0(2); doublethm=x0(3); //dia A(0,0)=(1.0-Rs/Ls*dt);A(0,1)=0.0; A(0,2)=Ypm/Ls*dt*sin(thm);A(0,3)=Ypm/Ls*dt*omm*(cos(thm)); //dib A(1,0)=0.0;A(1,1)=(1.0-Rs/Ls*dt); A(1,2)=-Ypm/Ls*dt*cos(thm);A(1,3)=Ypm/Ls*dt*omm*(sin(thm)); //dom A(2,0)=0.0;//kp*p*p*Ypm/J*dt*(-sin(thm)); A(2,1)=0.0;//kp*p*p*Ypm/J*dt*(cos(thm)); A(2,2)=1.0; A(2,3)=0.0;//kp*p*p*Ypm/J*dt*(-ibm*sin(thm)-iam*cos(thm)); //dth A(3,0)=0.0;A(3,1)=0.0;A(3,2)=dt;A(3,3)=1.0; } voiddfdu_cond(constvec&x0,constvec&u0,mat&A,boolfull=true){it_error("notneeded");}; }; classOMpmsm:publicdiffbifn{ public: OMpmsm():diffbifn(2,rx,ru){}; veceval(constvec&x0,constvec&u0){ vecy(2); y(0)=x0(0); y(1)=x0(1); returny; } voiddfdx_cond(constvec&x0,constvec&u0,mat&A,boolfull=true){ A.clear(); A(0,0)=1.0; A(1,1)=1.0; } }; #endif//PMSM_H