对这个原理不懂的小伙伴们,可以去看B站DR_can的视频。后续有空我再将这里细化讲解一下
简而言之:目标就是设计一组K值使得模型估算的Xhat 和 实际的X相等。 Xhat - X收敛于0,即知道了实际的X的值,这就是观测器的基本原理.
提问题:
为什么要用隆博戈观测器?
通过隆博戈观测器,主要是为了电机得到alpha,beta轴的反电动势
为什么要得到alpha,beta轴的反电动势?
因为反电动势中蕴含了电机定子电角度信息,如下面:
要弄明白的是模型的输入与输出分别是什么?
模型输入: Ialpha、Ibeta、Ualpha、Ubeta、We
模型输出:Ealpha、Ebeta
建立5个输入口,2个输出口
建立类似于下面的图:
需要更加使用matlab的S-function实现的高阶的离散化实现或者上述整个连续模型的实现,请留下评论联系 要收费哦!
static int16_t STO_CalcElAngle(CSPD this, void *pInputVars_str)
{pDVars_t pDVars_str = &DCLASS_VARS; #ifndef FULL_MISRA_C_COMPLIANCYpDParams_t pDParams_str = DCLASS_PARAMS;#endifint32_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_COMPLIANCYhAux_Beta = (int16_t)(pDVars_str->wBemf_beta_est/pDVars_str->hF2);#elsehAux_Beta = (int16_t)(pDVars_str->wBemf_beta_est>>pDParams_str->hF2LOG);#endif/************************Ialfa误差获取*************************/#ifdef FULL_MISRA_C_COMPLIANCYhIalfa_err = (int16_t)(pDVars_str->wIalfa_est/pDVars_str->hF1);#elsehIalfa_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_COMPLIANCYhIbeta_err = (int16_t)(pDVars_str->wIbeta_est/pDVars_str->hF1);#elsehIbeta_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*IalhpaestwAux = (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*ValfawAux = (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_COMPLIANCYhAux = (int16_t) (pDVars_str->wIbeta_est/pDVars_str->hF1);#elsehAux = (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_COMPLIANCYwAux = (int32_t)hAux_Alfa / pDVars_str->hF3;#elsewAux = (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);
}