工具与软件:
嗨团队、
使用 eSMO 算法观察转子角度时发现转子角度不是线性的、而是有几个从-180度到+180度的凸起、这会导致角度观察不准确。 我是否可以知道哪些参数可能会影响此结果?
谢谢、此致、
Jiahui
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
嗨团队、
使用 eSMO 算法观察转子角度时发现转子角度不是线性的、而是有几个从-180度到+180度的凸起、这会导致角度观察不准确。 我是否可以知道哪些参数可能会影响此结果?
谢谢、此致、
Jiahui
尊敬的嘉兴:
过去在该论坛上表示过、选中并启用构建后、eSMO (滑动模式观测器)仅取代<1Hz (开环)的 FAST 估算器低速观测器。 看起来必须同时存在 Fast 和 eSMO 使能符号、并且必须使用快速估算器库调用中内置的低速观测器通过实验室脚本调试监视器进行选择(使用 eSMO 实现快速)以用于 FOC 启动。
要选择滑模观测器电机启动(开环)、请通过实验脚本下拉对话框选择 eSMO 源以覆盖原始低速观测器库调用。 然后、快速估算器计算 FOC 无传感器运行代码的角度(闭环)。 电机启动中最难的部分是确定转子方向(开环)、使其在进入具有电流控制优先级的闭环之前运转良好。
如果未首先添加 eSMO 符号(已启用)、则通用电机控制开环启动将无法正常工作。 看似代码 motor1_drive.c 线性进展会加载两个启动模式参数、两个低速(开环)观测器的函数调用非常相同。
下面、对由 MOTOR1_eSMO 为两个低速观测器设置的轨迹进行编码。
#if defined(MOTOR1_FAST)
//***********************************************************
// enable or disable force angle
EST_setFlag_enableForceAngle(obj->estHandle,
obj->flagEnableForceAngle);
EST_setFlag_enableRsRecalc(obj->estHandle,
obj->flagEnableRsRecalc);
#endif // MOTOR1_FAST
#if defined(MOTOR1_ESMO)
//************************************************************
if(obj->motorState >= MOTOR_CL_RUNNING)
{
TRAJ_setTargetValue(obj->trajHandle_spd, obj->speedRef_Hz);
}
else
{
TRAJ_setTargetValue(obj->trajHandle_spd,
(obj->speedForce_Hz * obj->direction));
}
#if defined(MOTOR1_FAST) && defined(MOTOR1_ESMO) //WAS && (OK<->OK)
// sensorless-FOC
MATH_Vec2 phasor;
ANGLE_GEN_run(obj->angleGenHandle, obj->speed_int_Hz);
obj->angleGen_rad = ANGLE_GEN_getAngle(obj->angleGenHandle);
// run the eSMO
ESMO_setSpeedRef(obj->esmoHandle, obj->speed_int_Hz);
ESMO_run(obj->esmoHandle, obj->adcData.VdcBus_V,
&(obj->pwmData.Vabc_pu), &(obj->estInputData.Iab_A));
obj->angleComp_rad = obj->speedPLL_Hz * obj->angleDelayed_sf;
obj->anglePLL_rad = MATH_incrAngle(ESMO_getAnglePLL(obj->esmoHandle), obj->angleComp_rad);
SPDFR_run(obj->spdfrHandle, obj->anglePLL_rad);
obj->speedPLL_Hz = SPDFR_getSpeedHz(obj->spdfrHandle);
obj->speedFilter_Hz = obj->speedFilter_Hz *0.875f + obj->speed_Hz * 0.125f;
obj->speedAbs_Hz = fabsf(obj->speedFilter_Hz);
// Running state
if(obj->estimatorMode == ESTIMATOR_MODE_FAST)
{
obj->speed_Hz = obj->speedEST_Hz;
if(obj->motorState >= MOTOR_CTRL_RUN)
{
obj->angleFOC_rad = obj->angleEST_rad;
ESMO_updateKslide(obj->esmoHandle);
}
else if(obj->motorState == MOTOR_CL_RUNNING)
{
obj->angleFOC_rad = obj->angleEST_rad;
ESMO_setAnglePu(obj->esmoHandle, obj->angleFOC_rad);
}
else if(obj->motorState == MOTOR_OL_START)
{
obj->angleFOC_rad = obj->angleEST_rad;
obj->motorState = MOTOR_CL_RUNNING;
ESMO_setAnglePu(obj->esmoHandle, obj->angleFOC_rad);
}
else if(obj->motorState == MOTOR_ALIGNMENT)
{
obj->angleFOC_rad = 0.0f;
obj->enableSpeedCtrl = false;
obj->stateRunTimeCnt++;
obj->IsRef_A = 0.0f;
obj->Idq_out_A.value[0] = obj->alignCurrent_A;
obj->Idq_out_A.value[1] = 0.0f;
TRAJ_setIntValue(obj->trajHandle_spd, 0.0f);
EST_setAngle_rad(obj->estHandle, obj->angleFOC_rad);
ESMO_setAnglePu(obj->esmoHandle, obj->angleFOC_rad);
if((obj->stateRunTimeCnt > obj->alignTimeDelay) ||
(obj->flagEnableAlignment == false))
{
obj->stateRunTimeCnt = 0;
obj->motorState = MOTOR_OL_START;
obj->Idq_out_A.value[0] = obj->fluxCurrent_A;
PI_setUi(obj->piHandle_spd, 0.0);
}
}
else if(obj->motorState == MOTOR_SEEK_POS)
{