MotorProtect.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #include <Myproject.h>
  2. /**
  3. @function Bus_Voltage_Check
  4. @brief 母线电压检测
  5. @date 2025-11-17
  6. */
  7. void Bus_Voltage_Check(void)
  8. {
  9. static uint16_t DelayCnt = 0;
  10. if (DelayCnt < 500)
  11. {
  12. DelayCnt++;
  13. return;
  14. }
  15. // 过压检测
  16. FAULT_COUNT_UPDOWN(faultCheck.CheckCnt.OverVolt,
  17. (faultCheck.BusVoltage > OVER_VOLTAGE_PROTECT), 300, VDC_OVER);
  18. // 欠压检测
  19. FAULT_COUNT_UPDOWN(faultCheck.CheckCnt.UnderVolt,
  20. (faultCheck.BusVoltage < UNDER_VOLTAGE_PROTECT), 300, VDC_UNDER);
  21. }
  22. /**
  23. @function MOS_Temper_Check
  24. @brief 温度检测
  25. @date 2025-11-17
  26. */
  27. void MOS_Temper_Check(void)
  28. {
  29. FAULT_COUNT_UPDOWN(faultCheck.CheckCnt.OverTemper,
  30. (faultCheck.NTCTemper <= TEMP_PROT_VALUE), TEMP_DECTTIME, TEMPER_NTC);
  31. }
  32. /**
  33. @function Bus_Curr_Check
  34. @brief 母线电流检测
  35. @date 2025-11-17
  36. */
  37. void Bus_Curr_Check(void)
  38. {
  39. FAULT_COUNT_UPDOWN(faultCheck.CheckCnt.OverCurr,
  40. (faultCheck.BusCurr >= BUS_CURR_PROT_VALUE), BUS_CURR_DECTTIME, SOFT_OVER_CURR);
  41. }
  42. /**
  43. @function Motor_Stall_Check
  44. @brief 电机堵转检测
  45. @date 2025-11-17
  46. */
  47. void Motor_Stall_Check(void)
  48. {
  49. if (faultCheck.CheckCnt.DelayStall < 500)
  50. { faultCheck.CheckCnt.DelayStall ++;}
  51. else
  52. {
  53. // 1.持续3秒反电动势过小
  54. if (faultCheck.BackEMF < ES_THRESHOLD_LOW)
  55. {
  56. faultCheck.CheckCnt.EsValue++;
  57. if (faultCheck.CheckCnt.EsValue > 3000)
  58. { FaultSource = MOTOR_STALL; }
  59. }
  60. // 2.超过对应转速时 反电动势过低
  61. else if ((faultCheck.BackEMF < ES_THRESHOLD_HIGH) && (faultCheck.ActualSpeed > ES_THRESHOLD_SPEED))
  62. {
  63. faultCheck.CheckCnt.EsValue++;
  64. if (faultCheck.CheckCnt.EsValue > 3000)
  65. { FaultSource = MOTOR_STALL; }
  66. }
  67. else if (faultCheck.CheckCnt.EsValue)
  68. {faultCheck.CheckCnt.EsValue--;}
  69. // 3.速度超出极限转速
  70. if (faultCheck.ActualSpeed < STALL_SPEED_MIN || faultCheck.ActualSpeed > STALL_SPEED_MAX)
  71. {
  72. faultCheck.CheckCnt.StallSpeed++;
  73. if (faultCheck.CheckCnt.StallSpeed > 3000)
  74. { FaultSource = MOTOR_STALL; }
  75. }
  76. else if (faultCheck.CheckCnt.StallSpeed)
  77. {faultCheck.CheckCnt.StallSpeed -- ;}
  78. }
  79. // 4.长时间未进闭环
  80. FAULT_COUNT_UPDOWN(faultCheck.CheckCnt.CloseLoop,
  81. (loopCtrl.State == OPEN_MODE), 1000, MOTOR_STALL);
  82. }
  83. /**
  84. @function Phase_Curr_Check
  85. @brief 缺相检测
  86. @date 2024-06-17
  87. */
  88. void Phase_Curr_Check(void)
  89. {
  90. // 运行后等待计数
  91. if (faultCheck.CheckCnt.DelayPhase < 500)
  92. {
  93. faultCheck.CheckCnt.DelayPhase++;
  94. return;
  95. }
  96. // 检测
  97. if (faultCheck.CheckCnt.LossPhase < LOSS_PHASE_CYCLE)
  98. {
  99. faultCheck.MaxIa = FOC__IAMAX;
  100. faultCheck.MaxIb = FOC__IBMAX;
  101. faultCheck.MaxIc = FOC__ICMAX;
  102. faultCheck.CheckCnt.LossPhase++;
  103. return;
  104. }
  105. faultCheck.CheckCnt.LossPhase = 0;
  106. // 各相独立更新缺相计数,逻辑与原代码完全一致
  107. UPDATE_PHASE_LOSS_CNT(faultCheck.MaxIa,
  108. faultCheck.MaxIb, faultCheck.MaxIc, faultCheck.CheckCnt.PhaseA);
  109. UPDATE_PHASE_LOSS_CNT(faultCheck.MaxIb,
  110. faultCheck.MaxIa, faultCheck.MaxIc, faultCheck.CheckCnt.PhaseB);
  111. UPDATE_PHASE_LOSS_CNT(faultCheck.MaxIc,
  112. faultCheck.MaxIa, faultCheck.MaxIb, faultCheck.CheckCnt.PhaseC);
  113. // 清零变量
  114. faultCheck.MaxIa = 0;
  115. faultCheck.MaxIa = 0;
  116. faultCheck.MaxIa = 0;
  117. SetBit(FOC_CR2, ICLR);
  118. if ((faultCheck.CheckCnt.PhaseA > 10) ||
  119. (faultCheck.CheckCnt.PhaseB > 10) ||
  120. (faultCheck.CheckCnt.PhaseC > 10))
  121. { FaultSource = FCT_LOSS_PHASE; }
  122. }
  123. /**
  124. @function Run_Power_Check
  125. @brief 运行功率检测
  126. @date 2024-06-17
  127. */
  128. static void Run_Power_Check(void)
  129. {
  130. FAULT_COUNT_UPDOWN(faultCheck.CheckCnt.OverPower,
  131. (faultCheck.Power > OVER_POWER_VAL), OP_DECTTIME, OVER_POWER);
  132. }
  133. /**
  134. @function Recovery_Fault_Handle
  135. @brief 故障恢复
  136. @date 2025-11-19
  137. */
  138. static void Recovery_Fault_Handle(void)
  139. {
  140. switch (FaultSource)
  141. {
  142. default:
  143. break;
  144. // 无故障 直接返回
  145. case SYS_NO_FAULT:
  146. return;
  147. // 欠压恢复
  148. case VDC_UNDER:
  149. if (faultCheck.BusVoltage > UNDER_VOLTAGE_RECOVER)
  150. { RECOVER_DELAY(faultCheck.RecoverCnt.UnderVolt); }
  151. break;
  152. // 过压恢复
  153. case VDC_OVER:
  154. if (faultCheck.BusVoltage < OVER_VOLTAGE_RECOVER)
  155. { RECOVER_DELAY(faultCheck.RecoverCnt.OverVolt); }
  156. break;
  157. // 过温恢复
  158. case TEMPER_NTC:
  159. if (faultCheck.NTCTemper >= TEMP_RECOVER_VALUE)
  160. { RECOVER_DELAY(faultCheck.RecoverCnt.OverTemper); }
  161. break;
  162. // 缺相恢复
  163. case FCT_LOSS_PHASE:
  164. RECOVER_DELAY(faultCheck.RecoverCnt.PhaseLoss);
  165. break;
  166. // 堵转恢复
  167. case MOTOR_STALL:
  168. RECOVER_DELAY(faultCheck.RecoverCnt.Stall);
  169. break;
  170. // 过流恢复
  171. case HARD_OVER_CURR:
  172. case SOFT_OVER_CURR:
  173. RECOVER_DELAY(faultCheck.RecoverCnt.OverCurr);
  174. break;
  175. // 过功率恢复
  176. case OVER_POWER:
  177. RECOVER_DELAY(faultCheck.RecoverCnt.OverPower);
  178. break;
  179. // PWM丢失
  180. case LOSS_PWM:
  181. RECOVER_DELAY(faultCheck.RecoverCnt.PWMLoss);
  182. break;
  183. // 串口丢失
  184. case LOSS_UART:
  185. RECOVER_DELAY(faultCheck.RecoverCnt.UartLoss);
  186. break;
  187. }
  188. }
  189. /**
  190. @function Motor_Fault_Handle
  191. @brief 故障检测与恢复
  192. @date 2024-06-17
  193. */
  194. void Motor_Fault_Handle(void)
  195. {
  196. if ((sysState == MOTOR_RUN) || (sysState == MOTOR_STOP))
  197. {
  198. // 母线电流检测
  199. #if (PRT_SW_OVER_CURR_EN)
  200. Bus_Curr_Check();
  201. #endif
  202. // 相线电流检测
  203. #if (PRT_PHASE_LOSS_EN)
  204. Phase_Curr_Check();
  205. #endif
  206. // 电机运行状态检测
  207. #if (PRT_MOTOR_STALL_EN)
  208. Motor_Stall_Check();
  209. #endif
  210. // 功率检测
  211. #if (PRT_OVER_POWER_EN)
  212. Run_Power_Check();
  213. #endif
  214. }
  215. if (FaultSource == SYS_NO_FAULT)
  216. {
  217. // 电压检测
  218. #if (PRT_VDC_EN)
  219. Bus_Voltage_Check();
  220. #endif
  221. // 温度检测
  222. #if (PRT_OVER_TEMPER_EN)
  223. MOS_Temper_Check();
  224. #endif
  225. }
  226. // 故障自动恢复
  227. #if (AUTO_RECOVER_FAULT_EN)
  228. Recovery_Fault_Handle();
  229. #endif
  230. }