FocControl.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include <Myproject.h>
  2. MotStaType mcState;
  3. MotStaM McStaSet;
  4. /**
  5. @function Motor_Control_State
  6. @brief 电机控制状态机 负责状态跳转
  7. @date 2025-11-03
  8. */
  9. void Motor_Control_State(void)
  10. {
  11. // 故障直接跳转Fault
  12. if (mcFaultSource != FaultNoSource)
  13. { mcState = mcFault; }
  14. // 非Ready状态检测到关机信号跳转Stop
  15. else if ((isCtrlPowOn == false) && (mcState != mcReady))
  16. {
  17. // 若当前为Run 配置停机时间再跳转Stop
  18. if (mcState == mcRun)
  19. { mcFocCtrl.State_Count = 30000; }
  20. mcState = mcStop;
  21. }
  22. switch (mcState)
  23. {
  24. case mcReady:
  25. {
  26. if (McStaSet.SetFlag.CalibFlag == 0)
  27. {
  28. McStaSet.SetFlag.CalibFlag = 1;
  29. ClrBit(DRV_CR, FOCEN);
  30. MOE = 0;
  31. SetBit(ADC_MASK, CH1EN | CH0EN);
  32. mcCurOffset.OffsetCount = 0;
  33. mcCurOffset.OffsetFlag = 0;
  34. }
  35. if (mcCurOffset.OffsetFlag && isCtrlPowOn)
  36. {
  37. mcState = mcInit;
  38. ClrBit(DRV_CR, DRVEN);
  39. _nop_(); _nop_(); _nop_(); _nop_();
  40. SetBit(DRV_CR, DRVEN);
  41. }
  42. break;
  43. }
  44. case mcInit:
  45. {
  46. if ((mcFocCtrl.mcDcbusFlt > _Q15(Under_Protect_Voltage / HW_BOARD_VOLT_MAX)))
  47. {
  48. // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
  49. ClrBit(ADC_MASK, CH1EN | CH0EN);
  50. mcFaultSource = 0;
  51. memset(&mcFaultDect, 0, sizeof(FaultVarible));
  52. memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
  53. memset(&mcIimit, 0, sizeof(ILIMIT));
  54. mcFocCtrl.mcDcbus_chazhi = 32760;
  55. McStaSet.SetMode = 0;
  56. memset(&VoltageComp, 0, sizeof(VOLCOMP));
  57. HW_Zero_PI_Init();
  58. HW_One_PI_Init();
  59. #if (FiledWeakenCompEnable)
  60. memset(&mcFieldWeaken, 0, sizeof(FieldWeakeningTypeDef));
  61. #endif
  62. mcState = mcAlign;
  63. mcFocCtrl.State_Count = Align_Time;
  64. }
  65. break;
  66. }
  67. case mcCharge: // 预充电状态,MCU输出固定频率占空比,预充电结束后,跳入mcTailWind
  68. {
  69. Motor_Charge();
  70. if (mcFocCtrl.State_Count == 0)
  71. {
  72. MOE = 0; // 关闭输出
  73. mcState = mcAlign;
  74. mcFocCtrl.State_Count = Align_Time;
  75. }
  76. break;
  77. }
  78. case mcAlign: // 预定位时间结束后,直接启动; AlignTestMode=1用于初始位置检测调试用
  79. {
  80. Motor_Align();
  81. #if (AlignTestMode)
  82. {
  83. while (1);
  84. }
  85. #endif
  86. break;
  87. }
  88. case mcStart: // 配置电机启动参数,进入mcRun状态。
  89. {
  90. Motor_Open();
  91. break;
  92. }
  93. case mcRun: // 运行状态,若运行状态的给定变为0,进入mcStop状态。
  94. {
  95. break;
  96. }
  97. case mcStop:
  98. {
  99. #if (StopBrakeFlag == 0)
  100. {
  101. mcState = mcReady;
  102. FOC_CR1 = 0x00;
  103. ClrBit(DRV_CR, FOCEN); //关闭FOC
  104. MOE = 0;
  105. }
  106. #else
  107. if (motorControl.ActualSpeed < MOTOR_STOP_SPEED)
  108. {
  109. MOE = 0;
  110. FOC_CR1 = 0x00;
  111. ClrBit(DRV_CR, FOCEN);
  112. DRV_DR = DRV_ARR + 1;
  113. DRV_CMR = 0x00;
  114. DRV_CMR |= 0x015; // 三相下桥臂通,刹车
  115. ClrBit(DRV_CR, OCS); // OCS = 0, DRV_COMR;OCS = 1, FOC/SVPWM/SPWM
  116. MOE = 1;
  117. mcState = mcBrake;
  118. mcFocCtrl.State_Count = StopWaitTime;
  119. }
  120. #endif
  121. break;
  122. }
  123. case mcBrake:
  124. {
  125. if (isCtrlPowOn)
  126. {
  127. mcState = mcReady;
  128. mcFocCtrl.State_Count = 0; //单位:1ms 强制关机时间
  129. }
  130. else if (mcFocCtrl.State_Count == 0)
  131. {
  132. mcState = mcReady;
  133. MOE = 0;
  134. ClrBit(DRV_CR, FOCEN);
  135. }
  136. break;
  137. }
  138. case mcFault:
  139. {
  140. if (mcFaultSource == FaultNoSource)
  141. { mcState = mcReady;}
  142. break;
  143. }
  144. default:
  145. {
  146. mcState = mcReady;
  147. break;
  148. }
  149. }
  150. }
  151. /**
  152. @function Tick_Task
  153. @brief 周期任务
  154. @date 2025-11-03
  155. */
  156. void Tick_Task(void)
  157. {
  158. if ((mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
  159. {
  160. mcFocCtrl.BEmf = LPF_Zero_Update(FOC__EMF, mcFocCtrl.BEmf, LPF_K(5.0));
  161. mcFocCtrl.Powerlpf = LPF_Zero_Update(FOC__POW, mcFocCtrl.Powerlpf, LPF_K(1.0));
  162. mcFocCtrl.IDQFlt = LPF_Zero_Update(mcCurVarible.Max_is, mcFocCtrl.IDQFlt, LPF_K(1.0));
  163. mcFocCtrl.UDFlt = LPF_Zero_Update(FOC__UD, mcFocCtrl.UDFlt, LPF_K(30.0)); //LPF_K(30.0)
  164. mcFocCtrl.UQFlt = LPF_Zero_Update(FOC__UQ, mcFocCtrl.UQFlt, LPF_K(30.0)); //LPF_K(30.0)
  165. motorControl.ActualSpeed = LPF_Zero_Update(FOC__EOME, motorControl.ActualSpeed, LPF_K(71.0));
  166. if (mcFocCtrl.Powerlpf <= 0)
  167. {mcFocCtrl.Powerlpf = 0;}
  168. }
  169. else
  170. {
  171. mcFocCtrl.IDQFlt = 0;
  172. mcFocCtrl.BEmf = 0;
  173. mcFocCtrl.Powerlpf = 0;
  174. motorControl.ActualSpeed = 0;
  175. }
  176. #if 0
  177. User_Dri_timer1ms(); //user控制1ms中断
  178. IsLimit_Over_tect(); //限流处理
  179. #if (Debugg==1)
  180. {
  181. PC_MONITOR_1MS(); //工具
  182. CMDMONI_WT_SENDCMD();
  183. }
  184. #endif
  185. #endif
  186. StarRampDealwith();
  187. }