00001
00013 #include <stat/loggers.h>
00014 #include "simulator.h"
00015 #include "pmsm.h"
00016
00018 class pmsmDS : public DS {
00019
00020 protected:
00022 int L_x, L_ou, L_oy, L_iu, L_optu;
00024 vec profileWw;
00026 double dt_prof;
00028 int Dt;
00030 bool opt_modu;
00031 public:
00033 pmsmDS () {Dt=125; Drv=RV ( "{o_ua o_ub o_ia o_ib t_ua t_ub }" );}
00034 void set_parameters ( double Rs0, double Ls0, double Fmag0, double Bf0, double p0, double kp0, double J0, double Uc0, double DT0, double dt0 ) {
00035 pmsmsim_set_parameters ( Rs0, Ls0, Fmag0, Bf0, p0, kp0, J0, Uc0, DT0, dt0 );
00036 }
00038 void set_options ( string &opt ) {
00039 opt_modu = ( opt.find ( "modelu" ) ==string::npos );
00040 }
00041 void getdata ( vec &dt ) {dt=vec ( KalmanObs,6 );}
00042 void write ( vec &ut ) {}
00043
00044 void step() {
00045 static int ind=0;
00046 static double dW;
00047 static double Ww;
00048 if ( t>=dt_prof*ind ) {
00049 ind++;
00050 if ( ind<profileWw.length() ) {
00051
00052 if ( profileWw.length() ==1 ) {
00053 Ww=profileWw ( 0 ); dW=0.0;
00054 }
00055 else {
00056 dW = profileWw ( ind )-profileWw ( ind-1 );
00057 dW *=125e-6/dt_prof;
00058 }
00059 }
00060 else {
00061 dW = 0;
00062 }
00063 }
00064 Ww += dW;
00065
00066 for ( int i=0;i<Dt;i++ ) { pmsmsim_step ( Ww );}
00067 };
00068
00069 void log_add ( logger &L ) {
00070 L_x = L.add ( rx, "x" );
00071 L_oy = L.add ( ry, "o" );
00072 L_ou = L.add ( ru, "o" );
00073 L_iu = L.add ( ru, "t" );
00074
00075 if ( opt_modu ) {
00076 L_optu = L.add ( ru, "model" );
00077 }
00078 }
00079
00080 void logit ( logger &L ) {
00081 L.logit ( L_x, vec ( x,4 ) );
00082 L.logit ( L_oy, vec_2 ( KalmanObs[2],KalmanObs[3] ) );
00083 L.logit ( L_ou, vec_2 ( KalmanObs[0],KalmanObs[1] ) );
00084 L.logit ( L_iu, vec_2 ( KalmanObs[4],KalmanObs[5] ) );
00085 if ( opt_modu ) {
00086 double sq3=sqrt ( 3.0 );
00087 double ua,ub;
00088 double i1=x[0];
00089 double i2=0.5* ( -i1+sq3*x[1] );
00090 double i3=0.5* ( -i1-sq3*x[1] );
00091 double u1=KalmanObs[0];
00092 double u2=0.5* ( -u1+sq3*KalmanObs[1] );
00093 double u3=0.5* ( -u1-sq3*KalmanObs[1] );
00094
00095 double du1=0.7* ( double ( i1>0.1 ) - double ( i1<-0.1 ) ) +0.05*i1;
00096 double du2=0.7* ( double ( i2>0.1 ) - double ( i2<-0.1 ) ) +0.05*i2;
00097 double du3=0.7* ( double ( i3>0.1 ) - double ( i3<-0.1 ) ) +0.05*i3;
00098 ua = ( 2.0* ( u1-du1 )- ( u2-du2 )- ( u3-du3 ) ) /3.0;
00099 ub = ( ( u2-du2 )- ( u3-du3 ) ) /sq3;
00100 L.logit ( L_optu , vec_2 ( ua,ub ) );
00101 }
00102 }
00103
00104 void set_profile ( double dt, const vec &Ww ) {dt_prof=dt; profileWw=Ww;}
00105 };