Protect.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  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__IA,FOC__IBET,IIs);//平方和后开根号
  86. SqrtI_alpbet(FOC__ID, FOC__IQ, IIs); //平方和后开根号
  87. mcCurVarible.Max_is = IIs;
  88. if (mcCurVarible.Max_is >= SW_OC_CurrentVal) // 过流保护
  89. {
  90. if (mcCurVarible.time < SW_OC_DectTime)
  91. {
  92. mcCurVarible.time++;
  93. }
  94. else
  95. {
  96. mcCurVarible.time = 0;
  97. mcFaultSource = FaultSoftOVCurrent;
  98. FaultProcess();
  99. }
  100. }
  101. else
  102. {
  103. mcCurVarible.time = 0;
  104. }
  105. }
  106. }
  107. }
  108. /*****************************************************************************
  109. Function: void Fault_OverCurrentRecover(mcFaultVarible *h_Fault)
  110. Description: 软硬件过流保护恢复
  111. Parameter: mcFaultVarible *h_Fault
  112. Return: no
  113. *****************************************************************************/
  114. void Fault_OverCurrentRecover(void)
  115. {
  116. if ((mcState == mcFault) && ((mcFaultSource == FaultSoftOVCurrent)
  117. || (mcFaultSource == FaultHardOVCurrent)) && (mcProtectTime.CurrentPretectTimes < CurrentProtectRestartTimes))
  118. {
  119. mcFaultDect.CurrentRecoverCnt++;
  120. if (mcFaultDect.CurrentRecoverCnt >= OverCurrentRecoverTime) //200*5=1s
  121. {
  122. mcFaultDect.CurrentRecoverCnt = 0;
  123. mcProtectTime.CurrentPretectTimes++;
  124. mcFaultSource = FaultNoSource;
  125. RST = 0;
  126. }
  127. }
  128. }
  129. /*****************************************************************************
  130. Function: void Fault_Start(mcFaultVarible *h_Fault)
  131. Description: 启动保护函数,电机运行状态下,电机在前5s估算转速达到堵转保护值或者5s后反电动势值太低(此方法未验证)
  132. 或4s内还在CtrlMode状态,即速度低于MOTOR_LOOP_RPM,程序判断为启动失败,电机停机。
  133. 当程序判断为启动失败后,若重启次数少于或等于5次,程序立即进入校准状态,等待重启。
  134. Parameter: mcFaultVarible *h_Fault
  135. Return: no
  136. *****************************************************************************/
  137. void Fault_Start(void)
  138. {
  139. /*******启动保护恢复*********/
  140. if (mcState == mcRun)
  141. {
  142. //方法一,5s内速度大于最大速度,同时反电动势值低于一定值
  143. if (mcFaultDect.StartSpeedCnt <= 1000)
  144. {
  145. mcFaultDect.StartSpeedCnt++;
  146. if ((mcFocCtrl.SpeedFlt > Motor_Max_Speed) && (mcFocCtrl.BEmf < 1300))
  147. {
  148. mcFaultDect.StartSpeedCnt = 0;
  149. mcFaultSource = FaultStart;
  150. FaultProcess();
  151. mcProtectTime.StartFlag = 1;
  152. }
  153. }
  154. //方法二
  155. if (mcFaultDect.StartEsCnt <= 1200) //前6s,等待1.5s后,开始判断ES,如果超过一定次数,则失败
  156. {
  157. mcFaultDect.StartEsCnt++;
  158. mcFaultDect.StartDelay++;
  159. if (mcFaultDect.StartDelay >= 300) // 1.5s
  160. {
  161. mcFaultDect.StartDelay = 300;
  162. if ((mcFocCtrl.BEmf < 500)) //&&(mcFocCtrl.CtrlMode==0))
  163. {
  164. mcFaultDect.StartESCount++;
  165. if (mcFaultDect.StartESCount >= 20)
  166. {
  167. mcFaultSource = FaultStart;
  168. FaultProcess();
  169. mcFaultDect.StartDelay = 0;
  170. mcFaultDect.StartESCount = 0;
  171. mcProtectTime.StartFlag = 2;
  172. }
  173. }
  174. else
  175. {
  176. if (mcFaultDect.StartESCount > 0)
  177. {
  178. mcFaultDect.StartESCount--;
  179. }
  180. }
  181. }
  182. }
  183. else
  184. {
  185. mcFaultDect.StartESCount = 0;
  186. }
  187. //方法三,长时间在CtrlMode=0状态
  188. if (mcFocCtrl.CtrlMode == 0) //
  189. {
  190. mcFaultDect.StartFocmode++;
  191. if (mcFaultDect.StartFocmode >= 400)
  192. {
  193. mcFaultDect.StartFocmode = 0;
  194. mcFaultSource = FaultStart;
  195. FaultProcess();
  196. mcProtectTime.StartFlag = 3;
  197. }
  198. }
  199. }
  200. if ((mcFaultSource == FaultStart) && (mcState == mcFault) && (mcProtectTime.SecondStartTimes <= StartProtectRestartTimes))
  201. {
  202. mcProtectTime.SecondStartTimes++;
  203. mcFaultSource = FaultNoSource;
  204. }
  205. }
  206. /*****************************************************************************
  207. Function: void Fault_Stall(mcFaultVarible *h_Fault)
  208. Description: 堵转保护函数,有三种保护方式,
  209. 第一种,
  210. 第二种,电机运行状态下,延迟4s判断,估算速度绝对值超过堵转速度连续5次;
  211. 第三种,电机运行状态下,当U,V两相电流绝对值大于堵转电流保护值连续6次;
  212. 当以上三种的任何一种保护触发时,电机停机,程序判断为堵转保护;
  213. 当堵转保护状态下,U相采集值低于堵转恢复值时,若堵转次数小于或等于堵转重启次数8次,
  214. 程序延迟mcStallRecover重新启动,进行校准状态。
  215. Parameter: mcFaultVarible *h_Fault
  216. Return: no
  217. *****************************************************************************/
  218. //堵转保护
  219. void Fault_Stall(void)
  220. {
  221. if (mcState == mcRun)
  222. {
  223. if (mcFaultDect.StallDelayCnt <= 1000) //5s
  224. {
  225. mcFaultDect.StallDelayCnt++;
  226. }
  227. else
  228. {
  229. //method 1,判断反电动势太小或当反电动势太小,转速太大
  230. if ((mcFocCtrl.BEmf < 1000) || ((FOC__EOME > _Q15(3000.0 / MOTOR_SPEED_BASE)) && (mcFocCtrl.BEmf < 2000)))
  231. {
  232. mcFaultDect.StallDectEs++;
  233. if (mcFaultDect.StallDectEs >= 10)
  234. {
  235. mcFaultDect.StallDectEs = 0;
  236. mcFaultSource = FaultStall;
  237. FaultProcess();
  238. mcProtectTime.StallFlag = 1;
  239. }
  240. }
  241. else
  242. {
  243. if ( mcFaultDect.StallDectEs > 0)
  244. {
  245. mcFaultDect.StallDectEs--;
  246. }
  247. }
  248. //method 2,判断速度低于堵转最小值或者超过堵转最大值
  249. if ((mcFocCtrl.SpeedFlt < Motor_Stall_Min_Speed) || (mcFocCtrl.SpeedFlt > Motor_Stall_Max_Speed))
  250. {
  251. mcFaultDect.StallDectSpeed++;
  252. if (mcFaultDect.StallDectSpeed >= 8)
  253. {
  254. mcFaultDect.StallDectSpeed = 0;
  255. mcFaultSource = FaultStall;
  256. FaultProcess();
  257. mcProtectTime.StallFlag = 2;
  258. }
  259. }
  260. else
  261. {
  262. if (mcFaultDect.StallDectSpeed > 0)
  263. {
  264. mcFaultDect.StallDectSpeed--;
  265. }
  266. }
  267. //method 3
  268. // if((mcFocCtrl.BEmf<=25*(uint32)mcFocCtrl.SpeedFlt/10)&&mcFocCtrl.BEmf>=10*(uint32)mcFocCtrl.SpeedFlt/10)//1.15
  269. // {
  270. // mcFaultDect.StallDectEs2 = 0;
  271. // }
  272. // else
  273. // {
  274. //
  275. // mcFaultDect.StallDectEs2++;
  276. // if(mcFaultDect.StallDectEs2>=30)
  277. // {
  278. // mcFaultDect.StallDectEs2 = 0;
  279. // mcFaultSource = FaultStall;
  280. // FaultProcess();
  281. // }
  282. //
  283. // }
  284. }
  285. }
  286. /*******堵转保护恢复*********/
  287. if ((mcFaultSource == FaultStall) && (mcState == mcFault) && (mcProtectTime.StallTimes < StallProtectRestartTimes))
  288. {
  289. mcFaultDect.StallReCount++;
  290. if (mcFaultDect.StallReCount >= StallRecoverTime)
  291. {
  292. mcProtectTime.StallTimes++;
  293. mcFaultDect.StallReCount = 0;
  294. mcFaultSource = FaultNoSource;
  295. }
  296. }
  297. else
  298. {
  299. mcFaultDect.StallReCount = 0;
  300. }
  301. }
  302. /*****************************************************************************
  303. Function: void Fault_phaseloss(mcFaultVarible *h_Fault)
  304. Description: 缺相保护函数,当电机运行状态下,10ms取三相电流的最大值,
  305. 1.5s判断各相电流最大值,若存在两相电流值大于一定值,而第三相电流值却非常小,则判断为缺相保护,电机停机;
  306. Parameter: mcFaultVarible *h_Fault
  307. Return: no
  308. *****************************************************************************/
  309. void Fault_phaseloss(void)
  310. {
  311. if (mcState == mcAlign)
  312. {
  313. if (mcFocCtrl.CurrentAlignStatus == 0)
  314. {
  315. mcFaultDect.CurrentASum += FOC__IA;
  316. mcFaultDect.CurrentBSum += FOC__IB;
  317. mcFaultDect.CurrentCSum += FOC__IC;
  318. }
  319. else if (mcFocCtrl.CurrentAlignStatus == 1)
  320. {
  321. mcFaultDect.CurrentAAlign = mcFaultDect.CurrentASum / AlignmentHoldTime1 ;
  322. mcFaultDect.CurrentBAlign = -(mcFaultDect.CurrentBSum << 1) / AlignmentHoldTime1;
  323. mcFaultDect.CurrentCAlign = -(mcFaultDect.CurrentCSum << 1) / AlignmentHoldTime1;
  324. if ( mcFaultDect.CurrentAAlign > mcFaultDect.CurrentBAlign << 1
  325. || mcFaultDect.CurrentAAlign > mcFaultDect.CurrentCAlign << 1
  326. || mcFaultDect.CurrentBAlign > mcFaultDect.CurrentCAlign << 1
  327. || (mcFaultDect.CurrentAAlign < 20 && mcFaultDect.CurrentBAlign < 20 && mcFaultDect.CurrentCAlign < 20))
  328. {
  329. mcFaultSource = FaultLossPhase;
  330. FaultProcess();
  331. }
  332. }
  333. }
  334. if (mcState == mcRun)
  335. {
  336. mcCurVarible.Max_ia = FOC__IAMAX;
  337. mcCurVarible.Max_ib = FOC__IBMAX;
  338. mcCurVarible.Max_ic = FOC__ICMAX;
  339. mcFaultDect.Lphasecnt++;
  340. if (mcFaultDect.Lphasecnt > 40) //100*5=500ms
  341. {
  342. mcFaultDect.Lphasecnt = 0;
  343. if (((mcCurVarible.Max_ia > (mcCurVarible.Max_ib << 1)) || (mcCurVarible.Max_ia > (mcCurVarible.Max_ic << 1)))
  344. && (mcCurVarible.Max_ia > PhaseLossCurrentValue))
  345. {
  346. mcFaultDect.AOpencnt++;
  347. }
  348. else
  349. {
  350. if (mcFaultDect.AOpencnt > 0)
  351. {
  352. mcFaultDect.AOpencnt --;
  353. }
  354. }
  355. if (((mcCurVarible.Max_ib > (mcCurVarible.Max_ia << 1)) || (mcCurVarible.Max_ib > (mcCurVarible.Max_ic << 1)))
  356. && (mcCurVarible.Max_ib > PhaseLossCurrentValue))
  357. {
  358. mcFaultDect.BOpencnt++;
  359. }
  360. else
  361. {
  362. if (mcFaultDect.BOpencnt > 0)
  363. {
  364. mcFaultDect.BOpencnt --;
  365. }
  366. }
  367. if (((mcCurVarible.Max_ic > (mcCurVarible.Max_ia << 1)) || (mcCurVarible.Max_ic > (mcCurVarible.Max_ib << 1)))
  368. && (mcCurVarible.Max_ic > PhaseLossCurrentValue))
  369. {
  370. mcFaultDect.COpencnt++;
  371. }
  372. else
  373. {
  374. if (mcFaultDect.COpencnt > 0)
  375. {
  376. mcFaultDect.COpencnt --;
  377. }
  378. }
  379. mcCurVarible.Max_ia = 0;
  380. mcCurVarible.Max_ib = 0;
  381. mcCurVarible.Max_ic = 0;
  382. SetBit(FOC_CR2, ICLR); //FOC__IA/B/CMAX清零
  383. if ((mcFaultDect.AOpencnt > 3) || (mcFaultDect.BOpencnt > 3) || (mcFaultDect.COpencnt > 3))
  384. {
  385. mcFaultSource = FaultLossPhase;
  386. FaultProcess();
  387. }
  388. }
  389. }
  390. /*******缺相保护恢复*********/
  391. if ((mcFaultSource == FaultLossPhase) && (mcState == mcFault) && (mcProtectTime.LossPHTimes < PhaseProtectRestartTimes)) //可重启5次
  392. {
  393. mcFaultDect.mcLossPHRecCount++;
  394. if (mcFaultDect.mcLossPHRecCount >= PhaseLossRecoverTime)
  395. {
  396. mcProtectTime.LossPHTimes++;
  397. mcFaultSource = FaultNoSource;
  398. }
  399. }
  400. else
  401. {
  402. mcFaultDect.mcLossPHRecCount = 0;
  403. }
  404. }
  405. void Fault_IPMOverTemp(void)
  406. {
  407. if (mcFaultSource == FaultNoSource)
  408. {
  409. if (mcFocCtrl.IPMtemp > TempProtValue)
  410. {
  411. mcFaultDect.OverTempDetecCnt++;
  412. if (mcFaultDect.OverTempDetecCnt > 20)
  413. {
  414. mcFaultDect.OverTempDetecCnt = 0;
  415. mcFaultSource = FaultIpmTemp;
  416. FaultProcess();
  417. }
  418. }
  419. else
  420. {
  421. mcFaultDect.OverTempDetecCnt = 0;
  422. }
  423. }
  424. /*******温度保护恢复*********/
  425. if ((mcState == mcFault) && (mcFaultSource == FaultIpmTemp))
  426. {
  427. if (mcFocCtrl.IPMtemp < TempRecoverValue)
  428. {
  429. mcFaultDect.TempRecoverCnt++;
  430. if (mcFaultDect.TempRecoverCnt > 200)
  431. {
  432. mcFaultSource = FaultNoSource;
  433. mcFaultDect.TempRecoverCnt = 0;
  434. }
  435. }
  436. else
  437. {
  438. mcFaultDect.TempRecoverCnt = 0;
  439. }
  440. }
  441. }
  442. void Fault_TempSensor(void)
  443. {
  444. if (mcFaultSource == FaultNoSource)
  445. {
  446. if ((Huan_temp == 1500) || (Huan_temp == -1000))
  447. {
  448. mcFaultDect.OverHuantempDetecCnt++;
  449. if (mcFaultDect.OverHuantempDetecCnt > 50)
  450. {
  451. mcFaultDect.OverHuantempDetecCnt = 0;
  452. mcFaultSource = FaultHuanTempSensor;
  453. FaultProcess();
  454. }
  455. }
  456. else
  457. {
  458. mcFaultDect.OverHuantempDetecCnt = 0;
  459. }
  460. if ((Guan_temp == 1500) || (Guan_temp == -1000))
  461. {
  462. mcFaultDect.OverGuantempDetecCnt++;
  463. if (mcFaultDect.OverGuantempDetecCnt > 50)
  464. {
  465. mcFaultDect.OverGuantempDetecCnt = 0;
  466. mcFaultSource = FaultGuanTempSensor;
  467. FaultProcess();
  468. }
  469. }
  470. else
  471. {
  472. mcFaultDect.OverGuantempDetecCnt = 0;
  473. }
  474. }
  475. /*******温度保护恢复*********/
  476. if ((mcState == mcFault) && ((mcFaultSource == FaultHuanTempSensor) || (mcFaultSource == FaultGuanTempSensor)))
  477. {
  478. if ((Huan_temp != 1500) && (Huan_temp != -1000))
  479. {
  480. mcFaultDect.HuantempRecoverCnt++;
  481. if (mcFaultDect.HuantempRecoverCnt > 200)
  482. {
  483. mcFaultSource = FaultNoSource;
  484. mcFaultDect.HuantempRecoverCnt = 0;
  485. }
  486. }
  487. else
  488. {
  489. mcFaultDect.HuantempRecoverCnt = 0;
  490. }
  491. if ((Guan_temp != 1500) && (Guan_temp != -1000))
  492. {
  493. mcFaultDect.GuantempRecoverCnt++;
  494. if (mcFaultDect.GuantempRecoverCnt > 200)
  495. {
  496. mcFaultSource = FaultNoSource;
  497. mcFaultDect.GuantempRecoverCnt = 0;
  498. }
  499. }
  500. else
  501. {
  502. mcFaultDect.GuantempRecoverCnt = 0;
  503. }
  504. }
  505. }
  506. /*通信保护*/
  507. void Fault_cummution()
  508. {
  509. if ((mcFaultDect.commu_time >= 30000) && (CummProtectEnable == 1) && (SPEED_MODE == UARTMODE))
  510. {
  511. ConTrolCmd.yajispeed = 0;
  512. ConTrolCmd.fengjispeed = 0;
  513. }
  514. }
  515. /*压机偏置电压错误恢复*/
  516. void IOffsetRecoverEnable()
  517. {
  518. if ((mcFaultSource == FaultIbusOffset) && (mcProtectTime.IbusOffsetProtectTimes < IbusOffsetRestartTimes))
  519. {
  520. mcFaultDect.IbusOffsetRecoverCnt++;
  521. if ((mcFaultDect.IbusOffsetRecoverCnt) >= IbusOffsetRecoverTime)//IbusOffsetRecoverTime*1ms
  522. {
  523. McStaSet.SetFlag.CalibFlag = 0;
  524. mcFaultDect.IbusOffsetRecoverCnt = 0;
  525. mcProtectTime.IbusOffsetProtectTimes++;
  526. mcFaultSource = FaultNoSource;
  527. }
  528. }
  529. }
  530. void Fault_UdcMax_Min(void)
  531. {
  532. if ((mcFaultSource == FaultNoSource) && (mcState == mcRun))
  533. {
  534. if ((mcFocCtrl.mcDcbus_chazhi >= _Q15(120 / HW_BOARD_VOLT_MAX)) && mcFocCtrl.mcDcbus_min <= _Q15(380 / HW_BOARD_VOLT_MAX))
  535. {
  536. mcFaultDect.shurulossCnt++;
  537. if (mcFaultDect.shurulossCnt > 10)
  538. {
  539. mcFaultDect.shurulossCnt = 0;
  540. mcFaultSource = FaultshuruLoss;
  541. FaultProcess();
  542. }
  543. }
  544. else
  545. {
  546. mcFaultDect.shurulossCnt--;
  547. if (mcFaultDect.shurulossCnt <= 0)
  548. {
  549. mcFaultDect.shurulossCnt = 0;
  550. }
  551. }
  552. }
  553. /*******保护恢复*********/
  554. if ((mcState == mcFault) && (mcFaultSource == FaultshuruLoss) && (mcProtectTime.shurulossTimes <= 3))
  555. {
  556. if (((mcFocCtrl.mcDcbus_chazhi) <= _Q15(20 / HW_BOARD_VOLT_MAX)) && mcFocCtrl.mcDcbus_min >= _Q15(500 / HW_BOARD_VOLT_MAX))
  557. {
  558. mcFaultDect.shurulossRecCount++;
  559. if (mcFaultDect.shurulossRecCount > 200)
  560. {
  561. mcProtectTime.shurulossTimes++;
  562. mcFaultSource = FaultNoSource;
  563. mcFaultDect.shurulossRecCount = 0;
  564. }
  565. }
  566. else
  567. {
  568. mcFaultDect.shurulossRecCount = 0;
  569. }
  570. }
  571. }
  572. /*---------------------------------------------------------------------------*/
  573. /* Name : void Fault_Detection(void)
  574. /* Input : NO
  575. /* Output : NO
  576. /* Description: 保护函数,因保护的时间响应不会很高,采用分段处理,每5个定时器中断执行一次对应的保护
  577. 常见保护有过欠压、过温、堵转、启动、缺相等保护,调试时,可根据需求,一个个的调试加入。
  578. /*---------------------------------------------------------------------------*/
  579. void Fault_Detection(void)
  580. {
  581. mcFaultDect.segment++;
  582. if (mcFaultDect.segment >= 7)
  583. {
  584. mcFaultDect.segment = 0;
  585. }
  586. if (mcFaultDect.segment == 0)
  587. {
  588. #if (CurrentRecoverEnable == 1)//过流保护恢复使能
  589. {
  590. Fault_OverCurrentRecover();
  591. }
  592. #endif
  593. }
  594. else if (mcFaultDect.segment == 1)
  595. {
  596. #if (VoltageProtectEnable == 1)//过压保护使能
  597. {
  598. Fault_OverUnderVoltage();
  599. }
  600. #endif
  601. #if (IbusOffsetRecoverEnable) //偏执电压保护恢复
  602. {
  603. IOffsetRecoverEnable();
  604. }
  605. #endif
  606. }
  607. else if (mcFaultDect.segment == 2)
  608. {
  609. #if (StartProtectEnable == 1)//启动保护使能
  610. {
  611. Fault_Start();
  612. }
  613. #endif
  614. }
  615. else if (mcFaultDect.segment == 3)
  616. {
  617. #if (StallProtectEnable == 1)//堵转保护使能
  618. {
  619. Fault_Stall();
  620. }
  621. #endif
  622. }
  623. else if (mcFaultDect.segment == 4)
  624. {
  625. #if (PhaseLossProtectEnable == 1)//缺相保护使能
  626. {
  627. Fault_phaseloss();
  628. }
  629. #endif
  630. }
  631. else if (mcFaultDect.segment == 5)
  632. {
  633. #if (TempProtectEnable == 1)//IPM温度保护
  634. {
  635. Fault_IPMOverTemp();
  636. }
  637. #endif
  638. #if (TempSensorProtectEnable==1)
  639. {
  640. Fault_TempSensor();
  641. }
  642. #endif
  643. }
  644. else
  645. {
  646. #if (CummProtectEnable == 1)//通信保护
  647. {
  648. Fault_cummution();
  649. }
  650. #endif
  651. }
  652. #if (ShuruLossProtectEnable == 1)
  653. {
  654. Fault_UdcMax_Min();
  655. }
  656. #endif
  657. // Fault_Overcurrent(); // 软件过流保护
  658. }
  659. /*PFC偏执保护恢复*/
  660. void PFCOffsetRecoverEnable()
  661. {
  662. if (((PFCFaultSource == PFCFaultIbusOffset) || (PFCFaultSource == PFCFaultHardOVCurrent)) && (PFCFaultDect.IbusOffsetProtectTimes < PFCOffsetRestartTimes))
  663. {
  664. if ((++PFCFaultDect.IbusOffsetRecoverCnt) >= PFCOffsetRecoverTime)//IbusOffsetRecoverTime*1ms
  665. {
  666. PFCFaultDect.IbusOffsetRecoverCnt = 0;
  667. PFCFaultDect.IbusOffsetProtectTimes++;
  668. PFCFaultSource = PFCFaultNoSource;
  669. }
  670. }
  671. }
  672. /*PFC过压保护控制*/
  673. void PFCFault_OverUnderVoltage(void)
  674. {
  675. if (PFCFaultSource == PFCFaultNoSource)
  676. {
  677. if (mcFocCtrl.mcDcbusFlt > PFC_VOLTAGEPROTECT)
  678. {
  679. PFCFaultDect.OverVoltDetecCnt++;
  680. if (PFCFaultDect.OverVoltDetecCnt > 20) //20MS
  681. {
  682. PFCFaultDect.OverVoltDetecCnt = 0;
  683. ClrBit(PFC_CR0, PFCOE); // PFC????
  684. PFCFaultSource = PFCFaultOverVoltage; // pfc??????
  685. PFCSet.OverVoltFlag = 1;
  686. }
  687. }
  688. else
  689. {
  690. if (PFCFaultDect.OverVoltDetecCnt > 0)
  691. {
  692. PFCFaultDect.OverVoltDetecCnt--;
  693. }
  694. }
  695. }
  696. #if (PFC_VOLTAGEPRO_RECOVEREN) //恢复
  697. {
  698. if ((PFCState == PFCFault) && (PFCFaultSource == PFCFaultOverVoltage))
  699. {
  700. if ((mcFocCtrl.mcDcbusFlt < PFC_VOLTAGEPROTECT_RECOVER))
  701. {
  702. PFCFaultDect.VoltRecoverCnt++;
  703. if (PFCFaultDect.VoltRecoverCnt > 2200) //200ms
  704. {
  705. PFCFaultSource = PFCFaultNoSource;
  706. PFCFaultDect.VoltRecoverCnt = 0;
  707. }
  708. }
  709. else
  710. {
  711. PFCFaultDect.VoltRecoverCnt = 0;
  712. }
  713. }
  714. }
  715. #endif
  716. }
  717. /*过流保护*/
  718. void PFCFault_Overcurrent(void)
  719. {
  720. if ((PFCState == PFCRun) && (PFCFaultSource == PFCFaultNoSource))
  721. {
  722. // if(GP03==0)
  723. // {
  724. // PFCFaultDect.CurrentGP03Count++;
  725. // if(PFCFaultDect.CurrentGP03Count>=20000)
  726. // {
  727. // PFCFaultSource=PFCFaultHardOVCurrent;
  728. // PFCFaultDect.CurrentGP03Count=0;
  729. // }
  730. // }
  731. // else
  732. // {
  733. // PFCFaultDect.CurrentGP03Count=0;
  734. // }
  735. if (ReadBit(CMP_CR4, CMP5OUT))
  736. {
  737. PFCFaultSource = PFCFaultHardOVCurrent;
  738. PFCFaultDect.CurrentGP03Count = 0;
  739. }
  740. }
  741. }
  742. void PFCFault_Detection(void)
  743. {
  744. PFCFault_OverUnderVoltage();//过压保护
  745. #if (PFCIOffsetRecoverEnable) //恢复
  746. {
  747. PFCOffsetRecoverEnable();
  748. }
  749. #endif
  750. }