Protect.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. #include "FU68xx_5.h"
  2. #include <Myproject.h>
  3. FaultStateType xdata mcFaultSource;
  4. PFCFaultStateType xdata PFCFaultSource;
  5. FaultVarible idata mcFaultDect;
  6. PFCFaultVarible idata PFCFaultDect;
  7. ProtectVarible xdata mcProtectTime;
  8. /*****************************************************************************
  9. Function: void Fault_OverVoltage(mcFaultVarible *h_Fault)
  10. Description: 过压欠压保护函数:程序每5ms判断一次,母线电压大于过压保护值时,计数器加一,计数器值超过20次,判断为过压保护,关闭输出;反之,计数器慢慢减
  11. 同理,欠压保护。
  12. 电机过欠压保护状态下,母线电压恢复到欠压恢复值以上,过压恢复值以下时,计数器加一,超过200次后,恢复。根据档位信息来决定恢复到哪个状态。
  13. Parameter: mcFaultVarible *h_Fault
  14. Return: no
  15. *****************************************************************************/
  16. void Fault_OverUnderVoltage(void)
  17. {
  18. if ((mcFaultSource == FaultNoSource) && (mcState == mcRun)) //程序无其他保护下
  19. {
  20. //过压保护
  21. if (mcFocCtrl.mcDcbusFlt > OVER_PROTECT_VALUE) //母线电压大于过压保护值时,计数,超过20次,判断为过压保护,关闭输出;反之,计数器慢慢减
  22. {
  23. mcFaultDect.OverVoltDetecCnt++;
  24. if (mcFaultDect.OverVoltDetecCnt > 20) //检测100ms
  25. {
  26. mcFaultDect.OverVoltDetecCnt = 0;
  27. mcFaultSource = FaultOverVoltage;
  28. FaultProcess();
  29. }
  30. }
  31. else
  32. {
  33. if (mcFaultDect.OverVoltDetecCnt > 0)
  34. { mcFaultDect.OverVoltDetecCnt--; }
  35. }
  36. //欠压保护
  37. if (mcFocCtrl.mcDcbusFlt < UNDER_PROTECT_VALUE)
  38. {
  39. mcFaultDect.UnderVoltDetecCnt++;
  40. if (mcFaultDect.UnderVoltDetecCnt > 20) //检测100ms
  41. {
  42. mcFaultDect.UnderVoltDetecCnt = 0;
  43. mcFaultSource = FaultUnderVoltage;
  44. FaultProcess();
  45. }
  46. }
  47. else
  48. {
  49. if (mcFaultDect.UnderVoltDetecCnt > 0)
  50. { mcFaultDect.UnderVoltDetecCnt--; }
  51. }
  52. }
  53. /*******过压欠压保护恢复*********/
  54. if ((mcState == mcFault) && ((mcFaultSource == FaultUnderVoltage) || (mcFaultSource == FaultOverVoltage)))
  55. {
  56. if ((mcFocCtrl.mcDcbusFlt < OVER_RECOVER_VALUE) && (mcFocCtrl.mcDcbusFlt > UNDER_RECOVER_VALUE))
  57. {
  58. mcFaultDect.VoltRecoverCnt++;
  59. if (mcFaultDect.VoltRecoverCnt > 2000) //连续检测1s,若正常则恢复
  60. {
  61. mcFaultSource = FaultNoSource;
  62. mcFaultDect.VoltRecoverCnt = 0;
  63. }
  64. }
  65. else
  66. {
  67. mcFaultDect.VoltRecoverCnt = 0;
  68. }
  69. }
  70. }
  71. /*****************************************************************************
  72. Function: void Fault_Overcurrent(CurrentVarible *h_Cur)
  73. Description: 电机运行或者启动时,当三相中某一相最大值大于OverCurrentValue,则OverCurCnt加1。
  74. 连续累加3次,判断为软件过流保护。执行时间约30.4us。
  75. Parameter: mcFaultVarible *h_Fault
  76. Return: no
  77. *****************************************************************************/
  78. void Fault_Overcurrent(void)
  79. {
  80. static uint16 IIs;
  81. if (mcFaultSource == FaultNoSource)
  82. {
  83. if (mcState == mcStart || mcState == mcAlign || mcState == mcRun || mcState == mcStop)
  84. {
  85. SqrtI_alpbet(FOC__ID, FOC__IQ, IIs); //平方和后开根号
  86. mcCurVarible.Max_is = IIs;
  87. if (mcCurVarible.Max_is >= SW_OC_CurrentVal) // 过流保护
  88. {
  89. mcCurVarible.time++;
  90. if (mcCurVarible.time > SW_OC_DectTime)
  91. {
  92. mcCurVarible.time = 0;
  93. mcFaultSource = FaultSoftOVCurrent;
  94. FaultProcess();
  95. }
  96. }
  97. else
  98. {
  99. mcCurVarible.time = 0;
  100. }
  101. }
  102. }
  103. }
  104. /*****************************************************************************
  105. Function: void Fault_OverCurrentRecover(mcFaultVarible *h_Fault)
  106. Description: 软硬件过流保护恢复
  107. Parameter: mcFaultVarible *h_Fault
  108. Return: no
  109. *****************************************************************************/
  110. void Fault_OverCurrentRecover(void)
  111. {
  112. if ((mcState == mcFault) && ((mcFaultSource == FaultSoftOVCurrent)
  113. || (mcFaultSource == FaultHardOVCurrent)) && (mcProtectTime.CurrentPretectTimes < CurrentProtectRestartTimes))
  114. {
  115. mcFaultDect.CurrentRecoverCnt++;
  116. if (mcFaultDect.CurrentRecoverCnt >= OverCurrentRecoverTime) //200*5=1s
  117. {
  118. mcFaultDect.CurrentRecoverCnt = 0;
  119. mcProtectTime.CurrentPretectTimes++;
  120. mcFaultSource = FaultNoSource;
  121. PRE_DRIVER_RST = 0;
  122. }
  123. }
  124. }
  125. /*****************************************************************************
  126. Function: void Fault_Start(mcFaultVarible *h_Fault)
  127. Description: 启动保护函数,电机运行状态下,电机在前5s估算转速达到堵转保护值或者5s后反电动势值太低(此方法未验证)
  128. 或4s内还在CtrlMode状态,即速度低于MOTOR_LOOP_RPM,程序判断为启动失败,电机停机。
  129. 当程序判断为启动失败后,若重启次数少于或等于5次,程序立即进入校准状态,等待重启。
  130. Parameter: mcFaultVarible *h_Fault
  131. Return: no
  132. *****************************************************************************/
  133. void Fault_Start(void)
  134. {
  135. /*******启动保护恢复*********/
  136. if (mcState == mcRun)
  137. {
  138. //方法一,5s内速度大于最大速度,同时反电动势值低于一定值
  139. if (mcFaultDect.StartSpeedCnt <= 1000)
  140. {
  141. mcFaultDect.StartSpeedCnt++;
  142. if ((motorControl.ActualSpeed > MOTOR_MAX_SPEED) && (mcFocCtrl.BEmf < 1300))
  143. {
  144. mcFaultDect.StartSpeedCnt = 0;
  145. mcFaultSource = FaultStart;
  146. FaultProcess();
  147. mcProtectTime.StartFlag = 1;
  148. }
  149. }
  150. //方法二
  151. if (mcFaultDect.StartEsCnt <= 1200) //前6s,等待1.5s后,开始判断ES,如果超过一定次数,则失败
  152. {
  153. mcFaultDect.StartEsCnt++;
  154. mcFaultDect.StartDelay++;
  155. if (mcFaultDect.StartDelay >= 300) // 1.5s
  156. {
  157. mcFaultDect.StartDelay = 300;
  158. if ((mcFocCtrl.BEmf < 500)) //&&(mcFocCtrl.CtrlMode==0))
  159. {
  160. mcFaultDect.StartESCount++;
  161. if (mcFaultDect.StartESCount >= 20)
  162. {
  163. mcFaultSource = FaultStart;
  164. FaultProcess();
  165. mcFaultDect.StartDelay = 0;
  166. mcFaultDect.StartESCount = 0;
  167. mcProtectTime.StartFlag = 2;
  168. }
  169. }
  170. else
  171. {
  172. if (mcFaultDect.StartESCount > 0)
  173. {
  174. mcFaultDect.StartESCount--;
  175. }
  176. }
  177. }
  178. }
  179. else
  180. {
  181. mcFaultDect.StartESCount = 0;
  182. }
  183. //方法三,长时间在CtrlMode=0状态
  184. if (mcFocCtrl.CtrlMode == 0) //
  185. {
  186. mcFaultDect.StartFocmode++;
  187. if (mcFaultDect.StartFocmode >= 400)
  188. {
  189. mcFaultDect.StartFocmode = 0;
  190. mcFaultSource = FaultStart;
  191. FaultProcess();
  192. mcProtectTime.StartFlag = 3;
  193. }
  194. }
  195. }
  196. if ((mcFaultSource == FaultStart) && (mcState == mcFault) && (mcProtectTime.SecondStartTimes <= StartProtectRestartTimes))
  197. {
  198. mcProtectTime.SecondStartTimes++;
  199. mcFaultSource = FaultNoSource;
  200. }
  201. }
  202. /*****************************************************************************
  203. Function: void Fault_Stall(mcFaultVarible *h_Fault)
  204. Description: 堵转保护函数,有三种保护方式,
  205. 第一种,
  206. 第二种,电机运行状态下,延迟4s判断,估算速度绝对值超过堵转速度连续5次;
  207. 第三种,电机运行状态下,当U,V两相电流绝对值大于堵转电流保护值连续6次;
  208. 当以上三种的任何一种保护触发时,电机停机,程序判断为堵转保护;
  209. 当堵转保护状态下,U相采集值低于堵转恢复值时,若堵转次数小于或等于堵转重启次数8次,
  210. 程序延迟mcStallRecover重新启动,进行校准状态。
  211. Parameter: mcFaultVarible *h_Fault
  212. Return: no
  213. *****************************************************************************/
  214. //堵转保护
  215. void Fault_Stall(void)
  216. {
  217. if (mcState == mcRun)
  218. {
  219. if (mcFaultDect.StallDelayCnt <= 1000) //5s
  220. {
  221. mcFaultDect.StallDelayCnt++;
  222. }
  223. else
  224. {
  225. //method 1,判断反电动势太小或当反电动势太小,转速太大
  226. if ((mcFocCtrl.BEmf < 1000) || ((FOC__EOME > _Q15(3000.0 / MOTOR_SPEED_BASE)) && (mcFocCtrl.BEmf < 2000)))
  227. {
  228. mcFaultDect.StallDectEs++;
  229. if (mcFaultDect.StallDectEs >= 10)
  230. {
  231. mcFaultDect.StallDectEs = 0;
  232. mcFaultSource = FaultStall;
  233. FaultProcess();
  234. mcProtectTime.StallFlag = 1;
  235. }
  236. }
  237. else
  238. {
  239. if ( mcFaultDect.StallDectEs > 0)
  240. {
  241. mcFaultDect.StallDectEs--;
  242. }
  243. }
  244. //method 2,判断速度低于堵转最小值或者超过堵转最大值
  245. if ((motorControl.ActualSpeed < MOTOR_STALL_MIN_SPEED) || (motorControl.ActualSpeed > MOTOR_STALL_MAX_SPEED))
  246. {
  247. mcFaultDect.StallDectSpeed++;
  248. if (mcFaultDect.StallDectSpeed >= 8)
  249. {
  250. mcFaultDect.StallDectSpeed = 0;
  251. mcFaultSource = FaultStall;
  252. FaultProcess();
  253. mcProtectTime.StallFlag = 2;
  254. }
  255. }
  256. else
  257. {
  258. if (mcFaultDect.StallDectSpeed > 0)
  259. {
  260. mcFaultDect.StallDectSpeed--;
  261. }
  262. }
  263. //method 3
  264. // if((mcFocCtrl.BEmf<=25*(uint32)motorControl.ActualSpeed/10)&&mcFocCtrl.BEmf>=10*(uint32)motorControl.ActualSpeed/10)//1.15
  265. // {
  266. // mcFaultDect.StallDectEs2 = 0;
  267. // }
  268. // else
  269. // {
  270. //
  271. // mcFaultDect.StallDectEs2++;
  272. // if(mcFaultDect.StallDectEs2>=30)
  273. // {
  274. // mcFaultDect.StallDectEs2 = 0;
  275. // mcFaultSource = FaultStall;
  276. // FaultProcess();
  277. // }
  278. //
  279. // }
  280. }
  281. }
  282. /*******堵转保护恢复*********/
  283. if ((mcFaultSource == FaultStall) && (mcState == mcFault) && (mcProtectTime.StallTimes < StallProtectRestartTimes))
  284. {
  285. mcFaultDect.StallReCount++;
  286. if (mcFaultDect.StallReCount >= StallRecoverTime)
  287. {
  288. mcProtectTime.StallTimes++;
  289. mcFaultDect.StallReCount = 0;
  290. mcFaultSource = FaultNoSource;
  291. }
  292. }
  293. else
  294. {
  295. mcFaultDect.StallReCount = 0;
  296. }
  297. }
  298. /*****************************************************************************
  299. Function: void Fault_phaseloss(mcFaultVarible *h_Fault)
  300. Description: 缺相保护函数,当电机运行状态下,10ms取三相电流的最大值,
  301. 1.5s判断各相电流最大值,若存在两相电流值大于一定值,而第三相电流值却非常小,则判断为缺相保护,电机停机;
  302. Parameter: mcFaultVarible *h_Fault
  303. Return: no
  304. *****************************************************************************/
  305. void Fault_phaseloss(void)
  306. {
  307. if (mcState == mcAlign)
  308. {
  309. if (mcFocCtrl.CurrentAlignStatus == 0)
  310. {
  311. mcFaultDect.CurrentASum += FOC__IA;
  312. mcFaultDect.CurrentBSum += FOC__IB;
  313. mcFaultDect.CurrentCSum += FOC__IC;
  314. }
  315. else if (mcFocCtrl.CurrentAlignStatus == 1)
  316. {
  317. mcFaultDect.CurrentAAlign = mcFaultDect.CurrentASum / AlignmentHoldTime1 ;
  318. mcFaultDect.CurrentBAlign = -(mcFaultDect.CurrentBSum << 1) / AlignmentHoldTime1;
  319. mcFaultDect.CurrentCAlign = -(mcFaultDect.CurrentCSum << 1) / AlignmentHoldTime1;
  320. if ( mcFaultDect.CurrentAAlign > mcFaultDect.CurrentBAlign << 1
  321. || mcFaultDect.CurrentAAlign > mcFaultDect.CurrentCAlign << 1
  322. || mcFaultDect.CurrentBAlign > mcFaultDect.CurrentCAlign << 1
  323. || (mcFaultDect.CurrentAAlign < 20 && mcFaultDect.CurrentBAlign < 20 && mcFaultDect.CurrentCAlign < 20))
  324. {
  325. mcFaultSource = FaultLossPhase;
  326. FaultProcess();
  327. }
  328. }
  329. }
  330. if (mcState == mcRun)
  331. {
  332. mcCurVarible.Max_ia = FOC__IAMAX;
  333. mcCurVarible.Max_ib = FOC__IBMAX;
  334. mcCurVarible.Max_ic = FOC__ICMAX;
  335. mcFaultDect.Lphasecnt++;
  336. if (mcFaultDect.Lphasecnt > 40) //100*5=500ms
  337. {
  338. mcFaultDect.Lphasecnt = 0;
  339. if (((mcCurVarible.Max_ia > (mcCurVarible.Max_ib << 1)) || (mcCurVarible.Max_ia > (mcCurVarible.Max_ic << 1)))
  340. && (mcCurVarible.Max_ia > PhaseLossCurrentValue))
  341. {
  342. mcFaultDect.AOpencnt++;
  343. }
  344. else
  345. {
  346. if (mcFaultDect.AOpencnt > 0)
  347. {
  348. mcFaultDect.AOpencnt --;
  349. }
  350. }
  351. if (((mcCurVarible.Max_ib > (mcCurVarible.Max_ia << 1)) || (mcCurVarible.Max_ib > (mcCurVarible.Max_ic << 1)))
  352. && (mcCurVarible.Max_ib > PhaseLossCurrentValue))
  353. {
  354. mcFaultDect.BOpencnt++;
  355. }
  356. else
  357. {
  358. if (mcFaultDect.BOpencnt > 0)
  359. {
  360. mcFaultDect.BOpencnt --;
  361. }
  362. }
  363. if (((mcCurVarible.Max_ic > (mcCurVarible.Max_ia << 1)) || (mcCurVarible.Max_ic > (mcCurVarible.Max_ib << 1)))
  364. && (mcCurVarible.Max_ic > PhaseLossCurrentValue))
  365. {
  366. mcFaultDect.COpencnt++;
  367. }
  368. else
  369. {
  370. if (mcFaultDect.COpencnt > 0)
  371. {
  372. mcFaultDect.COpencnt --;
  373. }
  374. }
  375. mcCurVarible.Max_ia = 0;
  376. mcCurVarible.Max_ib = 0;
  377. mcCurVarible.Max_ic = 0;
  378. SetBit(FOC_CR2, ICLR); //FOC__IA/B/CMAX清零
  379. if ((mcFaultDect.AOpencnt > 3) || (mcFaultDect.BOpencnt > 3) || (mcFaultDect.COpencnt > 3))
  380. {
  381. mcFaultSource = FaultLossPhase;
  382. FaultProcess();
  383. }
  384. }
  385. }
  386. /*******缺相保护恢复*********/
  387. if ((mcFaultSource == FaultLossPhase) && (mcState == mcFault) && (mcProtectTime.LossPHTimes < PhaseProtectRestartTimes)) //可重启5次
  388. {
  389. mcFaultDect.mcLossPHRecCount++;
  390. if (mcFaultDect.mcLossPHRecCount >= PhaseLossRecoverTime)
  391. {
  392. mcProtectTime.LossPHTimes++;
  393. mcFaultSource = FaultNoSource;
  394. }
  395. }
  396. else
  397. {
  398. mcFaultDect.mcLossPHRecCount = 0;
  399. }
  400. }
  401. void Fault_IPMOverTemp(void)
  402. {
  403. if (mcFaultSource == FaultNoSource)
  404. {
  405. if (mcFocCtrl.IPMtemp > TempProtValue)
  406. {
  407. mcFaultDect.OverTempDetecCnt++;
  408. if (mcFaultDect.OverTempDetecCnt > 20)
  409. {
  410. mcFaultDect.OverTempDetecCnt = 0;
  411. mcFaultSource = FaultIpmTemp;
  412. FaultProcess();
  413. }
  414. }
  415. else
  416. {
  417. mcFaultDect.OverTempDetecCnt = 0;
  418. }
  419. }
  420. /*******温度保护恢复*********/
  421. if ((mcState == mcFault) && (mcFaultSource == FaultIpmTemp))
  422. {
  423. if (mcFocCtrl.IPMtemp < TempRecoverValue)
  424. {
  425. mcFaultDect.TempRecoverCnt++;
  426. if (mcFaultDect.TempRecoverCnt > 200)
  427. {
  428. mcFaultSource = FaultNoSource;
  429. mcFaultDect.TempRecoverCnt = 0;
  430. }
  431. }
  432. else
  433. {
  434. mcFaultDect.TempRecoverCnt = 0;
  435. }
  436. }
  437. }
  438. void Fault_TempSensor(void)
  439. {
  440. if (mcFaultSource == FaultNoSource)
  441. {
  442. if ((Huan_temp == 1500) || (Huan_temp == -1000))
  443. {
  444. mcFaultDect.OverHuantempDetecCnt++;
  445. if (mcFaultDect.OverHuantempDetecCnt > 50)
  446. {
  447. mcFaultDect.OverHuantempDetecCnt = 0;
  448. mcFaultSource = FaultHuanTempSensor;
  449. FaultProcess();
  450. }
  451. }
  452. else
  453. {
  454. mcFaultDect.OverHuantempDetecCnt = 0;
  455. }
  456. if ((Guan_temp == 1500) || (Guan_temp == -1000))
  457. {
  458. mcFaultDect.OverGuantempDetecCnt++;
  459. if (mcFaultDect.OverGuantempDetecCnt > 50)
  460. {
  461. mcFaultDect.OverGuantempDetecCnt = 0;
  462. mcFaultSource = FaultGuanTempSensor;
  463. FaultProcess();
  464. }
  465. }
  466. else
  467. {
  468. mcFaultDect.OverGuantempDetecCnt = 0;
  469. }
  470. }
  471. /*******温度保护恢复*********/
  472. if ((mcState == mcFault) && ((mcFaultSource == FaultHuanTempSensor) || (mcFaultSource == FaultGuanTempSensor)))
  473. {
  474. if ((Huan_temp != 1500) && (Huan_temp != -1000))
  475. {
  476. mcFaultDect.HuantempRecoverCnt++;
  477. if (mcFaultDect.HuantempRecoverCnt > 200)
  478. {
  479. mcFaultSource = FaultNoSource;
  480. mcFaultDect.HuantempRecoverCnt = 0;
  481. }
  482. }
  483. else
  484. {
  485. mcFaultDect.HuantempRecoverCnt = 0;
  486. }
  487. if ((Guan_temp != 1500) && (Guan_temp != -1000))
  488. {
  489. mcFaultDect.GuantempRecoverCnt++;
  490. if (mcFaultDect.GuantempRecoverCnt > 200)
  491. {
  492. mcFaultSource = FaultNoSource;
  493. mcFaultDect.GuantempRecoverCnt = 0;
  494. }
  495. }
  496. else
  497. {
  498. mcFaultDect.GuantempRecoverCnt = 0;
  499. }
  500. }
  501. }
  502. /*通信保护*/
  503. void Fault_cummution()
  504. {
  505. if ((mcFaultDect.commu_time >= 30000) && (CummProtectEnable == 1))
  506. {
  507. ConTrolCmd.yajispeed = 0;
  508. ConTrolCmd.fengjispeed = 0;
  509. }
  510. }
  511. /*压机偏置电压错误恢复*/
  512. void IOffsetRecoverEnable()
  513. {
  514. if ((mcFaultSource == FaultIbusOffset) && (mcProtectTime.IbusOffsetProtectTimes < IbusOffsetRestartTimes))
  515. {
  516. mcFaultDect.IbusOffsetRecoverCnt++;
  517. if ((mcFaultDect.IbusOffsetRecoverCnt) >= IbusOffsetRecoverTime)//IbusOffsetRecoverTime*1ms
  518. {
  519. McStaSet.SetFlag.CalibFlag = 0;
  520. mcFaultDect.IbusOffsetRecoverCnt = 0;
  521. mcProtectTime.IbusOffsetProtectTimes++;
  522. mcFaultSource = FaultNoSource;
  523. }
  524. }
  525. }
  526. void Fault_UdcMax_Min(void)
  527. {
  528. if ((mcFaultSource == FaultNoSource) && (mcState == mcRun))
  529. {
  530. if ((mcFocCtrl.mcDcbus_chazhi >= _Q15(120 / HW_BOARD_VOLT_MAX)) && mcFocCtrl.mcDcbus_min <= _Q15(380 / HW_BOARD_VOLT_MAX))
  531. {
  532. mcFaultDect.shurulossCnt++;
  533. if (mcFaultDect.shurulossCnt > 10)
  534. {
  535. mcFaultDect.shurulossCnt = 0;
  536. mcFaultSource = FaultshuruLoss;
  537. FaultProcess();
  538. }
  539. }
  540. else
  541. {
  542. mcFaultDect.shurulossCnt--;
  543. if (mcFaultDect.shurulossCnt <= 0)
  544. {
  545. mcFaultDect.shurulossCnt = 0;
  546. }
  547. }
  548. }
  549. /*******保护恢复*********/
  550. if ((mcState == mcFault) && (mcFaultSource == FaultshuruLoss) && (mcProtectTime.shurulossTimes <= 3))
  551. {
  552. if (((mcFocCtrl.mcDcbus_chazhi) <= _Q15(20 / HW_BOARD_VOLT_MAX)) && mcFocCtrl.mcDcbus_min >= _Q15(500 / HW_BOARD_VOLT_MAX))
  553. {
  554. mcFaultDect.shurulossRecCount++;
  555. if (mcFaultDect.shurulossRecCount > 200)
  556. {
  557. mcProtectTime.shurulossTimes++;
  558. mcFaultSource = FaultNoSource;
  559. mcFaultDect.shurulossRecCount = 0;
  560. }
  561. }
  562. else
  563. {
  564. mcFaultDect.shurulossRecCount = 0;
  565. }
  566. }
  567. }
  568. /*---------------------------------------------------------------------------*/
  569. /* Name : void Fault_Detection(void)
  570. /* Input : NO
  571. /* Output : NO
  572. /* Description: 保护函数,因保护的时间响应不会很高,采用分段处理,每5个定时器中断执行一次对应的保护
  573. 常见保护有过欠压、过温、堵转、启动、缺相等保护,调试时,可根据需求,一个个的调试加入。
  574. /*---------------------------------------------------------------------------*/
  575. void Fault_Detection(void)
  576. {
  577. mcFaultDect.segment++;
  578. if (mcFaultDect.segment >= 7)
  579. {
  580. mcFaultDect.segment = 0;
  581. }
  582. if (mcFaultDect.segment == 0)
  583. {
  584. #if (CurrentRecoverEnable == 1)//过流保护恢复使能
  585. {
  586. Fault_OverCurrentRecover();
  587. }
  588. #endif
  589. }
  590. else if (mcFaultDect.segment == 1)
  591. {
  592. #if (VoltageProtectEnable == 1)//过压保护使能
  593. {
  594. Fault_OverUnderVoltage();
  595. }
  596. #endif
  597. #if (IbusOffsetRecoverEnable) //偏执电压保护恢复
  598. {
  599. IOffsetRecoverEnable();
  600. }
  601. #endif
  602. }
  603. else if (mcFaultDect.segment == 2)
  604. {
  605. #if (StartProtectEnable == 1)//启动保护使能
  606. {
  607. Fault_Start();
  608. }
  609. #endif
  610. }
  611. else if (mcFaultDect.segment == 3)
  612. {
  613. #if (StallProtectEnable == 1)//堵转保护使能
  614. {
  615. Fault_Stall();
  616. }
  617. #endif
  618. }
  619. else if (mcFaultDect.segment == 4)
  620. {
  621. #if (PhaseLossProtectEnable == 1)//缺相保护使能
  622. {
  623. Fault_phaseloss();
  624. }
  625. #endif
  626. }
  627. else if (mcFaultDect.segment == 5)
  628. {
  629. #if (TempProtectEnable == 1)//IPM温度保护
  630. {
  631. Fault_IPMOverTemp();
  632. }
  633. #endif
  634. #if (TempSensorProtectEnable==1)
  635. {
  636. Fault_TempSensor();
  637. }
  638. #endif
  639. }
  640. #if (ShuruLossProtectEnable == 1)
  641. {
  642. Fault_UdcMax_Min();
  643. }
  644. #endif
  645. }