教你三相永磁同步电机隆博戈观测matlab搭建

文章详细介绍了隆博戈观测器在三相永磁同步电机中的应用,目的是通过观测器估算电机的反电动势,从而获取定子电角度信息。在MATLAB中实现了观测器的离散化和控制算法,包括误差计算和状态更新,最终用于电机速度和角度的估计。
摘要由CSDN通过智能技术生成

一、观测器原理

在这里插入图片描述
对这个原理不懂的小伙伴们,可以去看B站DR_can的视频。后续有空我再将这里细化讲解一下
简而言之:目标就是设计一组K值使得模型估算的Xhat 和 实际的X相等。 Xhat - X收敛于0,即知道了实际的X的值,这就是观测器的基本原理.

二、三相永磁同步电机的基本公式

2.1定子电压方程

在这里插入图片描述

2.2隆博戈观测器的组成

在这里插入图片描述

2.3隆博戈观测的推导

在这里插入图片描述
提问题:
为什么要用隆博戈观测器?
通过隆博戈观测器,主要是为了电机得到alpha,beta轴的反电动势
为什么要得到alpha,beta轴的反电动势?
因为反电动势中蕴含了电机定子电角度信息,如下面:在这里插入图片描述
要弄明白的是模型的输入与输出分别是什么?
模型输入: Ialpha、Ibeta、Ualpha、Ubeta、We
模型输出:Ealpha、Ebeta

2.4隆博戈观测器的离散化

在这里插入图片描述

三、matlab实现隆博戈观测器

第一步:找到subsytem

在这里插入图片描述
建立5个输入口,2个输出口
在这里插入图片描述
建立类似于下面的图:
在这里插入图片描述

需要更加使用matlab的S-function实现的高阶的离散化实现或者上述整个连续模型的实现,请留下评论联系 要收费哦!

五、具体的M0方案实现代码


static int16_t STO_CalcElAngle(CSPD this, void *pInputVars_str)
{
  pDVars_t pDVars_str = &DCLASS_VARS;  
  #ifndef FULL_MISRA_C_COMPLIANCY
    pDParams_t pDParams_str = DCLASS_PARAMS;
  #endif
  int32_t wAux, wDirection;
  int32_t wIalfa_est_Next,wIbeta_est_Next;
  int32_t wBemf_alfa_est_Next, wBemf_beta_est_Next;
  int16_t hAux, hAux_Alfa, hAux_Beta, hIalfa_err, hIbeta_err, hRotor_Speed, 
                                                                 hValfa, hVbeta;
	static u16 sOldAngle;
   Observer_Inputs_t * pInputs;
   pInputs= (Observer_Inputs_t *)pInputVars_str;
  /**************************反电动势beta**********************/
  #ifdef FULL_MISRA_C_COMPLIANCY
	  hAux_Beta = (int16_t)(pDVars_str->wBemf_beta_est/pDVars_str->hF2);
	#else
	  hAux_Beta = (int16_t)(pDVars_str->wBemf_beta_est>>pDParams_str->hF2LOG);
	#endif
	/************************Ialfa误差获取*************************/
  #ifdef FULL_MISRA_C_COMPLIANCY
    hIalfa_err = (int16_t)(pDVars_str->wIalfa_est/pDVars_str->hF1);
  #else
    hIalfa_err = (int16_t)(pDVars_str->wIalfa_est>>pDParams_str->hF1LOG);
  #endif
  /***************************Ialfaerrest - Ialfa**********************/
  hIalfa_err = hIalfa_err - pInputs->Ialfa_beta.qI_Component1;
  #ifdef FULL_MISRA_C_COMPLIANCY
    hIbeta_err = (int16_t)(pDVars_str->wIbeta_est/pDVars_str->hF1);
  #else
    hIbeta_err = (int16_t)(pDVars_str->wIbeta_est>>pDParams_str->hF1LOG);
  #endif
  /***************************Ibetaerrest - Ibeta**********************/
  hIbeta_err = hIbeta_err - pInputs->Ialfa_beta.qI_Component2;   
  /***************************Vbus*Valfa**********************/
  wAux = (int32_t)(pInputs->Vbus) * pInputs->Valfa_beta.qV_Component1; 
  /***************************Vbus*Vbeta**********************/
  wAux = (int32_t)(pInputs->Vbus) * pInputs->Valfa_beta.qV_Component2; 

	/**********************alfa 轴观测器********************************/
	// hF1LOG 作用
  /*alfa axes observer*/
  wAux = (int32_t) (pDVars_str->hC1)* hAux;     
  wIalfa_est_Next = pDVars_str->wIalfa_est - wAux;   // Ialhaest - hc1*Ialhpaest
  wAux = (int32_t) (pDVars_str->hC2) * hIalfa_err;   // Inest = Ialphaest -hc1*Ialhpaest + hC2*(Ialpaest - Ialpha)
  wIalfa_est_Next += wAux;
  
  wAux = (int32_t) (pDVars_str->hC5) * hValfa;    
  wIalfa_est_Next += wAux;                          //Inest = Ialphaest -hc1*Ialhpaest + hC2*(Ialpaest - Ialpha) + hc5*Valfa
  
  wAux = (int32_t)  (pDVars_str->hC3)* hAux_Alfa;   //Iestbeta(k+1)  - Iestbeta(k)  = -Rs*Iestbeta(k)*T/Ls  - Eestbeta(k)*T/Ls  + T*Ubeta(k)/Ls  + K2*T*(Ibetaest(k)  - Ibeta(k) )  
  wIalfa_est_Next -=wAux;                           //Ialpha_nest_next = Ialphaest -hc1*Ialhpaest + hC2*(Ialpaest - Ialpha) + hc5*Valfa - hc3*Ebemfalphaest         
  
  wAux = (int32_t)(pDVars_str->hC4) *hIalfa_err;
  wBemf_alfa_est_Next = pDVars_str->wBemf_alfa_est + wAux;   //  Ebemfalpha_est_next = Ebemfalphaest + hc4*(Ialpaest - Ialpha)

  //hC6作用
  wAux = wAux * pDVars_str->hC6;
  wAux = CLASS_VARS->hElSpeedDpp * wAux;
  wBemf_alfa_est_Next += wAux;
  
  /**********************beta 轴观测器********************************/	
 /*beta axes observer*/  
	#ifdef FULL_MISRA_C_COMPLIANCY
	  hAux = (int16_t) (pDVars_str->wIbeta_est/pDVars_str->hF1);
	#else
	  hAux = (int16_t) (pDVars_str->wIbeta_est>>pDParams_str->hF1LOG);
	#endif
  /*************************hC1的作用*********************************/
  wAux = (int32_t)  (pDVars_str->hC1)* hAux;
  wIbeta_est_Next = pDVars_str->wIbeta_est - wAux;
  /*************************hC2的作用*********************************/
  wAux = (int32_t) (pDVars_str->hC2) * hIbeta_err;
  wIbeta_est_Next += wAux;
  /*************************hC5的作用*********************************/
  wAux = (int32_t) (pDVars_str->hC5) * hVbeta;
  wIbeta_est_Next += wAux;  
  /*************************hC3的作用*********************************/
  wAux = (int32_t)  (pDVars_str->hC3)* hAux_Beta;
  wIbeta_est_Next -=wAux;
  /*************************hC4的作用*********************************/
  wAux = (int32_t)(pDVars_str->hC4) *hIbeta_err;
  wBemf_beta_est_Next = pDVars_str->wBemf_beta_est + wAux;
  
 	 //hF3POW2的作用
	#ifdef FULL_MISRA_C_COMPLIANCY
	  wAux = (int32_t)hAux_Alfa / pDVars_str->hF3;
	#else
		wAux = (int32_t) hAux_Alfa >> pDVars_str->hF3POW2;
	#endif
	//hC6的作用:  Ebemfalpha(K+1)  =  Ebemfalpha(k) - hc6*Wspeed*Ebeta(k) + hc4*(Ialpaest - Ialpha)
  wAux = wAux * pDVars_str->hC6;
  wAux = CLASS_VARS->hElSpeedDpp * wAux;
  wBemf_beta_est_Next -= wAux;
  /**********************************锁相环*********************************/	
  /*Calls the PLL blockset*/
  pDVars_str->hBemf_alfa_est = hAux_Alfa;
  pDVars_str->hBemf_beta_est = hAux_Beta;
  
  hAux_Alfa = (int16_t)(hAux_Alfa * wDirection);
  hAux_Beta = (int16_t)(hAux_Beta * wDirection);
  /***************************锁相环求取转速********************************/
  //#ifdef PLL_ANGLE	
  hRotor_Speed = STO_ExecutePLL(this, hAux_Alfa, -hAux_Beta);
  STO_Store_Rotor_Speed(this, hRotor_Speed);
  
	/***************************转速积分求取角度********************************/
 	 CLASS_VARS->hElAngle +=hRotor_Speed;
  /*********************更新值的列表***********************************/      
  /*storing previous values of currents and bemfs*/
  pDVars_str->wIalfa_est = wIalfa_est_Next;
  pDVars_str->wBemf_alfa_est = wBemf_alfa_est_Next;
  
  pDVars_str->wIbeta_est = wIbeta_est_Next;
  pDVars_str->wBemf_beta_est = wBemf_beta_est_Next;
  
	/***********************返回电角度**********************************/
  return (CLASS_VARS->hElAngle);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值