| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /**
- @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 <MyProject.h>
- /* 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;
- }
- }
|