一、观测器原理
对这个原理不懂的小伙伴们,可以去看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);
}