FocControl.c 10 KB

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