您好!
将此处包含通用电机实验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