我们的代码源自实验11a。 在某些时候、Rs 和 Ls 等开始报告错误。 我担心估算器设置不正确。
RS_Ohm 应为0.342、LSD_h 和 LSQ_H 均应为0.000399....
我可以运行 RsRecalc、然后它们将正确更新。
我还可以使用以下代码手动写入它们、并获得正确的值。
float_t fullScale电 感= USER_IQ_FULL_SCALE_VOLTAGE_V/(USER_IQ_FULL_SCALE_CURRENT_A * USER_VOLTAGE_FILTER_POLE_Rps);
//在中断之外计算此代码,因为它需要浮点运算
int16_t Lshift = ceil (log (USER_MOTOR_LS_d/(0.7*fullScale电 感))/log (2.0));
uint16_t LS_qFmt = 30 - lshift;
float_t L_max =满量程电感* pow (2.0、Lshift);
_iq ls_d_d_pu =_IQ30 (USER_MOTOR_LS_d / L_max);
_IQ Ls_q_pu =_IQ30 (USER_MOTOR_LS_q / L_max);
//在 ISR 内部调用这些函数、以便在同一 ISR 中更新与电感相关的所有变量
EST_setLs_d_pu (estHandle、LS_d_pu);
EST_setLs_q_pu (estHandle、LS_q_pu);
EST_setLs_qFmt (estHandle、LS_qFmt);
//这是你更新转子电阻的方法:
//这些是要写入的值
//计算一次
float_t fullScale电 阻= USER_IQ_FULL_SCALE_VOLTAGE_V/USER_IQ_FULL_SCALE_CURRENT_A;
//在中断之外计算此代码,因为它需要浮点运算
lshift =(int16_t) ceil (log (USER_MOTOR_Rs/(0.7*fullScale电 阻))/log (2.0));
uint16_t Rs_qFmt = 30 - lshift;
float_t Rs_max =满量程电阻* pow (2.0、Lshift);
_iq Rs_pu =_IQ30 (USER_MOTOR_Rs / Rs_max);
//在 ISR 内部调用这些函数,以便在同一 ISR 中更新所有变量
EST_setRs_pu (estHandle、Rs_pu);
EST_setRsOnLine_pu (estHandle、Rs_pu);
EST_setRs_qFmt (estHandle、Rs_qFmt);
EST_setRsOnLine_qFmt (estHandle、Rs_qFmt);
//努力使其保持稳定
EST_setRsOnLineAngleDelta_pu (estHandle、_IQmpy (gRsOnLineFreq_Hz、_IQ (1.0/USER_EST_FREQ_Hz)));
//EST_setRsOnLine_delta_dec (estHandle、_IQ30 (0.00001));
//EST_setRsOnLine_delta_inc_pu (estHandle、_IQ30 (0.00001));
EST_setRsOnLineId_mag_pu (estHandle、_IQmpy (gRsOnLineId_mag_A、_IQ (1.0/USER_IQ_FULL_SCALE_CURRENT_A)));
//EST_setRsOnLineId_mag_pu (estHandle、_IQmpy (gMotorVars.RsOnLineCurrent_A、_IQ (1.0/USER_IQ_FULL_SCALE_CURRENT_A)));
//计算所有滤波器的系数
{
_iq b0 =_IQmpy (gRsOnLinePole_Hz、_IQ (1.0/USER_EST_FREQ_Hz));
_IQ A1 = b0 -_IQ (1.0);
EST_setRsOnLineFilterParams (estHandle、EST_RsOnLineFilterType_Current、b0、A1、_IQ (0.0)、b0、A1、_IQ (0.0));
EST_setRsOnLineFilterParams (estHandle、EST_RsOnLineFilterType_Voltage、b0、A1、_IQ (0.0)、b0、A1、_IQ (0.0));
}
我在这个代码之后直接检查这些值、这些值已经不正确。
ifdef FAST_ROM_V1p6
{
CTRL_Handle ctrlHandle = CTRL_init ((void *) USER_CTRL_Handle_address、0x200);
CTRL_Obj * obj =(CTRL_Obj *) ctrlHandle;
obj->estHandle = estHandle;
//通过控制器初始化估算器
CTRL_setParams (ctrlHandle、&gUserParams);
CTRL_setUserMotorParams (ctrlHandle);
CTRL_setupEstIdleState (ctrlHandle);
}
//获取转子电阻
tmp = EST_getRr_Ohm (句柄);
gMotorVars.rr_Ohm =*((float_t *)&tmp);
//获得定子电阻
tmp = EST_getRs_Ohm (句柄);
gMotorVars.Rs_Ohm =*((float_t *)&tmp);
//获取在线定子电阻
tmp = EST_getRsOnLine_Ohm (句柄);
gMotorVars.RsOnLine_Ohm =*((float_t *)&tmp);
//获得直接坐标方向的定子电感
tmp = EST_getLs_d_h (handle);
gMotorVars.LSD_H =*((float_t *)&tmp);
//获得正交坐标方向的定子电感
tmp = EST_getLs_q_H (句柄);
gMotorVars.LSQ_H =*((float_t *)&tmp);
//以浮点方式获得以 V/Hz 为单位的磁通
tmp = EST_getFlux_VpHz (句柄);
gFlux_VpHz =(_IQ) tmp;
gMotorVars.Flux_VpHz =*((float_t *)&tmp);
我已逐步完成代码、并检查了 gUserParams、所有内容似乎都正常工作。 我无法查看 CTRL_setUserMotorParams (ctrlHandle)或 estHandle、因此我猜测那里出现了问题。 如何知道估算器是否实际具有正确的值?
我不确定这在什么时候停止工作、但在我们开始实施飞行启动功能之前、它工作正常。
