/** * @copyright None * @file MotorControl.c * @author Comment Vivre * @date 2024-08-26 * @brief 电机状态机切换 */ #include MotStateType data mcState; MotStaM McStaSet; /** @brief 电机控制状态机 @warning 电机的状态只能在电机状态控制中切换,禁止在其他地方切换电机状态 @date 2022-07-14 */ void MC_Control(void) { // 故障下状态调整 if (mcFaultSource != FaultNoSource) { mcState = mcFault; } // 关机命令下状态调整 else if ((mcState == mcInit) || (mcState == mcCharge) || (mcState == mcTailWind) || (mcState == mcPosiCheck) || (mcState == mcAlign) || (mcState == mcStart)) { if (isCtrlPowOn == false) { mcState = mcStop; } } // 状态机执行 switch (mcState) { case mcReady: { Motor_Ready(); if ((mcCurOffset.OffsetFlag == 1) && (isCtrlPowOn)) { mcState = mcInit; mcCurOffset.OffsetFlag = 0; mcCurOffset.OffsetCount = 0; // 偏置电压采集计数 KS.ChangeKeyFlg = 1; } break; } case mcInit: { if (mcCurOffset.OffsetFlag == 1) { Motor_Init(); #if (CHARGE_EN == Enable) { mcFocCtrl.State_Count = CHARGE_TIME; mcState = mcCharge; // 跳入mcCharge状态 } #else { #if (TAILWIND_MODE == NoTailWind) { #if (ALIGN_MOME != ALIGN_DSIABLE) { mcFocCtrl.mcPosCheckAngle = Align_Angle; mcState = mcAlign; mcFocCtrl.State_Count = Align_Time; } #else mcState = mcStart; #endif } #else { mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间 mcState = mcTailWind; } #endif } #endif } break; } case mcCharge: { Motor_Charge(); #if (IPMTEST == Enable) { ; } #else if (mcFocCtrl.State_Count == 0) { MOE = 0; // 关闭输出 #if (TAILWIND_MODE == NoTailWind) { #if (ALIGN_MOME != ALIGN_DSIABLE) mcFocCtrl.mcPosCheckAngle = Align_Angle; mcState = mcAlign; mcFocCtrl.State_Count = Align_Time; #else mcState = mcStart; #endif } #else mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间 mcState = mcTailWind; #endif } #endif break; } #if (TAILWIND_MODE != NoTailWind) case mcTailWind: { Motor_TailWind(); break; } #endif #if (ALIGN_MOME != ALIGN_DSIABLE) case mcAlign: { Motor_Align(); #if (ALIGN_MOME == ALIGN_TEST) while (1) ; #else if (mcFocCtrl.State_Count == 0) { mcState = mcStart; User.TPCtrlDealy = 5000; // 延时启动发热 } #endif break; } #endif case mcStart: { if (mcFocCtrl.Start_Mode == TAILWIND_START) // 顺风启动 { #if (TAILWIND_MODE == BEMFMethod) mcState = mcRun; #elif (TAILWIND_MODE == RSDMethod) mcState = mcRun; #elif (TAILWIND_MODE == FOCMethod) { Motor_FocTailWind_Open(); mcState = mcRun; } #endif } else if (mcFocCtrl.Start_Mode == HEADWIND_START) // 逆风启动 { if (mcFocCtrl.State_Count > 0) // 逆风启动刹车过程 { // 配置刹车代码 MC_Break(); } else { mcFocCtrl.State_Count = 200; // 顺逆风判断时间 mcState = mcReady; // 刹车结束 切回顺逆风检测 } } else // 静止启动 { Motor_Static_Open(); mcState = mcRun; } break; } case mcRun: { if (isCtrlPowOn == false) { mcState = mcStop; mcFocCtrl.State_Count = 5; // 单位:1ms } break; } case mcStop: { MC_Stop(); break; } case mcBrake: { if (mcFocCtrl.State_Count == 0) { fault.Voltage.VoltDetecBraketDuty = 0; fault.Voltage.FlagBrakeInit = 0; MOE = 0; DRV_OUT = 0x00; ClrBit(DRV_CR, FOCEN); mcState = mcReady; mcFocCtrl.State_Count = 10; } break; } case mcFault: { // 欠压保护处理函数 if (mcFaultSource == FaultUnderVoltageDC) { UnderProcess(); } else { MOE = 0; ClrBit(DRV_CR, FOCEN); // 关闭FOC if (mcFaultSource == FaultNoSource) { mcState = mcReady; } } break; } default: { mcState = mcReady; break; } } }