Changeset 1327 for applications

Show
Ignore:
Timestamp:
04/12/11 22:30:39 (13 years ago)
Author:
smidl
Message:

scaled models for direct comparison

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • applications/pmsm/pmsm.h

    r1295 r1327  
    44#include <math/functions.h> 
    55#include "base/user_info.h" 
     6#include "ekf_example/reference_Q15.h" 
    67 
    78/*! \defgroup PMSM  
     
    222223 
    223224UIREGISTER ( IMpmsmOT ); 
     225 
     226//! Evolution model of \f$ \omega, \vartheta\f$ for a PMSM drive and its derivative with respect to \f$x\f$ -- Scaled to [-1,1] 
     227class IMpmsmOTsc : public diffbifn { 
     228protected: 
     229        double Rs, Ls, dt, Ypm, kp, p,  J, Mz; 
     230         
     231        bool cutoff; 
     232public: 
     233        IMpmsmOTsc() :diffbifn ( ) {dimy=2; dimx = 2; dimu=4; dimc=6;cutoff=true;}; 
     234        //! Set mechanical and electrical variables 
     235        virtual void set_parameters ( double Rs0, double Ls0, double dt0, double Ypm0, double kp0, double p0, double J0, double Mz0 ) {Rs=Rs0; Ls=Ls0; dt=dt0; Ypm=Ypm0; kp=kp0; p=p0; J=J0; Mz=Mz0;} 
     236         
     237         
     238        vec eval ( const vec &x0, const vec &u0 ) { 
     239                // last state 
     240                const double &omm = x0 ( 0 ); 
     241                const double &thm = x0 ( 1 ); 
     242                double uam; 
     243                double ubm; 
     244                 
     245                uam = u0(0); 
     246                ubm = u0(1); 
     247                 
     248                const double &iam = u0 ( 2 ); 
     249                const double &ibm = u0 ( 3 ); 
     250                 
     251                vec xk( 2 ); 
     252                //ia 
     253                //om 
     254                xk ( 0 ) = omm + kp*p*p * Ypm/J*dt *Iref/Wref* ( ibm * cos ( thm*Thetaref/(1<<15) )-iam * sin ( thm*Thetaref/(1<<15) ) ); 
     255                //th 
     256                xk ( 1 ) = thm + omm*Wref/Thetaref*dt; // <0..2pi> 
     257                if (cutoff) { 
     258                        if ( xk ( 1 ) >(1<<15) ) xk ( 1 )=-(1<<15); 
     259                        if ( xk ( 1 ) <-(1<<15) ) xk ( 1 ) =(1<<15); 
     260                } 
     261                return xk; 
     262        } 
     263         
     264        void dfdx_cond ( const vec &x0, const vec &u0, mat &A, bool full=true ) { 
     265                const double &omm = x0 ( 0 ); 
     266                const double &thm = x0 ( 1 ); 
     267                 
     268                const double &iam = u0 ( 2 ); 
     269                const double &ibm = u0 ( 3 ); 
     270                 
     271                // d ia 
     272                // d om 
     273                A ( 0,0 ) = 1.0; 
     274                A ( 0,1 ) = 0.0;//kp*p*p * Ypm/J*dt* ( -ibm * sin ( thm )-iam * cos ( thm ) ); 
     275                // d th 
     276                A ( 1,0 ) = dt*Wref/Thetaref;  
     277                A ( 1,1 ) = 1.0; 
     278        } 
     279         
     280        void dfdu_cond ( const vec &x0, const vec &u0, mat &A, bool full=true ) {it_error ( "not needed" );}; 
     281         
     282        void from_setting( const Setting &root ) 
     283        {        
     284                 
     285                const SettingResolver& params_b=root["params"]; 
     286                const Setting& params=params_b.result; 
     287                 
     288                set_parameters ( params["Rs"], params["Ls"], 125e-6, params["Fmag"], \ 
     289                params["kp"], params["p"], params["J"], 0.0); 
     290                int cuto=0; 
     291                if (UI::get(cuto,root,"cutoff",UI::optional)){cutoff=(cuto==1);} 
     292        }; 
     293         
     294        // TODO dodelat void to_setting( Setting &root ) const; 
     295}; 
     296 
     297UIREGISTER ( IMpmsmOTsc ); 
    224298 
    225299 
     
    692766UIREGISTER ( OMpmsmOT ); 
    693767 
     768//! Observation model for PMSM drive in reduced form coordinates -- scaled to [-1,1] 
     769class OMpmsmOTsc: public diffbifn { 
     770public: 
     771        double Rs, Ls, dt, Ypm, kp, p,  J, Mz; 
     772         
     773        virtual void set_parameters ( double Rs0, double Ls0, double dt0, double Ypm0, double kp0, double p0, double J0, double Mz0 ) {Rs=Rs0; Ls=Ls0; dt=dt0; Ypm=Ypm0; kp=kp0; p=p0; J=J0; Mz=Mz0;} 
     774         
     775        OMpmsmOTsc() :diffbifn () {dimy=2;dimx=2;dimu=4;}; 
     776         
     777        vec eval ( const vec &x0, const vec &u0 ) { 
     778                vec y ( 2 ); 
     779                const double &omm = x0(0); 
     780                const double &thm = x0(1); 
     781                 
     782                const double &uam = u0 ( 0 ); 
     783                const double &ubm = u0 ( 1 ); 
     784                const double &iam = u0 ( 2 ); 
     785                const double &ibm = u0 ( 3 ); 
     786                 
     787                y ( 0 ) = ( 1.0- Rs/Ls*dt ) * iam + Ypm/Ls*dt*omm *Wref/Iref* sin ( thm*Thetaref/(1<<15) ) + (1<<15)*uam*dt/Ls /Iref; 
     788                //ib 
     789                y ( 1 ) = ( 1.0- Rs/Ls*dt ) * ibm - Ypm/Ls*dt*omm *Wref/Iref* cos ( thm*Thetaref/(1<<15) ) + (1<<15)*ubm*dt/Ls /Iref; 
     790                 
     791                return y; 
     792        } 
     793         
     794        void dfdx_cond ( const vec &x0, const vec &u0, mat &A, bool full=true ) { 
     795                const double &omm = x0(0); 
     796                const double &thm = x0(1); 
     797                 
     798                A ( 0,0 ) = Ypm/Ls*dt* Wref/Iref*sin ( thm*Thetaref/(1<<15) );  
     799                A ( 0,1 ) = Ypm/Ls*dt*omm *Wref/Iref*Thetaref/(1<<15)* ( cos ( thm*Thetaref/(1<<15) ) ); 
     800                // d ib 
     801                A ( 1,0 ) = -Ypm/Ls*dt* Wref/Iref*cos ( thm*Thetaref/(1<<15) );  
     802                A ( 1,1 ) = Ypm/Ls*dt*omm *Wref/Iref*Thetaref/(1<<15)* ( sin ( thm*Thetaref/(1<<15) ) ); 
     803                 
     804                 
     805        } 
     806         
     807        void from_setting( const Setting &root ) 
     808        {        
     809                 
     810                const SettingResolver& params_b=root["params"]; 
     811                const Setting& params=params_b.result; 
     812                 
     813                set_parameters ( params["Rs"], params["Ls"], 125e-6, params["Fmag"], \ 
     814                params["kp"], params["p"], params["J"], 0.0); 
     815        }; 
     816         
     817}; 
     818 
     819UIREGISTER ( OMpmsmOTsc ); 
     820 
    694821 
    695822/*!@}*/