MotorControl.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. KS.ChangeKeyFlg = 1;
  41. }
  42. break;
  43. }
  44. case mcInit:
  45. {
  46. if (mcCurOffset.OffsetFlag == 1)
  47. {
  48. Motor_Init();
  49. #if (CHARGE_EN == Enable)
  50. {
  51. mcFocCtrl.State_Count = CHARGE_TIME;
  52. mcState = mcCharge; // 跳入mcCharge状态
  53. }
  54. #else
  55. {
  56. #if (TAILWIND_MODE == NoTailWind)
  57. {
  58. #if (ALIGN_MOME != ALIGN_DSIABLE)
  59. {
  60. mcFocCtrl.mcPosCheckAngle = Align_Angle;
  61. mcState = mcAlign;
  62. mcFocCtrl.State_Count = Align_Time;
  63. }
  64. #else
  65. mcState = mcStart;
  66. #endif
  67. }
  68. #else
  69. {
  70. mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
  71. mcState = mcTailWind;
  72. }
  73. #endif
  74. }
  75. #endif
  76. }
  77. break;
  78. }
  79. case mcCharge:
  80. {
  81. Motor_Charge();
  82. #if (IPMTEST == Enable)
  83. {
  84. ;
  85. }
  86. #else
  87. if (mcFocCtrl.State_Count == 0)
  88. {
  89. MOE = 0; // 关闭输出
  90. #if (TAILWIND_MODE == NoTailWind)
  91. {
  92. #if (ALIGN_MOME != ALIGN_DSIABLE)
  93. mcFocCtrl.mcPosCheckAngle = Align_Angle;
  94. mcState = mcAlign;
  95. mcFocCtrl.State_Count = Align_Time;
  96. #else
  97. mcState = mcStart;
  98. #endif
  99. }
  100. #else
  101. mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
  102. mcState = mcTailWind;
  103. #endif
  104. }
  105. #endif
  106. break;
  107. }
  108. #if (TAILWIND_MODE != NoTailWind)
  109. case mcTailWind:
  110. {
  111. Motor_TailWind();
  112. break;
  113. }
  114. #endif
  115. #if (ALIGN_MOME != ALIGN_DSIABLE)
  116. case mcAlign:
  117. {
  118. Motor_Align();
  119. #if (ALIGN_MOME == ALIGN_TEST)
  120. while (1)
  121. ;
  122. #else
  123. if (mcFocCtrl.State_Count == 0)
  124. {
  125. mcState = mcStart;
  126. User.TPCtrlDealy = 5000; // 延时启动发热
  127. }
  128. #endif
  129. break;
  130. }
  131. #endif
  132. case mcStart:
  133. {
  134. if (mcFocCtrl.Start_Mode == TAILWIND_START) // 顺风启动
  135. {
  136. #if (TAILWIND_MODE == BEMFMethod)
  137. mcState = mcRun;
  138. #elif (TAILWIND_MODE == RSDMethod)
  139. mcState = mcRun;
  140. #elif (TAILWIND_MODE == FOCMethod)
  141. {
  142. Motor_FocTailWind_Open();
  143. mcState = mcRun;
  144. }
  145. #endif
  146. }
  147. else if (mcFocCtrl.Start_Mode == HEADWIND_START) // 逆风启动
  148. {
  149. if (mcFocCtrl.State_Count > 0) // 逆风启动刹车过程
  150. {
  151. // 配置刹车代码
  152. MC_Break();
  153. }
  154. else
  155. {
  156. mcFocCtrl.State_Count = 200; // 顺逆风判断时间
  157. mcState = mcReady; // 刹车结束 切回顺逆风检测
  158. }
  159. }
  160. else // 静止启动
  161. {
  162. Motor_Static_Open();
  163. mcState = mcRun;
  164. }
  165. break;
  166. }
  167. case mcRun:
  168. {
  169. if (isCtrlPowOn == false)
  170. {
  171. mcState = mcStop;
  172. mcFocCtrl.State_Count = 5; // 单位:1ms
  173. }
  174. break;
  175. }
  176. case mcStop:
  177. {
  178. MC_Stop();
  179. break;
  180. }
  181. case mcBrake:
  182. {
  183. if (mcFocCtrl.State_Count == 0)
  184. {
  185. fault.Voltage.VoltDetecBraketDuty = 0;
  186. fault.Voltage.FlagBrakeInit = 0;
  187. MOE = 0;
  188. DRV_OUT = 0x00;
  189. ClrBit(DRV_CR, FOCEN);
  190. mcState = mcReady;
  191. mcFocCtrl.State_Count = 10;
  192. }
  193. break;
  194. }
  195. case mcFault:
  196. {
  197. // 欠压保护处理函数
  198. if (mcFaultSource == FaultUnderVoltageDC)
  199. { UnderProcess(); }
  200. else
  201. {
  202. MOE = 0;
  203. ClrBit(DRV_CR, FOCEN); // 关闭FOC
  204. if (mcFaultSource == FaultNoSource)
  205. { mcState = mcReady; }
  206. }
  207. break;
  208. }
  209. default:
  210. {
  211. mcState = mcReady;
  212. break;
  213. }
  214. }
  215. }