Changeset 1311 for applications

Show
Ignore:
Timestamp:
03/25/11 19:52:05 (13 years ago)
Author:
smidl
Message:

ekf2

Location:
applications/pmsm/simulator_zdenek/ekf_example
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.cpp

    r1305 r1311  
    571571        int32 tmp; 
    572572         
    573         // implementace v PC 
    574         /*      t_sin=prevod(sin(Thetaref*x_est[3]/32768.),15); 
    575          *      t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15);*/ 
    576         tmp=prevod(sin(Thetaref*x_est[3]/32768.),15); 
    577         if (tmp>32767) t_sin =32767; else t_sin=tmp; 
    578         tmp=prevod(cos(Thetaref*x_est[3]/32768.),15); 
    579         if (tmp>32767) t_cos =32767; else t_cos=tmp; 
    580          
    581         tmp=((int32)cB*x_est[2])>>15; // q15*q13 -> q13 
    582         //             q15*q13 +          q13*q15      + q15*q13?? 
    583         x_est[0]=((int32)cA*x_est[0]+(int32)tmp*t_sin+(int32)cC*(uf[0]))>>15; // in q13 
    584         x_est[1]=((int32)cA*x_est[1]-(int32)tmp*t_cos+(int32)cC*(uf[1]))>>15; // q13 
    585         x_est[2]=x_est[2]; 
     573        x_est[0]=x_est[0]; 
    586574        //               q15              + q15*q13 
    587         x_est[3]=(((int32)x_est[3]<<15)+(int32)cG*x_est[2])>>15; 
    588          
    589         if(x_est[3]>(1<<15)) x_est[3]-=2*(1<<15); 
    590         if(x_est[3]<-(1<<15)) x_est[3]+=2*(1<<15); 
    591          
     575        x_est[1]=(((int32)x_est[1]<<15)+(int32)cG*x_est[0])>>15; 
     576         
     577//      if(x_est[1]>(1<<15)) x_est[1]-=2*(1<<15); 
     578//      if(x_est[1]<-(1<<15)) x_est[1]+=2*(1<<15); 
     579         
     580         
     581        ///////// end of copy /////////////// 
     582        mmultAU(PSI,Uf,PSIU,2,2); 
     583 
    592584        //void EKFfixed::update_psi(void) 
    593         {        
    594                 PSI[2]=((int32)cB*t_sin)>>15; 
    595                 tmp=((int32)cH*x_est[2])>>15; // ! cH =cB with different scale!! 
    596                 PSI[3]=((int32)tmp*t_cos)>>15; 
    597                 PSI[6]=-((int32)cB*t_cos)>>15; 
    598                 PSI[7]=((int32)tmp*t_sin)>>15; 
    599         } 
    600585        { 
    601                 int Ai[16]; 
    602                 for (int i=0;i<16; i++) Ai[i]=(int)(PSI[i]); 
    603                 ivec Ad(Ai,16); 
     586                int Ai[4]; 
     587                for (int i=0;i<4; i++) Ai[i]=(int)(PSIU[i]); 
     588                ivec Ad(Ai,4); 
    604589                log_level.store(logA,get_from_ivec(Ad)); 
    605590        } 
    606591         
    607         ///////// end of copy /////////////// 
    608         mmultAU(PSI,Uf,PSIU,4,4); 
    609592        //thorton(int16 *U, int16 *D, int16 *PSIU, int16 *Q, int16 *G, int16 *Dold, unsigned int16 dimx); 
    610         thorton_fast(Uf,Df,PSIU,Q,G,Dfold,4); 
    611          
     593        thorton_fast(Uf,Df,PSIU,Q,G,Dfold,2); 
     594         
     595 
     596// implementace v PC 
     597/*      t_sin=prevod(sin(Thetaref*x_est[3]/32768.),15); 
     598 *      t_cos=prevod(cos(Thetaref*x_est[3]/32768.),15);*/ 
     599tmp=prevod(sin(Thetaref*x_est[1]/32768.),15); 
     600if (tmp>32767) t_sin =32767; else t_sin=tmp; 
     601tmp=prevod(cos(Thetaref*x_est[1]/32768.),15); 
     602if (tmp>32767) t_cos =32767; else t_cos=tmp; 
     603 
     604{        
     605        C[0]=((int32)cB*t_sin)>>15; 
     606        tmp=((int32)cH*x_est[0])>>15; // ! cH =cB with different scale!! 
     607        C[1]=((int32)tmp*t_cos)>>15; 
     608        C[2]=-((int32)cB*t_cos)>>15; 
     609        C[3]=((int32)tmp*t_sin)>>15; 
     610} 
     611 
     612 
     613{ 
     614        int Ui[4];      for (int i=0;i<4; i++) Ui[i]=(int)Uf[i]; 
     615        int Ci[4];      for (int i=0;i<4; i++) Ci[i]=(int)C[i]; 
     616         
     617        imat Ud(Ui,2,2); 
     618        imat Cd(Ci,2,2); 
     619        imat CU = Cd*Ud/(1<<15); 
     620        log_level.store(logU,get_from_ivec(ivec(CU._data(),CU._datasize()))); 
     621         
     622        int di[2];      for (int i=0;i<2; i++) di[i]=(int)Df[i]; 
     623        ivec dd(di,2); 
     624        imat U(Ui,2,2); 
     625        mat U2=to_mat(U)/32768; 
     626        mat PP=U2*diag(to_vec(dd))*U2.T(); 
     627        vec pp(PP._data(),4); 
     628        log_level.store(logP,pp); 
     629} 
     630{ 
     631        int Gi[4];      for (int i=0;i<4; i++) Gi[i]=(int)G[i]; 
     632        ivec Gd(Gi,4); 
     633        log_level.store(logG,get_from_ivec(Gd)); 
     634} 
     635 
     636 
     637tmp=((int32)cB*x_est[0])>>15; // q15*q13 -> q13 
     638//             q15*q13 +          q13*q15      + q15*q13?? 
     639y_est[0]=((int32)cA*y_old[0]+(int32)tmp*t_sin+(int32)cC*(uf[0]))>>15; // in q13 
     640y_est[1]=((int32)cA*y_old[1]-(int32)tmp*t_cos+(int32)cC*(uf[1]))>>15; // q13 
     641 
     642         
     643        int16 difz[2]; 
     644        difz[0]=(Y_mes[0]-y_est[0]); // shift to q15!! 
     645        difz[1]=(Y_mes[1]-y_est[1]);//<<2; 
     646         
     647        y_old[0] = Y_mes[0]; 
     648        y_old[1] = Y_mes[1]; 
    612649        { 
    613                 int Ui[16];     for (int i=0;i<16; i++) Ui[i]=(int)Uf[i]; 
    614                  
    615                 ivec Ud(Ui,16); 
    616                 log_level.store(logU,get_from_ivec(Ud)); 
    617                  
    618                 int di[16];     for (int i=0;i<16; i++) di[i]=(int)Df[i]; 
    619                 ivec dd(di,4); 
    620                 imat U(Ui,4,4); 
    621                 mat U2=to_mat(U)/32768; 
    622                 mat PP=U2*diag(to_vec(dd))*U2.T(); 
    623                 vec pp(PP._data(),16); 
    624                 log_level.store(logP,pp); 
    625         } 
    626         { 
    627                 int Gi[16];     for (int i=0;i<16; i++) Gi[i]=(int)G[i]; 
    628                 ivec Gd(Gi,16); 
    629                 log_level.store(logG,get_from_ivec(Gd)); 
    630         } 
    631          
    632          
    633         int16 difz[2]; 
    634         difz[0]=(Y_mes[0]-x_est[0]); // shift to q15!! 
    635         difz[1]=(Y_mes[1]-x_est[1]);//<<2; 
    636          
    637         { 
    638                 int Di[4];               for (int i=0;i<4; i++) Di[i]=(int)Df[i]; 
    639                 ivec dd(Di,4);//;dd(0)=Y_mes[0];dd(1)=Y_mes[1]; dd(2)=difz[0]; dd(3)=difz[1]; 
     650                int Di[2];               for (int i=0;i<2; i++) Di[i]=(int)Df[i]; 
     651                ivec dd(Di,2);//;dd(0)=Y_mes[0];dd(1)=Y_mes[1]; dd(2)=difz[0]; dd(3)=difz[1]; 
    640652                log_level.store(logD,get_from_ivec(dd)); 
     653                int Ci[4];               for (int i=0;i<4; i++) Ci[i]=(int)C[i]; 
     654                ivec CC(Ci,4);//;dd(0)=Y_mes[0];dd(1)=Y_mes[1]; dd(2)=difz[0]; dd(3)=difz[1]; 
     655                log_level.store(logC,get_from_ivec(CC)); 
    641656        } 
    642657         
     
    644659        int16 dR[2];dR[0]=R[0];dR[1]=R[3]; 
    645660        //int16 xb[4]; xb[0]=x_est[0]<<2; xb[1]=x_est[1]<<2;  xb[2]=x_est[2]<<2;  xb[3]=x_est[3];   
    646         bierman_fast(difz,x_est,Uf,Df,dR,2,4); 
     661        bierman_fastC(difz,x_est,Uf,Df,C,dR,2,2); 
    647662        //x_est[0] = xb[0]>>2; x_est[1]=xb[1]>>2; x_est[2]=xb[2]>>2; x_est[3]=xb[3]; 
    648663         
    649664        // navrat estimovanych hodnot regulatoru 
    650665        vec& mu = E._mu(); 
    651         (mu)(0)=zprevod(x_est[0],15)*Iref; 
    652         (mu)(1)=zprevod(x_est[1],15)*Iref; 
    653         (mu)(2)=zprevod(x_est[2],15)*Wref; 
    654         (mu)(3)=zprevod(x_est[3],15)*Thetaref; 
     666        (mu)(0)=zprevod(x_est[0],15)*Wref; 
     667        (mu)(1)=zprevod(x_est[1],15)*Thetaref; 
    655668         
    656669        //x_est[2]=x[2]*32768/Wref; 
     
    667680        Uf[0]=0x7FFF;// !       // 0.05 
    668681        Uf[1]=Uf[2]=0; 
    669         Uf[5]=0x7FFF;//! 
     682        Uf[3]=0x7FFF;//! 
    670683         
    671684        Df[0]=1<<14; 
     
    693706        PSI[2]=cG; 
    694707        PSI[3]=0x7FFF; 
    695          
    696708} 
    697709 
  • applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.h

    r1305 r1311  
    197197class EKFfixedUD2 : public BM { 
    198198public: 
    199         LOG_LEVEL(EKFfixedUD2,logU, logG, logD, logA, logP); 
     199        LOG_LEVEL(EKFfixedUD2,logU, logG, logD, logA, logC, logP); 
    200200         
    201201        void init_ekf2(double Tv); 
     
    207207         
    208208        int16 x_est[2]; /* estimate and prediction */ 
     209        int16 y_est[2]; /* estimate and prediction */ 
     210        int16 y_old[2]; /* estimate and prediction */ 
    209211         
    210212        int16 PSI[4]; /* matrix [4,4] */ 
    211213        int16 PSIU[4]; /* matrix PIS*U, [4,4] */ 
     214        int16 C[4]; /* matrix [4,4] */ 
    212215         
    213216        int16 Uf[4]; // upper triangular of covariance (inplace) 
     
    229232                 
    230233                for(i=0;i<2;i++){x_est[i]=0;} 
     234                for(i=0;i<2;i++){y_est[i]=0;} 
     235                for(i=0;i<2;i++){y_old[i]=0;} 
    231236                for(i=0;i<4;i++){Uf[i]=0;} 
    232237                for(i=0;i<2;i++){Df[i]=0;} 
     
    235240                 
    236241                for(i=0;i<4;i++){PSI[i]=0;} 
     242                for(i=0;i<4;i++){C[i]=0;} 
    237243                 
    238244                set_dim(2); 
     245                dimc = 2; 
     246                dimy = 2; 
    239247                E._mu()=zeros(2); 
    240248                E._R()=zeros(2,2); 
     
    248256                BM::log_register ( L, prefix ); 
    249257                 
    250                 L.add_vector ( log_level, logG, RV("G",4), prefix ); 
    251                 L.add_vector ( log_level, logU, RV ("U", 4 ), prefix ); 
    252                 L.add_vector ( log_level, logD, RV ("D", 2 ), prefix ); 
    253                 L.add_vector ( log_level, logA, RV ("A", 4 ), prefix ); 
    254                 L.add_vector ( log_level, logP, RV ("P", 4 ), prefix ); 
     258                L.add_vector ( log_level, logG, RV("G2",4), prefix ); 
     259                L.add_vector ( log_level, logU, RV ("U2", 4 ), prefix ); 
     260                L.add_vector ( log_level, logD, RV ("D2", 2 ), prefix ); 
     261                L.add_vector ( log_level, logA, RV ("A2", 4 ), prefix ); 
     262                L.add_vector ( log_level, logC, RV ("C2", 4 ), prefix ); 
     263                L.add_vector ( log_level, logP, RV ("P2", 4 ), prefix ); 
    255264                 
    256265        };