FocControl.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. /********************************************************************************
  2. **** Copyright (C), 2018, Fortior Technology Co., Ltd. ****
  3. ********************************************************************************
  4. File Name : FocControl.c
  5. Author : Bruce HW&RD
  6. Date : 2018-12-27
  7. Description : .C file function description
  8. Version : 1.0
  9. Function List :
  10. Record :
  11. 1.Date : 2018-12-27
  12. Author : Bruce HW&RD
  13. Modification: Created file
  14. ********************************************************************************/
  15. #include "FU68xx_5.h"
  16. #include <Myproject.h>
  17. /* Private variables --------------------------------------------------------*/
  18. MotStaType mcState;
  19. MotStaM McStaSet;
  20. PFCStaType PFCState;
  21. uint8 chushihuaflag = 0;
  22. extern uint16 PFCoffsetflag, PFCoffset;
  23. /*---------------------------------------------------------------------------*/
  24. /* Name : void MC_Control(void)
  25. /* Input : NO
  26. /* Output : NO
  27. /* Description: 电机状态机函数,包括初始化、预充电、顺风逆风判断、预定位、启动、运行、故障等
  28. /*---------------------------------------------------------------------------*/
  29. void MC_Control(void)
  30. {
  31. switch (mcState)
  32. {
  33. case mcReady:
  34. if (mcFaultSource != FaultNoSource)
  35. {
  36. mcState = mcFault;
  37. }
  38. else
  39. {
  40. Motor_Ready();
  41. if ((mcCurOffset.OffsetFlag == 1) && (mcSpeedRamp.FlagONOFF == 1) && (mcSpeedRamp.TargetValue != 0))
  42. {
  43. mcState = mcInit;
  44. ClrBit(DRV_CR, DRVEN);
  45. _nop_(); _nop_(); _nop_(); _nop_();
  46. SetBit(DRV_CR, DRVEN);
  47. }
  48. }
  49. break;
  50. case mcInit: // 初始化状态,进入mcCharge状态
  51. if (mcFaultSource != FaultNoSource)
  52. {
  53. mcState = mcFault;
  54. }
  55. else
  56. {
  57. if ((mcFocCtrl.mcDcbusFlt > _Q15(Under_Protect_Voltage / HW_BOARD_VOLT_MAX)))
  58. {
  59. Motor_Init();
  60. // mcState = mcCharge; // 跳入mcCharge状态
  61. // mcFocCtrl.State_Count = Charge_Time; // 预充电状态时间设置
  62. mcState = mcAlign;
  63. mcFocCtrl.State_Count = Align_Time;
  64. }
  65. }
  66. break;
  67. case mcCharge: // 预充电状态,MCU输出固定频率占空比,预充电结束后,跳入mcTailWind
  68. if (mcFaultSource != FaultNoSource)
  69. {
  70. mcState = mcFault;
  71. }
  72. else if (mcSpeedRamp.FlagONOFF == 0 || mcSpeedRamp.TargetValue == 0)
  73. {
  74. mcState = mcStop;
  75. }
  76. else
  77. {
  78. Motor_Charge();
  79. if (mcFocCtrl.State_Count == 0)
  80. {
  81. MOE = 0; // 关闭输出
  82. mcState = mcAlign;
  83. mcFocCtrl.State_Count = Align_Time;
  84. }
  85. }
  86. break;
  87. case mcAlign: // 预定位时间结束后,直接启动; AlignTestMode=1用于初始位置检测调试用
  88. if (mcFaultSource != FaultNoSource)
  89. {
  90. mcState = mcFault;
  91. }
  92. else if (mcSpeedRamp.FlagONOFF == 0 || mcSpeedRamp.TargetValue == 0)
  93. {
  94. mcState = mcStop;
  95. }
  96. else
  97. {
  98. Motor_Align();
  99. #if (AlignTestMode == 1)
  100. {
  101. while (1);
  102. }
  103. #endif
  104. }
  105. break;
  106. case mcStart: // 配置电机启动参数,进入mcRun状态。
  107. if (mcFaultSource != FaultNoSource)
  108. {
  109. mcState = mcFault;
  110. }
  111. else if (mcSpeedRamp.FlagONOFF == 0 || mcSpeedRamp.TargetValue == 0)
  112. {
  113. mcState = mcStop;
  114. }
  115. else
  116. {
  117. Motor_Open();
  118. }
  119. break;
  120. case mcRun: // 运行状态,若运行状态的给定变为0,进入mcStop状态。
  121. if (mcFaultSource != FaultNoSource)
  122. {
  123. mcState = mcFault;
  124. }
  125. else if (mcSpeedRamp.FlagONOFF == 0 || mcSpeedRamp.TargetValue == 0)
  126. {
  127. mcState = mcStop;
  128. mcFocCtrl.State_Count = 30000;
  129. }
  130. else
  131. {}
  132. break;
  133. case mcStop:
  134. if (mcFaultSource != FaultNoSource)
  135. {
  136. mcState = mcFault;
  137. }
  138. else
  139. {
  140. // PFCoffsetflag=0;
  141. // if ((mcFocCtrl.SpeedFlt < _Q15(1800/ MOTOR_SPEED_BASE))||(mcFocCtrl.State_Count == 0))
  142. {
  143. #if (StopBrakeFlag == 0)
  144. {
  145. mcState = mcReady;
  146. FOC_CR1 = 0x00;
  147. ClrBit(DRV_CR, FOCEN); //关闭FOC
  148. MOE = 0;
  149. }
  150. #else
  151. if (mcFocCtrl.SpeedFlt < Motor_Stop_Speed)
  152. {
  153. MOE = 0;
  154. FOC_CR1 = 0x00;
  155. ClrBit(DRV_CR, FOCEN);
  156. DRV_DR = DRV_ARR + 1;
  157. DRV_CMR = 0x00;
  158. DRV_CMR |= 0x015; // 三相下桥臂通,刹车
  159. ClrBit(DRV_CR, OCS); // OCS = 0, DRV_COMR;OCS = 1, FOC/SVPWM/SPWM
  160. MOE = 1;
  161. mcState = mcBrake;
  162. mcFocCtrl.State_Count = StopWaitTime;
  163. }
  164. #endif
  165. }
  166. }
  167. break;
  168. case mcBrake:
  169. if (mcFaultSource != FaultNoSource)
  170. {
  171. mcState = mcFault;
  172. }
  173. else if (mcSpeedRamp.FlagONOFF == true)
  174. {
  175. mcState = mcReady;
  176. mcFocCtrl.State_Count = 0; //单位:1ms 强制关机时间
  177. }
  178. else if (mcFocCtrl.State_Count == 0)
  179. {
  180. mcState = mcReady;
  181. MOE = 0;
  182. ClrBit(DRV_CR, FOCEN);
  183. }
  184. break;
  185. case mcFault:
  186. if (mcFaultSource == FaultNoSource)
  187. {
  188. mcState = mcReady;
  189. }
  190. else
  191. {}
  192. break;
  193. default:
  194. mcState = mcReady;
  195. break;
  196. }
  197. }
  198. #if (PFCEnable==1)
  199. void PFCRUN_Control(void)
  200. {
  201. switch (PFCState)
  202. {
  203. case PFCReady:
  204. if (PFCFaultSource != PFCFaultNoSource)
  205. {
  206. PFCState = PFCFault;
  207. }
  208. else
  209. {
  210. memset(&PFCSet, 0, sizeof(PFCValue));
  211. PFCFaultSource = 0;
  212. chushihuaflag = 0;
  213. PFCState = PFCInt;
  214. }
  215. break;
  216. case PFCInt:
  217. if (PFCFaultSource != PFCFaultNoSource)
  218. {
  219. PFCState = PFCFault;
  220. }
  221. else
  222. {
  223. if (mcSpeedRamp.FlagONOFF == 1)
  224. {
  225. if (chushihuaflag == 0)
  226. {
  227. PFC_init();
  228. PFC_start();
  229. chushihuaflag = 1;
  230. UDC_REF = mcFocCtrl.mcDcbusFlt + _Q15(5.0 / HW_BOARD_VOLT_MAX);
  231. }
  232. if ((PFCSet.OffsetFlag == 1) && (mcFocCtrl.CtrlMode == 1) && (PFCCONTROL.FlagONOFF == 1) && (chushihuaflag == 1))
  233. {
  234. ClrBit(ADC_MASK, CH1EN | CH12EN);
  235. ClrBit(PFC_CR0, PFCEN); // PFC使能
  236. ClrBit(PFC_CR0, PFCOE); //输出使能
  237. SetBit(PFC_CR0, PFCEN); // PFC使能
  238. SetBit(PFC_CR0, PFCOE); //输出使能
  239. UDC_UKMAX = PFC_UOUTMAX; // 外环输出最大值
  240. PFCState = PFCRun;
  241. }
  242. // else
  243. // {
  244. // PFCState = PFCStop;
  245. // }
  246. }
  247. if ((mcSpeedRamp.FlagONOFF == 0))
  248. {
  249. PFCState = PFCStop;
  250. }
  251. }
  252. break;
  253. case PFCRun:
  254. if (PFCFaultSource != PFCFaultNoSource)
  255. {
  256. PFCState = PFCFault;
  257. }
  258. else
  259. {
  260. if (PFCCONTROL.FlagONOFF == 0)
  261. {
  262. PFCState = PFCStop;
  263. }
  264. }
  265. break;
  266. case PFCStop:
  267. if (PFCFaultSource != PFCFaultNoSource)
  268. {
  269. PFCState = PFCFault;
  270. }
  271. else
  272. {
  273. if (IAC_UKMAX > 11)
  274. {
  275. PFCSet.IACOUTMax = IAC_UKMAX;
  276. PFCSet.IACOUTMax -= 10;
  277. IAC_UKMAX = PFCSet.IACOUTMax;
  278. }
  279. if (IAC_UKMAX <= 11 || mcState != mcRun)
  280. {
  281. ClrBit(PFC_CR0, PFCOE); //关闭PFC输出
  282. ClrBit(PFC_CR0, PFCEN); //关闭PFC使能
  283. PFCState = PFCReady;
  284. }
  285. }
  286. break;
  287. case PFCFault:
  288. if (PFCFaultSource == PFCFaultNoSource)
  289. {
  290. PFCState = PFCReady;
  291. }
  292. else
  293. {
  294. }
  295. break;
  296. default:
  297. PFCState = PFCReady;
  298. break;
  299. }
  300. }
  301. #endif