MotorControl.c 7.5 KB

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