Changeset 1311 for applications/pmsm
- Timestamp:
- 03/25/11 19:52:05 (14 years ago)
- 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 571 571 int32 tmp; 572 572 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]; 586 574 // 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 592 584 //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 }600 585 { 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); 604 589 log_level.store(logA,get_from_ivec(Ad)); 605 590 } 606 591 607 ///////// end of copy ///////////////608 mmultAU(PSI,Uf,PSIU,4,4);609 592 //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);*/ 599 tmp=prevod(sin(Thetaref*x_est[1]/32768.),15); 600 if (tmp>32767) t_sin =32767; else t_sin=tmp; 601 tmp=prevod(cos(Thetaref*x_est[1]/32768.),15); 602 if (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 637 tmp=((int32)cB*x_est[0])>>15; // q15*q13 -> q13 638 // q15*q13 + q13*q15 + q15*q13?? 639 y_est[0]=((int32)cA*y_old[0]+(int32)tmp*t_sin+(int32)cC*(uf[0]))>>15; // in q13 640 y_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]; 612 649 { 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]; 640 652 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)); 641 656 } 642 657 … … 644 659 int16 dR[2];dR[0]=R[0];dR[1]=R[3]; 645 660 //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); 647 662 //x_est[0] = xb[0]>>2; x_est[1]=xb[1]>>2; x_est[2]=xb[2]>>2; x_est[3]=xb[3]; 648 663 649 664 // navrat estimovanych hodnot regulatoru 650 665 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; 655 668 656 669 //x_est[2]=x[2]*32768/Wref; … … 667 680 Uf[0]=0x7FFF;// ! // 0.05 668 681 Uf[1]=Uf[2]=0; 669 Uf[ 5]=0x7FFF;//!682 Uf[3]=0x7FFF;//! 670 683 671 684 Df[0]=1<<14; … … 693 706 PSI[2]=cG; 694 707 PSI[3]=0x7FFF; 695 696 708 } 697 709 -
applications/pmsm/simulator_zdenek/ekf_example/ekf_obj.h
r1305 r1311 197 197 class EKFfixedUD2 : public BM { 198 198 public: 199 LOG_LEVEL(EKFfixedUD2,logU, logG, logD, logA, log P);199 LOG_LEVEL(EKFfixedUD2,logU, logG, logD, logA, logC, logP); 200 200 201 201 void init_ekf2(double Tv); … … 207 207 208 208 int16 x_est[2]; /* estimate and prediction */ 209 int16 y_est[2]; /* estimate and prediction */ 210 int16 y_old[2]; /* estimate and prediction */ 209 211 210 212 int16 PSI[4]; /* matrix [4,4] */ 211 213 int16 PSIU[4]; /* matrix PIS*U, [4,4] */ 214 int16 C[4]; /* matrix [4,4] */ 212 215 213 216 int16 Uf[4]; // upper triangular of covariance (inplace) … … 229 232 230 233 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;} 231 236 for(i=0;i<4;i++){Uf[i]=0;} 232 237 for(i=0;i<2;i++){Df[i]=0;} … … 235 240 236 241 for(i=0;i<4;i++){PSI[i]=0;} 242 for(i=0;i<4;i++){C[i]=0;} 237 243 238 244 set_dim(2); 245 dimc = 2; 246 dimy = 2; 239 247 E._mu()=zeros(2); 240 248 E._R()=zeros(2,2); … … 248 256 BM::log_register ( L, prefix ); 249 257 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 ); 255 264 256 265 };