/** @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen @file MotorControl.c @author Fortiortech Appliction Team @since Create:2021-04-10 @date Last modify:2022-07-14 @note Last modify author is Marcel @brief */ #include /* Private variables ----------------------------------------------------------------------------*/ MotStateType data mcState; MotStaM McStaSet; /** @brief 电机控制状态机 @warning 电机的状态只能在电机状态控制中切换,禁止在其他地方切换电机状态 @date 2022-07-14 */ void MC_Control(void) { switch (mcState) { case mcReady: Motor_Ready(); if (mcFaultSource != FaultNoSource) { mcState = mcFault; } else if ((mcCurOffset.OffsetFlag == 1) && (isCtrlPowOn)) { mcState = mcInit; mcCurOffset.OffsetFlag = 0; mcCurOffset.OffsetCount = 0; // 偏置电压采集计数 KS.ChangeKeyFlg = 1; } else { } break; case mcInit: if (mcFaultSource != FaultNoSource) { mcState = mcFault; } else if (!isCtrlPowOn) { mcState = mcStop; } else 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: if (mcFaultSource != FaultNoSource) { mcState = mcFault; } else if (!isCtrlPowOn) { mcState = mcStop; } else { 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: if (mcFaultSource != FaultNoSource) { mcState = mcFault; } else if (!isCtrlPowOn) { mcState = mcStop; } else { Motor_TailWind(); } break; #endif #if (ALIGN_MOME != ALIGN_DSIABLE) case mcAlign: if (mcFaultSource != FaultNoSource) { mcState = mcFault; } else if (!isCtrlPowOn) { mcState = mcStop; } else { 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 (mcFaultSource != FaultNoSource) { mcState = mcFault; } else if (!isCtrlPowOn) { mcState = mcStop; mcFocCtrl.State_Count = 5; // 单位:1ms } else { } break; case mcStop: if (mcFaultSource != FaultNoSource) { mcState = mcFault; } else { MC_Stop(); } break; case mcBrake: if (mcFaultSource != FaultNoSource) { mcState = mcFault; } 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(); // 欠压保护处理函数 // Save_KeyValue(); // 保存按键值 } else { MOE = 0; ClrBit(DRV_CR, FOCEN); // 关闭FOC if (mcFaultSource == FaultNoSource) { mcState = mcReady; } } break; default: mcState = mcReady; break; } }