fault_check.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. #include "fault_check.h"
  2. #include "math_tools.h"
  3. #include "motor_control.h"
  4. #include "speed_sensor.h"
  5. #include "usart.h"
  6. #include "can.h"
  7. #include "MC_FOC_Driver.h"
  8. #include "MC_Globals.h"
  9. /*********************************局部函数定义*****************************/
  10. //速度传感器故障检测
  11. void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_CadenceResult_Struct_t CadenceSensor, uint16_t MotorSpeed, MC_AssistRunMode_Struct_t AssistRunMode, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  12. {
  13. static uint32_t TrigTimeCnt_1 = 0;
  14. static uint32_t TrigTimeCnt_2 = 0;
  15. uint16_t DelayTime = 0;
  16. if(p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor == 0)
  17. {
  18. if(AssistRunMode == MC_AssistRunMode_INVALID)
  19. {
  20. TrigTimeCnt_1 = HAL_GetTick();
  21. TrigTimeCnt_2 = HAL_GetTick();
  22. }
  23. //推行助力模式下,检测速度传感器是否产生信号变化
  24. else if(AssistRunMode == MC_AssistRunMode_WALK)
  25. {
  26. if((MotorSpeed > 50) && (IsStopFlag == TRUE))
  27. {
  28. DelayTime = 1650000 / MotorSpeed;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (电机转速 / (4.55 * 2.4) * 0.8) s, 延长2圈时间
  29. DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
  30. if((HAL_GetTick() - TrigTimeCnt_1) > DelayTime)
  31. {
  32. p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
  33. return;
  34. }
  35. }
  36. else
  37. {
  38. TrigTimeCnt_1 = HAL_GetTick();
  39. }
  40. }
  41. //骑行状态下,检测速度传感器是否产生信号变化
  42. else
  43. {
  44. if((CadenceSensor.Cadence_Data >= 5) && (CadenceSensor.Cadence_Dir == MC_Cadence_Forward) && (IsStopFlag == TRUE))
  45. {
  46. DelayTime = 150000 / CadenceSensor.Cadence_Data;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (踏频 * 0.8) s, 延长2圈时间
  47. DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
  48. if((HAL_GetTick() - TrigTimeCnt_2) > DelayTime)
  49. {
  50. p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
  51. return;
  52. }
  53. }
  54. else
  55. {
  56. TrigTimeCnt_2 = HAL_GetTick();
  57. }
  58. }
  59. }
  60. }
  61. //力矩传感器故障检测
  62. void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt, MC_CadenceResult_Struct_t CadenceData, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  63. {
  64. static uint32_t TrigTimeCnt_1 = 0;
  65. static uint32_t TrigTimeCnt_2 = 0;
  66. static uint16_t TorqueArray[10] = {0};
  67. static uint32_t DiffSqrtResult = 0;
  68. uint16_t i;
  69. uint16_t DelayTime;
  70. if(HAL_GetTick() < 2000)
  71. {
  72. TrigTimeCnt_1 = HAL_GetTick();
  73. TrigTimeCnt_2 = HAL_GetTick();
  74. }
  75. for(i=0; i<(sizeof(TorqueArray) / 2 - 1); i++)
  76. {
  77. TorqueArray[i] = TorqueArray[i + 1];
  78. }
  79. TorqueArray[sizeof(TorqueArray) / 2 - 1] = ADC_Data;
  80. if(p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor == 0)
  81. {
  82. DiffSqrtResult = GetStandardDeviation(TorqueArray, sizeof(TorqueArray) / 2);
  83. //传感器感应失效检测,进入助力模式、踏频正转大于10rpm、均方差值较小
  84. if(((GearSt != 0x22) && ((GearSt & 0x0F) != 0)) && (CadenceData.Cadence_Data > 10) && (CadenceData.Cadence_Dir == MC_Cadence_Forward) && (DiffSqrtResult < 5))
  85. {
  86. DelayTime = 15000 / CadenceData.Cadence_Data; //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
  87. DelayTime = (DelayTime < 250) ? 250 : DelayTime;
  88. if((HAL_GetTick() - TrigTimeCnt_1) > DelayTime)
  89. {
  90. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  91. return;
  92. }
  93. }
  94. else
  95. {
  96. TrigTimeCnt_1 = HAL_GetTick();
  97. }
  98. //传感器短路或开路检测
  99. if((ADC_Data < 50) || (ADC_Data > 4050))
  100. {
  101. if((HAL_GetTick() - TrigTimeCnt_2) > 200)
  102. {
  103. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  104. return;
  105. }
  106. }
  107. else
  108. {
  109. TrigTimeCnt_2 = HAL_GetTick();
  110. }
  111. }
  112. }
  113. //缺相检测
  114. void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16_t MotorSpeed, ADC_3ShuntCurrent_Struct_t Phase_Current, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  115. {
  116. static uint32_t TrigTimeCnt_PhaseA = 0;
  117. static uint32_t TrigTimeCnt_PhaseB = 0;
  118. static uint32_t TrigTimeCnt_PhaseC = 0;
  119. if(p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine == 0)
  120. {
  121. if((Foc_Flag == SET) && (BusCurrent > 1000) && (MotorSpeed > 100))
  122. {
  123. //A相电流
  124. if(abs(Phase_Current.uw_phase_a) < 100)
  125. {
  126. if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 250)
  127. {
  128. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  129. return;
  130. }
  131. }
  132. else
  133. {
  134. TrigTimeCnt_PhaseA = HAL_GetTick();
  135. }
  136. //B相电流
  137. if(abs(Phase_Current.uw_phase_b) < 100)
  138. {
  139. if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 250)
  140. {
  141. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  142. return;
  143. }
  144. }
  145. else
  146. {
  147. TrigTimeCnt_PhaseB = HAL_GetTick();
  148. }
  149. //C相电流
  150. if(abs(Phase_Current.uw_phase_c) < 100)
  151. {
  152. if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 250)
  153. {
  154. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  155. return;
  156. }
  157. }
  158. else
  159. {
  160. TrigTimeCnt_PhaseC = HAL_GetTick();
  161. }
  162. }
  163. else if(Foc_Flag == RESET)
  164. {
  165. TrigTimeCnt_PhaseA = HAL_GetTick();
  166. TrigTimeCnt_PhaseB = HAL_GetTick();
  167. TrigTimeCnt_PhaseC = HAL_GetTick();
  168. }
  169. }
  170. }
  171. //温度传感器故障检测
  172. void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Roil_Result, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  173. {
  174. static uint32_t TrigTimeCnt_PCB = 0; //PCB NTC采集异常计时
  175. static uint32_t TrigTimeCnt_Roil = 0; //绕组 NTC采集异常计时
  176. static uint32_t NTC_Check_PeriodTimeCnt = 0; //NTC检测,母线电流采集周期
  177. static uint16_t NTC_Check_Count = 0;
  178. static uint32_t BusCurrentSum = 0;
  179. uint8_t BusCurrentAvg = 0;
  180. static uint8_t T_PCB_Old = 0;
  181. static uint8_t T_Roil_Old = 0;
  182. //为初始化预留1s
  183. if((HAL_GetTick() < 1000) || (MC_RunInfo.T_MCU > 90))//50度以上,不检测NTC故障
  184. {
  185. TrigTimeCnt_PCB = HAL_GetTick();
  186. TrigTimeCnt_PCB = HAL_GetTick();
  187. T_PCB_Old = T_PCB_Result;
  188. T_Roil_Old = T_Roil_Result;
  189. if(HAL_GetTick() < 1000)
  190. {
  191. NTC_Check_PeriodTimeCnt = HAL_GetTick();
  192. return;
  193. }
  194. }
  195. if(p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor == 0)
  196. {
  197. //PCB上NTC短路或开路检测,判断AD值是否为异常值
  198. if((T_PCB_Result < 20) || (T_PCB_Result > 140))//20:AD为3812,140:AD为227
  199. {
  200. if((HAL_GetTick() - TrigTimeCnt_PCB) > 200)
  201. {
  202. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  203. return;
  204. }
  205. }
  206. else
  207. {
  208. TrigTimeCnt_PCB = HAL_GetTick();
  209. }
  210. //NTC短路或开路检测,判断AD值是否为异常值
  211. if(((T_Roil_Result < 20) || (T_Roil_Result > 140)) ||
  212. ((T_PCB_Result < 20) || (T_PCB_Result > 140))
  213. )
  214. {
  215. if((HAL_GetTick() - TrigTimeCnt_Roil) > 200)
  216. {
  217. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  218. return;
  219. }
  220. }
  221. else
  222. {
  223. TrigTimeCnt_Roil = HAL_GetTick();
  224. }
  225. //NTC为固定值的检测,检测3min内母线电流平均值 > 5A 时的前后温差
  226. if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
  227. {
  228. NTC_Check_PeriodTimeCnt = HAL_GetTick();
  229. BusCurrentSum += MC_RunInfo.BusCurrent >> 7;//按照mA / 128 判断,约0.1A
  230. NTC_Check_Count++;
  231. //采集100 * 2048 = 204.8s内母线电流平均值
  232. if(NTC_Check_Count >= 2048)
  233. {
  234. NTC_Check_Count = 0;
  235. BusCurrentAvg = BusCurrentSum >> 11;
  236. BusCurrentSum = 0;
  237. //平均电流超过5A,判断是否有温升
  238. if(BusCurrentAvg > 39) // 39 * 1.28 = 50
  239. {
  240. if((abs(T_PCB_Result - T_PCB_Old) < 2) || //PCB 温升低于2度
  241. (abs(T_Roil_Result - T_Roil_Old) < 2)) //绕组温升低于2度
  242. {
  243. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  244. return;
  245. }
  246. }
  247. T_PCB_Old = T_PCB_Result;
  248. T_Roil_Old = T_Roil_Result;
  249. }
  250. }
  251. }
  252. }
  253. //踏频传感器故障检测
  254. void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  255. {
  256. static uint8_t Hall_1_Trg = 0; //霍尔1信号变化标志
  257. static uint8_t Hall_1_Cont = 0;//霍尔1状态
  258. static uint32_t Hall_1_Fault_TrigTimeCnt = 0;
  259. static uint8_t Hall_2_Trg = 0; //霍尔2信号变化标志
  260. static uint8_t Hall_2_Cont = 0;//霍尔2状态
  261. static uint32_t Hall_2_Fault_TrigTimeCnt = 0;
  262. static uint8_t Hall_1_2_EQA_Flag = 1;
  263. static uint32_t Hall_1_2_EQA_TrigTimeCnt = 0;
  264. uint8_t Hall_1_State;
  265. uint8_t Hall_2_State;
  266. Hall_1_State = HAL_GPIO_ReadPin(CADENCE_1_GPIO_Port, CADENCE_1_Pin);
  267. Hall_2_State = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
  268. //更新霍尔1信号变化状态
  269. Hall_1_Trg = Hall_1_State ^ Hall_1_Cont;
  270. Hall_1_Cont = Hall_1_State;
  271. //更新霍尔2信号变化状态
  272. Hall_2_Trg = Hall_2_State ^ Hall_2_Cont;
  273. Hall_2_Cont = Hall_2_State;
  274. //更新霍尔1和霍尔2相同标志
  275. Hall_1_2_EQA_Flag = Hall_1_State ^ Hall_2_State;
  276. if(HAL_GetTick() < 1000)
  277. {
  278. Hall_1_Fault_TrigTimeCnt = HAL_GetTick();
  279. Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
  280. Hall_1_2_EQA_TrigTimeCnt = HAL_GetTick();
  281. return;
  282. }
  283. if(p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor == 0)
  284. {
  285. //两个霍尔传感器分别检测是否存在开路或短路
  286. if((Torque > 1000) && (BikeSpeed > 50))
  287. {
  288. //判断霍尔1
  289. if(Hall_1_Trg == 0)
  290. {
  291. if((HAL_GetTick() - Hall_1_Fault_TrigTimeCnt) > 300)
  292. {
  293. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  294. return;
  295. }
  296. }
  297. else
  298. {
  299. Hall_1_Fault_TrigTimeCnt = HAL_GetTick();
  300. }
  301. //判断霍尔2
  302. if(Hall_2_Trg == 0)
  303. {
  304. if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 300)
  305. {
  306. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  307. return;
  308. }
  309. }
  310. else
  311. {
  312. Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
  313. }
  314. //判断霍尔1和霍尔2黏连
  315. if(Hall_1_2_EQA_Flag == 0)
  316. {
  317. if((HAL_GetTick() - Hall_1_2_EQA_TrigTimeCnt) > 300)
  318. {
  319. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  320. return;
  321. }
  322. }
  323. else
  324. {
  325. Hall_1_2_EQA_TrigTimeCnt = HAL_GetTick();
  326. }
  327. }
  328. else
  329. {
  330. Hall_1_Fault_TrigTimeCnt = HAL_GetTick();
  331. Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
  332. Hall_1_2_EQA_TrigTimeCnt = HAL_GetTick();
  333. }
  334. }
  335. }
  336. //指拨故障检测
  337. void MC_Fault_GasSensor_Process(uint16_t ADC_Data, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  338. {
  339. //开路检测
  340. //...
  341. //短路检测
  342. //...
  343. }
  344. //MOS短路检测
  345. void MC_Fault_MOS_Process(ADC_3ShuntCurrent_Struct_t ShuntCurrent, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  346. {
  347. static uint32_t TrigTimeCnt_A = 0;
  348. static uint32_t TrigTimeCnt_B = 0;
  349. static uint32_t TrigTimeCnt_C = 0;
  350. if(FOC_Status != FOC_Status_RUN)
  351. {
  352. TrigTimeCnt_A = HAL_GetTick();
  353. TrigTimeCnt_B = HAL_GetTick();
  354. TrigTimeCnt_C = HAL_GetTick();
  355. return;
  356. }
  357. if(p_MC_ErrorCode->ERROR_Bit.Fault_MOS == 0)
  358. {
  359. //A相MOS短路
  360. if(abs(ShuntCurrent.uw_phase_a) > 20000)
  361. {
  362. if((HAL_GetTick() - TrigTimeCnt_A) > 200)
  363. {
  364. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  365. return;
  366. }
  367. }
  368. else
  369. {
  370. TrigTimeCnt_A = HAL_GetTick();
  371. }
  372. //B相MOS短路
  373. if(abs(ShuntCurrent.uw_phase_b) > 20000)
  374. {
  375. if((HAL_GetTick() - TrigTimeCnt_B) > 200)
  376. {
  377. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  378. return;
  379. }
  380. }
  381. else
  382. {
  383. TrigTimeCnt_B = HAL_GetTick();
  384. }
  385. //C相MOS短路
  386. if(abs(ShuntCurrent.uw_phase_c) > 20000)
  387. {
  388. if((HAL_GetTick() - TrigTimeCnt_C) > 200)
  389. {
  390. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  391. return;
  392. }
  393. }
  394. else
  395. {
  396. TrigTimeCnt_C = HAL_GetTick();
  397. }
  398. }
  399. }
  400. //TE故障检测
  401. void MC_Fault_TE_Process(MC_TE_SensorStatus_Struct_t* p_MC_TE_SensorStatus, TrueOrFalse_Flag_Struct_t ComOK_Flag, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  402. {
  403. static uint32_t TrigTimeCnt_Com = 0;
  404. static uint32_t TrigTimeCnt_Sensor = 0;
  405. static uint32_t DelayTimeCnt_Sensor = 0;
  406. static FlagStatus SensorCheckFault_Falg = RESET;
  407. static FlagStatus TE_ComFault_Flag = RESET;
  408. static FlagStatus TE_SyncClockFault_Flag = RESET;
  409. //传感器检测异常判断
  410. if(SensorCheckFault_Falg == RESET)
  411. {
  412. if((p_MC_TE_SensorStatus->TE_ErrorCode.Code != 0) || (p_MC_TE_SensorStatus->MCU_Voltage > 3800)) //存在传感器检测异常,或主MCU工作电压大于4.2V
  413. {
  414. if((HAL_GetTick() - TrigTimeCnt_Sensor) > 1000)
  415. {
  416. SensorCheckFault_Falg = SET;
  417. }
  418. }
  419. else
  420. {
  421. TrigTimeCnt_Sensor = HAL_GetTick();
  422. }
  423. }
  424. //传感器检测异常恢复判断
  425. else
  426. {
  427. if((p_MC_TE_SensorStatus->TE_ErrorCode.Code == 0) && (p_MC_TE_SensorStatus->MCU_Voltage < 3600))
  428. {
  429. if((HAL_GetTick() - DelayTimeCnt_Sensor) > 1000)
  430. {
  431. SensorCheckFault_Falg = RESET;
  432. }
  433. }
  434. else
  435. {
  436. DelayTimeCnt_Sensor = HAL_GetTick();
  437. }
  438. }
  439. //TE通信异常判断
  440. if(TE_ComFault_Flag == RESET)
  441. {
  442. if(ComOK_Flag == FALSE)
  443. {
  444. if((HAL_GetTick() - TrigTimeCnt_Com) > 3000)
  445. {
  446. TE_ComFault_Flag = SET;
  447. }
  448. }
  449. else
  450. {
  451. TrigTimeCnt_Com = HAL_GetTick();
  452. }
  453. }
  454. //TE通信异常恢复判断
  455. else
  456. {
  457. if(ComOK_Flag == TRUE)
  458. {
  459. TE_ComFault_Flag = RESET;
  460. }
  461. }
  462. // //TE时钟判断
  463. // if( (MC_TE_SyncClockFreqScan < (p_MC_TE_SensorStatus->SyncClockFreq - 200))
  464. // ||(MC_TE_SyncClockFreqScan > (p_MC_TE_SensorStatus->SyncClockFreq + 200)))
  465. // {
  466. // TE_SyncClockFault_Flag = SET;
  467. // }
  468. // else
  469. // {
  470. // TE_SyncClockFault_Flag = RESET;
  471. // }
  472. //故障码输出
  473. if((SensorCheckFault_Falg == RESET) && (TE_ComFault_Flag == RESET) && (TE_SyncClockFault_Flag == RESET))
  474. {
  475. p_MC_ErrorCode->ERROR_Bit.Fault_MCU = 0;
  476. }
  477. else
  478. {
  479. if(SensorCheckFault_Falg == SET)
  480. {
  481. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1; //认为电路故障
  482. }
  483. if((TE_ComFault_Flag == SET) || (TE_SyncClockFault_Flag == SET)) //认为MCU故障
  484. {
  485. p_MC_ErrorCode->ERROR_Bit.Fault_MCU = 1;
  486. }
  487. }
  488. }
  489. void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  490. {
  491. static uint32_t PeriodTimeCnt = 0;
  492. static uint32_t C31_SC_TrigTimeCnt = 0;//C32 短路判断计时
  493. static uint32_t PowerDriver_TrigTimeCnt = 0; //驱动电源判断计时
  494. //为初始化预留3s
  495. if(HAL_GetTick() < 5000)
  496. {
  497. PeriodTimeCnt = HAL_GetTick();
  498. C31_SC_TrigTimeCnt = HAL_GetTick();
  499. PowerDriver_TrigTimeCnt = HAL_GetTick();
  500. return;
  501. }
  502. //C31(GearSensor)短路检测
  503. if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15) == GPIO_PIN_RESET)
  504. {
  505. if((HAL_GetTick() - C31_SC_TrigTimeCnt) > 5000)
  506. {
  507. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  508. }
  509. }
  510. else
  511. {
  512. C31_SC_TrigTimeCnt = HAL_GetTick();
  513. }
  514. //MOS驱动电源异常检测
  515. if((FOC_Status == FOC_Status_RUN) &&
  516. (MC_CalParam.AssistRunMode != MC_AssistRunMode_INVALID) &&
  517. (MC_CalParam.Foc_Flag == SET) &&
  518. ((MC_CalParam.Ref_Speed > 100) || (MC_CalParam.Ref_Torque > 100))
  519. )
  520. {
  521. if((MC_RunInfo.MotorSpeed < 5) && (MC_RunInfo.BusCurrent < 2000))
  522. {
  523. if((HAL_GetTick() - PowerDriver_TrigTimeCnt) > 3000)
  524. {
  525. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  526. }
  527. }
  528. else
  529. {
  530. PowerDriver_TrigTimeCnt = HAL_GetTick();
  531. }
  532. }
  533. else
  534. {
  535. PowerDriver_TrigTimeCnt = HAL_GetTick();
  536. }
  537. //以下指令执行周期20ms
  538. if((HAL_GetTick() - PeriodTimeCnt) >= 20)
  539. {
  540. PeriodTimeCnt = HAL_GetTick();
  541. //检测母线电流和相电流是否为异常
  542. static uint8_t i = 0, CurrentFaultCount = 0;
  543. static uint32_t BusCurrent_Flt = 0, PhasesCurrentA_Flt = 0, PhasesCurrentB_Flt = 0, PhasesCurrentC_Flt = 0;
  544. #if 1 //正常运行
  545. BusCurrent_Flt += ADC1_Result_Filt[ADC1_RANK_CURRENT];
  546. #elif 1 //模拟母线电流采样为固定值
  547. BusCurrent_Flt += 2048;
  548. #endif
  549. PhasesCurrentA_Flt += ADC2_Result_Filt[ADC2_RANK_CURRENT_A];
  550. PhasesCurrentB_Flt += ADC2_Result_Filt[ADC2_RANK_CURRENT_B];
  551. PhasesCurrentC_Flt += ADC2_Result_Filt[ADC2_RANK_CURRENT_C];
  552. i++;
  553. if(i >= 32) //计算20 * 32 ms内的平均值
  554. {
  555. i = 0;
  556. if((((BusCurrent_Flt >> 5) < 500) || (BusCurrent_Flt >> 5) > 4000) ||//母线电流采样异常
  557. (((PhasesCurrentA_Flt >> 5) < 8000) || ((PhasesCurrentA_Flt >> 5) > 60000)) || //A相电流采样异常
  558. (((PhasesCurrentB_Flt >> 5) < 8000) || ((PhasesCurrentB_Flt >> 5) > 60000)) || //B相电流采样异常
  559. (((PhasesCurrentC_Flt >> 5) < 8000) || ((PhasesCurrentC_Flt >> 5) > 60000)) //C相电流采样异常
  560. )
  561. {
  562. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  563. }
  564. if((IqFdbFlt >> 10) > 200)
  565. {
  566. if(((BusCurrent_Flt >> 5) - uw_current_offset) < 50) //50对应的母线电流约1.2A
  567. {
  568. CurrentFaultCount++;
  569. if(CurrentFaultCount > 10)
  570. {
  571. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  572. CurrentFaultCount = 0;
  573. }
  574. }
  575. else
  576. {
  577. CurrentFaultCount = 0;
  578. }
  579. }
  580. else
  581. {
  582. CurrentFaultCount = 0;
  583. }
  584. BusCurrent_Flt = 0;
  585. PhasesCurrentA_Flt = 0;
  586. PhasesCurrentB_Flt = 0;
  587. PhasesCurrentC_Flt = 0;
  588. }
  589. //静止状态,检测母线电流和相电流是否随机跳动
  590. static uint8_t j = 0;
  591. static uint16_t BusCurrent_Array[50], PhaseCurrentA_Array[50], PhaseCurrentB_Array[50], PhaseCurrentC_Array[50];
  592. static uint32_t DiffSqrtResult_BusCurrent = 0, DiffSqrtResult_PhaseA = 0, DiffSqrtResult_PhaseB = 0, DiffSqrtResult_PhaseC = 0;
  593. static uint32_t DelayTimeCnt = 0;
  594. if((MC_RunInfo.GearSt == 0) && (MC_RunInfo.MotorSpeed == 0))
  595. {
  596. if((HAL_GetTick() - DelayTimeCnt) > 3000) // 由运动转为静止3s后进行判断
  597. {
  598. BusCurrent_Array[j] = ADC1_Result_Filt[ADC1_RANK_CURRENT];
  599. PhaseCurrentA_Array[j] = ADC2_Result_Filt[ADC2_RANK_CURRENT_A];
  600. PhaseCurrentB_Array[j] = ADC2_Result_Filt[ADC2_RANK_CURRENT_B];
  601. PhaseCurrentC_Array[j] = ADC2_Result_Filt[ADC2_RANK_CURRENT_C];
  602. j++;
  603. if(j >= 50)
  604. {
  605. j = 0;
  606. //计算均方差值
  607. DiffSqrtResult_BusCurrent = GetStandardDeviation(BusCurrent_Array, 50);
  608. DiffSqrtResult_PhaseA = GetStandardDeviation(PhaseCurrentA_Array, 50);
  609. DiffSqrtResult_PhaseB = GetStandardDeviation(PhaseCurrentB_Array, 50);
  610. DiffSqrtResult_PhaseC = GetStandardDeviation(PhaseCurrentC_Array, 50);
  611. if((DiffSqrtResult_BusCurrent > 500) || //母线电流采集异常变化
  612. ((DiffSqrtResult_PhaseA > 12000) || (DiffSqrtResult_PhaseB > 12000) || (DiffSqrtResult_PhaseC > 12000)) //相线电流采集异常变化
  613. )
  614. {
  615. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  616. }
  617. }
  618. }
  619. }
  620. else
  621. {
  622. j = 0;
  623. DelayTimeCnt = HAL_GetTick();
  624. }
  625. }
  626. }
  627. /***********************全局函数定义***********************/
  628. //霍尔传感器故障检测
  629. void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  630. {
  631. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  632. static uint32_t TrigTimeCnt_1 = 0;//用于检测霍尔全部短路或开路检测延时判断
  633. static uint8_t HallGroupOldBak[6];//用于单个霍尔故障判断霍尔状态缓存
  634. static uint8_t Count = 0;
  635. static uint32_t TrigCnt_2 = 0;//用于单个霍尔故障次数计数
  636. if(IsFirstEnterFlag == TRUE)
  637. {
  638. TrigTimeCnt_1 = HAL_GetTick();
  639. memset(HallGroupOldBak, HallSensorStatus.HallGropuStatus_Old, sizeof(HallGroupOldBak));
  640. IsFirstEnterFlag = FALSE;
  641. }
  642. if(p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor == 0)
  643. {
  644. //霍尔传感器全部短路或开路检测
  645. if((HallSensorStatus.HallGropuStatus == 0x00) || (HallSensorStatus.HallGropuStatus == 0x07))
  646. {
  647. if((HAL_GetTick() - TrigTimeCnt_1) > 200)
  648. {
  649. p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
  650. return;
  651. }
  652. }
  653. else
  654. {
  655. TrigTimeCnt_1 = HAL_GetTick();
  656. }
  657. //相邻黏连检测和单个短、开路检测
  658. if(HallSensorStatus.HallGropuStatus != HallSensorStatus.HallGropuStatus_Old)
  659. {
  660. HallGroupOldBak[Count++] = HallSensorStatus.HallGropuStatus;
  661. if(Count >= 6)
  662. {
  663. Count = 0;
  664. //检测是否有霍尔异常
  665. if(CheckIsHasDouble(HallGroupOldBak, sizeof(HallGroupOldBak)) == TRUE)
  666. {
  667. TrigCnt_2++;
  668. }
  669. else
  670. {
  671. TrigCnt_2 = 0;
  672. }
  673. if(TrigCnt_2 > 20)
  674. {
  675. p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
  676. return;
  677. }
  678. }
  679. }
  680. }
  681. }
  682. //故障检测
  683. void MC_Fault_Check_Process(void)
  684. {
  685. //速度传感器故障检测
  686. if(MC_WorkMode == MC_WorkMode_Run)
  687. {
  688. MC_Fault_SpeedSensor_Process(MC_SpeedSensorData.IsStopFlag, MC_CadenceResult, MC_RunInfo.MotorSpeed, MC_CalParam.AssistRunMode, &MC_ErrorCode);
  689. }
  690. //力矩传感器故障检测
  691. MC_Fault_TorqueSensor_Process(ADC1_Result[ADC1_RANK_TORQUE_SENSOR], MC_ControlCode.GearSt, MC_CadenceResult, &MC_ErrorCode);
  692. //相线故障检测
  693. MC_Fault_PhaseLine_Process(MC_CalParam.Foc_Flag, MC_RunInfo.BusCurrent, MC_RunInfo.MotorSpeed, ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
  694. //温度传感器故障检测
  695. MC_Fault_NTCSensor_Process(MC_RunInfo.T_PCB, MC_RunInfo.T_Roil, &MC_ErrorCode);
  696. //踏频传感器故障检测
  697. MC_Fault_CadenceSensor_Process(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
  698. //指拨故障检测
  699. MC_Fault_GasSensor_Process(ADC1_Result[ADC1_RANK_GAS], &MC_ErrorCode);
  700. //MOS故障检测
  701. MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
  702. //TE故障检测
  703. MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE, &MC_ErrorCode);
  704. //电路故障检测
  705. MC_Fault_Circuit_Process(&MC_ErrorCode);
  706. }