您好!
将此处包含通用电机实验4中的代码段、当我跟踪代码时、如果系统遇到过流等故障、它将跳转至 第34行和第35行、并将 flagRunIdentAndOnLine 设置为 false、 然后,当 RunIdentAndOnLine = false 时 ,flagEnableRunAndIdentify= true 时,它将 调用线路184 flagMotorControl 向右吗?
当检测到故障时,您似乎无法调用 restartMotorControl?
第34和35行
obj->flagRunIdentAndOnLine = false;
obj->motorState = motor_FAULT_stop;
线路184 resetMotorControl (handle);
第61行:RestartMotorControl (Handle);
void runMotor1Control(MOTOR_Handle handle)
{
MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
MOTOR_SetVars_t *objSets = (MOTOR_SetVars_t *)(obj->motorSetsHandle);
USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);
if(HAL_getPwmEnableStatus(obj->halMtrHandle) == true)
{
if(HAL_getMtrTripFaults(obj->halMtrHandle) != 0)
{
obj->faultMtrNow.bit.moduleOverCurrent = 1;
}
}
obj->faultMtrPrev.all |= obj->faultMtrNow.all;
obj->faultMtrUse.all = obj->faultMtrNow.all & obj->faultMtrMask.all;
HAL_setMtrCMPSSDACValue(obj->halMtrHandle, objSets->dacCMPValH, objSets->dacCMPValL);
if(obj->flagClearFaults == true)
{
HAL_clearMtrFaultStatus(obj->halMtrHandle);
obj->faultMtrNow.all &= MTR_FAULT_CLEAR;
obj->flagClearFaults = false;
}
if(obj->flagEnableRunAndIdentify == true)
{
if(obj->faultMtrUse.all != 0)
{
if(obj->flagRunIdentAndOnLine == true)
{
obj->flagRunIdentAndOnLine = false;
obj->motorState = MOTOR_FAULT_STOP;
obj->stopWaitTimeCnt = objSets->restartWaitTimeSet;
obj->restartTimesCnt++;
if(obj->flagEnableRestart == false)
{
obj->flagEnableRunAndIdentify = false;
obj->stopWaitTimeCnt = 0;
}
}
else if(obj->stopWaitTimeCnt == 0)
{
if(obj->restartTimesCnt < objSets->restartTimesSet)
{
obj->flagClearFaults = 1;
}
else
{
obj->flagEnableRunAndIdentify = false;
}
}
}
else if((obj->flagRunIdentAndOnLine == false) && (obj->stopWaitTimeCnt == 0))
{
restartMotorControl(handle);
}
}
else if(obj->flagRunIdentAndOnLine == true)
{
stopMotorControl(handle);
if(obj->flagEnableFlyingStart == false)
{
obj->stopWaitTimeCnt = objSets->stopWaitTimeSet;
}
else
{
obj->stopWaitTimeCnt = 0;
}
}
else
{
}
if((objUser->motor_type == MOTOR_TYPE_INDUCTION) && (obj->flagMotorIdentified == true))
{
EST_setFlag_bypassLockRotor(obj->estHandle, obj->flagBypassLockRotor);
}
if(obj->flagRunIdentAndOnLine == true)
{
if(HAL_getPwmEnableStatus(obj->halMtrHandle) == false)
{
EST_enable(obj->estHandle);
EST_enableTraj(obj->estHandle);
HAL_enablePWM(obj->halMtrHandle);
}
if(obj->flagMotorIdentified == true)
{
if(obj->speedRef_Hz > 0.0f)
{
obj->direction = 1.0f;
}
else
{
obj->direction = -1.0f;
}
EST_setFlag_enableForceAngle(obj->estHandle, obj->flagEnableForceAngle); // default enable
EST_setFlag_enableRsRecalc(obj->estHandle, obj->flagEnableRsRecalc); // default false
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((fabsf(obj->speed_Hz) > obj->speedStart_Hz) || (obj->motorState == MOTOR_CTRL_RUN))
{
TRAJ_setMaxDelta(obj->trajHandle_spd, (obj->accelerationMax_Hzps * objUser->ctrlPeriod_sec));
if(obj->flagEnableLsUpdate == true)
{
objSets->Ls_d_comp_H = objUser->motor_Ls_d_H * (1.0f - obj->Is_A * objSets->Ls_d_Icomp_coef);
objSets->Ls_q_comp_H = objUser->motor_Ls_q_H * (1.0f - obj->Is_A * objSets->Ls_q_Icomp_coef);
if(objSets->Ls_d_comp_H < objSets->Ls_min_H)
{
objSets->Ls_d_comp_H = objSets->Ls_min_H;
}
if(objSets->Ls_q_comp_H < objSets->Ls_min_H)
{
objSets->Ls_q_comp_H = objSets->Ls_min_H;
}
EST_setLs_d_H(obj->estHandle, objSets->Ls_d_comp_H);
EST_setLs_q_H(obj->estHandle, objSets->Ls_q_comp_H);
}
PI_setMinMax(obj->piHandle_spd, -obj->maxCurrent_A, obj->maxCurrent_A);
SVGEN_setMode(obj->svgenHandle, obj->svmMode);
if(obj->motorState == MOTOR_CL_RUNNING)
{
obj->stateRunTimeCnt++;
if(obj->stateRunTimeCnt == obj->fwcTimeDelay)
{
obj->Idq_out_A.value[0] = 0.0f;
obj->motorState = MOTOR_CTRL_RUN;
}
}
}
else
{
TRAJ_setMaxDelta(obj->trajHandle_spd, (obj->accelerationStart_Hzps * objUser->ctrlPeriod_sec));
if(obj->speed_int_Hz >= 0.0f)
{
PI_setMinMax(obj->piHandle_spd, 0.0f, obj->startCurrent_A);
}
else
{
PI_setMinMax(obj->piHandle_spd, -obj->startCurrent_A, 0.0f);
}
}
}
}
else
{
resetMotorControl(handle);
}
if(EST_isTrajError(obj->estHandle) == true)
{
HAL_disablePWM(obj->halMtrHandle); // trajectory generator error, stop PWM
}
else
{
EST_updateTrajState(obj->estHandle);
}
if(EST_isError(obj->estHandle) == true)
{
HAL_disablePWM(obj->halMtrHandle);
}
else
{
bool flagEstStateChanged = false;
float32_t Id_target_A = EST_getIntValue_Id_A(obj->estHandle);
if(obj->flagMotorIdentified == true)
{
flagEstStateChanged = EST_updateState(obj->estHandle, 0.0f);
}
else
{
flagEstStateChanged = EST_updateState(obj->estHandle, Id_target_A);
}
if(flagEstStateChanged == true)
{
EST_configureTraj(obj->estHandle);
if(obj->flagMotorIdentified == false)
{
EST_configureTrajState(obj->estHandle, obj->userParamsHandle, obj->piHandle_spd, obj->piHandle_Id, obj->piHandle_Iq);
}
if(objUser->flag_bypassMotorId == false)
{
if((EST_isLockRotor(obj->estHandle) == true) || ( (EST_isMotorIdentified(obj->estHandle) == true) && (EST_isIdle(obj->estHandle) == true) ) )
{
if(EST_isMotorIdentified(obj->estHandle) == true)
{
obj->flagMotorIdentified = true;
obj->flagRunIdentAndOnLine = false;
obj->flagEnableRunAndIdentify = false;
EST_disable(obj->estHandle);
EST_disableTraj(obj->estHandle);
}
if(objUser->motor_type == MOTOR_TYPE_INDUCTION)
{
obj->flagRunIdentAndOnLine = false;
obj->flagEnableRunAndIdentify = false;
}
}
}
}
}
obj->flagMotorIdentified = EST_isMotorIdentified(obj->estHandle);
if(obj->flagMotorIdentified == true)
{
if(obj->flagSetupController == true)
{
updateControllers(handle);
}
else
{
obj->flagSetupController = true;
setupControllers(handle);
}
}
runRsOnLine(handle);
updateGlobalVariables(handle);
return;
}
Danny