| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #include <MyProject.h>
- 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; }
-
- break;
-
- case mcInit:
- if (mcFaultSource != FaultNoSource)
- {
- mcState = mcFault;
- }
- else if (isCtrlPowOn == false)
- {
- mcState = mcStop;
- }
- else
- {
- Motor_Init();
- #if (CHARGE_EN == Enable)
- mcFocCtrl.State_Count = CHARGE_TIME;
- mcState = mcCharge;
- #else
- #if (ALIGN_MOME != ALIGN_DSIABLE)
- mcFocCtrl.mcPosCheckAngle = Align_Angle1;
- mcState = mcAlign;
- mcFocCtrl.State_Count = AlignAll_Time;
- #else
- mcState = mcStart;
- #endif
- #endif
- }
-
- break;
-
- case mcCharge:
- if (mcFaultSource != FaultNoSource)
- {
- mcState = mcFault;
- }
- else if (isCtrlPowOn == false)
- {
- mcState = mcStop;
- }
- else
- {
- Motor_Charge();
-
- if (mcFocCtrl.State_Count == 0)
- {
- MOE = 0;
- #if (PosCheckEnable == Enable)
- mcState = mcPosiCheck;
- McStaSet.SetFlag.PosiCheckSetFlag = 0;
- mcFocCtrl.mcPosCheckAngle = 0xffff; // 角度赋初值
- #elif (ALIGN_MOME != ALIGN_DSIABLE)
- mcFocCtrl.mcPosCheckAngle = Align_Angle1;
- mcState = mcAlign;
- mcFocCtrl.State_Count = AlignAll_Time;
- #else
- mcState = mcStart;
- #endif
- }
- }
-
- break;
- #if (ALIGN_MOME != ALIGN_DSIABLE)
-
- case mcAlign:
- if (mcFaultSource != FaultNoSource)
- {
- mcState = mcFault;
- }
- else if (isCtrlPowOn == false)
- {
- mcState = mcStop;
- }
- else
- {
- Motor_Align();
- #if (ALIGN_MOME == ALIGN_TEST)
-
- while (1);
-
- #else
-
- if (mcFocCtrl.State_Count > (Align_Time1 + Align_Time2 + Align_Time3) )
- {
- mcFocCtrl.CurrentAlignStatus = 0;
- FOC__THETA = Align_Angle1;
- FOC_IQREF = IQ_Align_CURRENT * ((float)(AlignAll_Time - mcFocCtrl.State_Count) / AlignRamp_Time);
- }
- else if (mcFocCtrl.State_Count > (Align_Time2 + Align_Time3))
- {
- mcFocCtrl.CurrentAlignStatus = 1;
- FOC__THETA = Align_Angle2;
- FOC_IQREF = IQ_Align_CURRENT;
- }
- else if (mcFocCtrl.State_Count > (Align_Time3))
- {
- mcFocCtrl.CurrentAlignStatus = 2;
- mcFocCtrl.AngleProcess = Angle_AngleK * (Align_Time2 + Align_Time3 - mcFocCtrl.State_Count);
- mcFocCtrl.AngleStart = Align_Angle2 + mcFocCtrl.AngleProcess;
- FOC__THETA = mcFocCtrl.AngleStart;
- }
- else
- {
- mcFocCtrl.CurrentAlignStatus = 2;
- mcState = mcStart;
- }
-
- #endif
- }
-
- break;
- #endif
-
- case mcStart:
- Motor_Static_Open();
- mcState = mcRun;
- break;
-
- case mcRun:
- if (mcFaultSource != FaultNoSource)
- {
- mcState = mcFault;
- }
- else if (isCtrlPowOn == false)
- {
- mcState = mcStop;
- mcFocCtrl.State_Count = 3000;
- }
-
- break;
-
- case mcStop:
- if (mcFaultSource != FaultNoSource)
- {
- mcState = mcFault;
- }
- else
- {
- if ((mcFocCtrl.SpeedFlt < MOTOR_SPEED_STOP_RPM) && (mcFocCtrl.State_Count == 0))
- {
- mcState = mcReady;
- ClrBit(DRV_CR, FOCEN);
- ClrBit(DRV_CR, DRVEN);
- MOE = 0;
- }
- }
-
- break;
-
- case mcFault:
- if (mcFaultSource == FaultNoSource)
- {
- mcState = mcReady;
- }
- else
- {
- DRV_CMR &= 0xFFC0;
- ClrBit(DRV_CR, FOCEN);
- MOE = 0;
- }
-
- break;
- }
- }
|