MotorControl.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /**
  2. * @copyright None
  3. * @file MotorControl.c
  4. * @author Comment Vivre
  5. * @date 2024-08-26
  6. * @brief 电机状态机切换
  7. */
  8. #include <MyProject.h>
  9. MotStateType data mcState;
  10. MotStaM McStaSet;
  11. /**
  12. @brief 电机控制状态机
  13. @warning 电机的状态只能在电机状态控制中切换,禁止在其他地方切换电机状态
  14. @date 2022-07-14
  15. */
  16. void MC_Control(void)
  17. {
  18. // 故障下状态调整
  19. if (mcFaultSource != FaultNoSource)
  20. { mcState = mcFault; }
  21. // 关机命令下状态调整
  22. else if ((mcState == mcInit) || (mcState == mcCharge)
  23. || (mcState == mcTailWind) || (mcState == mcPosiCheck)
  24. || (mcState == mcAlign) || (mcState == mcStart))
  25. {
  26. if (isCtrlPowOn == false)
  27. { mcState = mcStop; }
  28. }
  29. // 状态机执行
  30. switch (mcState)
  31. {
  32. case mcReady:
  33. {
  34. Motor_Ready();
  35. if ((mcCurOffset.OffsetFlag == 1) && (isCtrlPowOn))
  36. {
  37. mcState = mcInit;
  38. mcCurOffset.OffsetFlag = 0;
  39. mcCurOffset.OffsetCount = 0; // 偏置电压采集计数
  40. }
  41. break;
  42. }
  43. case mcInit:
  44. {
  45. if (mcCurOffset.OffsetFlag == 1)
  46. {
  47. Motor_Init();
  48. #if (CHARGE_EN == Enable)
  49. {
  50. mcFocCtrl.State_Count = CHARGE_TIME;
  51. mcState = mcCharge; // 跳入mcCharge状态
  52. }
  53. #else
  54. {
  55. #if (TAILWIND_MODE == NoTailWind)
  56. {
  57. #if (ALIGN_MOME != ALIGN_DSIABLE)
  58. {
  59. mcFocCtrl.mcPosCheckAngle = Align_Angle;
  60. mcState = mcAlign;
  61. mcFocCtrl.State_Count = Align_Time;
  62. }
  63. #else
  64. mcState = mcStart;
  65. #endif
  66. }
  67. #else
  68. {
  69. mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
  70. mcState = mcTailWind;
  71. }
  72. #endif
  73. }
  74. #endif
  75. }
  76. break;
  77. }
  78. case mcCharge:
  79. {
  80. Motor_Charge();
  81. #if (IPMTEST == Enable)
  82. {
  83. ;
  84. }
  85. #else
  86. if (mcFocCtrl.State_Count == 0)
  87. {
  88. MOE = 0; // 关闭输出
  89. #if (TAILWIND_MODE == NoTailWind)
  90. {
  91. #if (ALIGN_MOME != ALIGN_DSIABLE)
  92. mcFocCtrl.mcPosCheckAngle = Align_Angle;
  93. mcState = mcAlign;
  94. mcFocCtrl.State_Count = Align_Time;
  95. #else
  96. mcState = mcStart;
  97. #endif
  98. }
  99. #else
  100. mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
  101. mcState = mcTailWind;
  102. #endif
  103. }
  104. #endif
  105. break;
  106. }
  107. #if (TAILWIND_MODE != NoTailWind)
  108. case mcTailWind:
  109. {
  110. Motor_TailWind();
  111. break;
  112. }
  113. #endif
  114. #if (ALIGN_MOME != ALIGN_DSIABLE)
  115. case mcAlign:
  116. {
  117. Motor_Align();
  118. #if (ALIGN_MOME == ALIGN_TEST)
  119. while (1)
  120. ;
  121. #else
  122. if (mcFocCtrl.State_Count == 0)
  123. { mcState = mcStart; }
  124. #endif
  125. break;
  126. }
  127. #endif
  128. case mcStart:
  129. {
  130. if (mcFocCtrl.Start_Mode == TAILWIND_START) // 顺风启动
  131. {
  132. #if (TAILWIND_MODE == BEMFMethod)
  133. mcState = mcRun;
  134. #elif (TAILWIND_MODE == RSDMethod)
  135. mcState = mcRun;
  136. #elif (TAILWIND_MODE == FOCMethod)
  137. {
  138. Motor_FocTailWind_Open();
  139. mcState = mcRun;
  140. }
  141. #endif
  142. }
  143. else if (mcFocCtrl.Start_Mode == HEADWIND_START) // 逆风启动
  144. {
  145. if (mcFocCtrl.State_Count > 0) // 逆风启动刹车过程
  146. {
  147. // 配置刹车代码
  148. MC_Break();
  149. }
  150. else
  151. {
  152. mcFocCtrl.State_Count = 200; // 顺逆风判断时间
  153. mcState = mcReady; // 刹车结束 切回顺逆风检测
  154. }
  155. }
  156. else // 静止启动
  157. {
  158. Motor_Static_Open();
  159. mcState = mcRun;
  160. }
  161. break;
  162. }
  163. case mcRun:
  164. {
  165. if (isCtrlPowOn == false)
  166. {
  167. mcState = mcStop;
  168. mcFocCtrl.State_Count = 5; // 单位:1ms
  169. }
  170. break;
  171. }
  172. case mcStop:
  173. {
  174. MC_Stop();
  175. break;
  176. }
  177. case mcBrake:
  178. {
  179. if (mcFocCtrl.State_Count == 0)
  180. {
  181. fault.Voltage.VoltDetecBraketDuty = 0;
  182. fault.Voltage.FlagBrakeInit = 0;
  183. MOE = 0;
  184. DRV_OUT = 0x00;
  185. ClrBit(DRV_CR, FOCEN);
  186. mcState = mcReady;
  187. mcFocCtrl.State_Count = 10;
  188. }
  189. break;
  190. }
  191. case mcFault:
  192. {
  193. // 欠压保护处理函数
  194. if (mcFaultSource == FaultUnderVoltageDC)
  195. { UnderProcess(); }
  196. else
  197. {
  198. MOE = 0;
  199. ClrBit(DRV_CR, FOCEN); // 关闭FOC
  200. if (mcFaultSource == FaultNoSource)
  201. { mcState = mcReady; }
  202. }
  203. break;
  204. }
  205. default:
  206. {
  207. mcState = mcReady;
  208. break;
  209. }
  210. }
  211. }