1
0

MotorControl.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include <MyProject.h>
  2. MotStateType data mcState;
  3. MotStaM McStaSet;
  4. /**
  5. @brief 电机控制状态机
  6. @warning 电机的状态只能在电机状态控制中切换,禁止在其他地方切换电机状态
  7. @date 2022-07-14
  8. */
  9. void MC_Control(void)
  10. {
  11. switch (mcState)
  12. {
  13. case mcReady:
  14. Motor_Ready();
  15. if (mcFaultSource != FaultNoSource)
  16. {
  17. mcState = mcFault;
  18. }
  19. else if ((mcCurOffset.OffsetFlag == 1) && isCtrlPowOn)
  20. { mcState = mcInit; }
  21. break;
  22. case mcInit:
  23. if (mcFaultSource != FaultNoSource)
  24. {
  25. mcState = mcFault;
  26. }
  27. else if (isCtrlPowOn == false)
  28. {
  29. mcState = mcStop;
  30. }
  31. else
  32. {
  33. Motor_Init();
  34. #if (CHARGE_EN == Enable)
  35. mcFocCtrl.State_Count = CHARGE_TIME;
  36. mcState = mcCharge;
  37. #else
  38. #if (ALIGN_MOME != ALIGN_DSIABLE)
  39. mcFocCtrl.mcPosCheckAngle = Align_Angle1;
  40. mcState = mcAlign;
  41. mcFocCtrl.State_Count = AlignAll_Time;
  42. #else
  43. mcState = mcStart;
  44. #endif
  45. #endif
  46. }
  47. break;
  48. case mcCharge:
  49. if (mcFaultSource != FaultNoSource)
  50. {
  51. mcState = mcFault;
  52. }
  53. else if (isCtrlPowOn == false)
  54. {
  55. mcState = mcStop;
  56. }
  57. else
  58. {
  59. Motor_Charge();
  60. if (mcFocCtrl.State_Count == 0)
  61. {
  62. MOE = 0;
  63. #if (PosCheckEnable == Enable)
  64. mcState = mcPosiCheck;
  65. McStaSet.SetFlag.PosiCheckSetFlag = 0;
  66. mcFocCtrl.mcPosCheckAngle = 0xffff; // 角度赋初值
  67. #elif (ALIGN_MOME != ALIGN_DSIABLE)
  68. mcFocCtrl.mcPosCheckAngle = Align_Angle1;
  69. mcState = mcAlign;
  70. mcFocCtrl.State_Count = AlignAll_Time;
  71. #else
  72. mcState = mcStart;
  73. #endif
  74. }
  75. }
  76. break;
  77. #if (ALIGN_MOME != ALIGN_DSIABLE)
  78. case mcAlign:
  79. if (mcFaultSource != FaultNoSource)
  80. {
  81. mcState = mcFault;
  82. }
  83. else if (isCtrlPowOn == false)
  84. {
  85. mcState = mcStop;
  86. }
  87. else
  88. {
  89. Motor_Align();
  90. #if (ALIGN_MOME == ALIGN_TEST)
  91. while (1);
  92. #else
  93. if (mcFocCtrl.State_Count > (Align_Time1 + Align_Time2 + Align_Time3) )
  94. {
  95. mcFocCtrl.CurrentAlignStatus = 0;
  96. FOC__THETA = Align_Angle1;
  97. FOC_IQREF = IQ_Align_CURRENT * ((float)(AlignAll_Time - mcFocCtrl.State_Count) / AlignRamp_Time);
  98. }
  99. else if (mcFocCtrl.State_Count > (Align_Time2 + Align_Time3))
  100. {
  101. mcFocCtrl.CurrentAlignStatus = 1;
  102. FOC__THETA = Align_Angle2;
  103. FOC_IQREF = IQ_Align_CURRENT;
  104. }
  105. else if (mcFocCtrl.State_Count > (Align_Time3))
  106. {
  107. mcFocCtrl.CurrentAlignStatus = 2;
  108. mcFocCtrl.AngleProcess = Angle_AngleK * (Align_Time2 + Align_Time3 - mcFocCtrl.State_Count);
  109. mcFocCtrl.AngleStart = Align_Angle2 + mcFocCtrl.AngleProcess;
  110. FOC__THETA = mcFocCtrl.AngleStart;
  111. }
  112. else
  113. {
  114. mcFocCtrl.CurrentAlignStatus = 2;
  115. mcState = mcStart;
  116. }
  117. #endif
  118. }
  119. break;
  120. #endif
  121. case mcStart:
  122. Motor_Static_Open();
  123. mcState = mcRun;
  124. break;
  125. case mcRun:
  126. if (mcFaultSource != FaultNoSource)
  127. {
  128. mcState = mcFault;
  129. }
  130. else if (isCtrlPowOn == false)
  131. {
  132. mcState = mcStop;
  133. mcFocCtrl.State_Count = 3000;
  134. }
  135. break;
  136. case mcStop:
  137. if (mcFaultSource != FaultNoSource)
  138. {
  139. mcState = mcFault;
  140. }
  141. else
  142. {
  143. if ((mcFocCtrl.SpeedFlt < MOTOR_SPEED_STOP_RPM) && (mcFocCtrl.State_Count == 0))
  144. {
  145. mcState = mcReady;
  146. ClrBit(DRV_CR, FOCEN);
  147. ClrBit(DRV_CR, DRVEN);
  148. MOE = 0;
  149. }
  150. }
  151. break;
  152. case mcFault:
  153. if (mcFaultSource == FaultNoSource)
  154. {
  155. mcState = mcReady;
  156. }
  157. else
  158. {
  159. DRV_CMR &= 0xFFC0;
  160. ClrBit(DRV_CR, FOCEN);
  161. MOE = 0;
  162. }
  163. break;
  164. }
  165. }