fault_check.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. #include "fault_check.h"
  2. #include "math_tools.h"
  3. #include "motor_control.h"
  4. #include "hall_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(uint16_t BikeSpeed, 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) && (BikeSpeed == 0))
  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) && (BikeSpeed == 0))
  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, uint16_t Cadence, 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 Array[10] = {0};
  67. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  68. uint16_t i;
  69. if(IsFirstEnterFlag == TRUE)
  70. {
  71. IsFirstEnterFlag = FALSE;
  72. TrigTimeCnt_1 = 0;
  73. TrigTimeCnt_2 = 0;
  74. }
  75. for(i=0; i<(sizeof(Array) / 2 - 1); i++)
  76. {
  77. Array[i] = Array[i + 1];
  78. }
  79. Array[sizeof(Array) / 2 - 1] = ADC_Data;
  80. if(p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor == 0)
  81. {
  82. //传感器感应失效检测
  83. if(((GearSt & 0x0F) != 0) && (Cadence > 5) && (GetStandardDeviation(Array, sizeof(Array) / 2) < 2))
  84. {
  85. if((HAL_GetTick() - TrigTimeCnt_1) > 5000)
  86. {
  87. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  88. return;
  89. }
  90. }
  91. else
  92. {
  93. TrigTimeCnt_1 = HAL_GetTick();
  94. }
  95. //传感器短路或开路检测
  96. if((ADC_Data < 50) || (ADC_Data > 4050))
  97. {
  98. if((HAL_GetTick() - TrigTimeCnt_2) > 200)
  99. {
  100. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  101. return;
  102. }
  103. }
  104. else
  105. {
  106. TrigTimeCnt_2 = HAL_GetTick();
  107. }
  108. }
  109. }
  110. //相线故障检测
  111. void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, ADC_3ShuntCurrent_Struct_t Phase_Current, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  112. {
  113. static uint32_t TrigTimeCnt_PhaseA = 0;
  114. static uint32_t TrigTimeCnt_PhaseB = 0;
  115. static uint32_t TrigTimeCnt_PhaseC = 0;
  116. if(p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine == 0)
  117. {
  118. if((Foc_Flag == SET) && (BusCurrent > 1000))
  119. {
  120. //A相电流
  121. if(abs(Phase_Current.uw_phase_a) < 25)
  122. {
  123. if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 200)
  124. {
  125. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  126. return;
  127. }
  128. }
  129. else
  130. {
  131. TrigTimeCnt_PhaseA = HAL_GetTick();
  132. }
  133. //B相电流
  134. if(abs(Phase_Current.uw_phase_b) < 25)
  135. {
  136. if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 200)
  137. {
  138. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  139. return;
  140. }
  141. }
  142. else
  143. {
  144. TrigTimeCnt_PhaseB = HAL_GetTick();
  145. }
  146. //C相电流
  147. if(abs(Phase_Current.uw_phase_c) < 25)
  148. {
  149. if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 200)
  150. {
  151. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  152. return;
  153. }
  154. }
  155. else
  156. {
  157. TrigTimeCnt_PhaseC = HAL_GetTick();
  158. }
  159. }
  160. else if(Foc_Flag == RESET)
  161. {
  162. TrigTimeCnt_PhaseA = HAL_GetTick();
  163. TrigTimeCnt_PhaseB = HAL_GetTick();
  164. TrigTimeCnt_PhaseC = HAL_GetTick();
  165. }
  166. }
  167. }
  168. //温度传感器故障检测
  169. void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Roil_Result, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  170. {
  171. static uint32_t TrigTimeCnt_PCB = 0;
  172. static uint32_t TrigTimeCnt_Roil = 0;
  173. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  174. if(IsFirstEnterFlag == TRUE)
  175. {
  176. IsFirstEnterFlag = FALSE;
  177. TrigTimeCnt_PCB = HAL_GetTick();
  178. TrigTimeCnt_PCB = HAL_GetTick();
  179. }
  180. //为初始化预留1s
  181. if((HAL_GetTick() < 1000))
  182. {
  183. return;
  184. }
  185. //60度以上,不检测NTC故障
  186. if(MC_RunInfo.T_MCU > 100)
  187. {
  188. return;
  189. }
  190. if(p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor == 0)
  191. {
  192. //PCB上NTC短路或开路检测
  193. if((T_PCB_Result < 20) || (T_PCB_Result > 140))
  194. {
  195. if((HAL_GetTick() - TrigTimeCnt_PCB) > 200)
  196. {
  197. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  198. return;
  199. }
  200. }
  201. else
  202. {
  203. TrigTimeCnt_PCB = HAL_GetTick();
  204. }
  205. //绕组上NTC短路或开路检测
  206. if((T_Roil_Result < 20) || (T_Roil_Result > 140))
  207. {
  208. if((HAL_GetTick() - TrigTimeCnt_Roil) > 200)
  209. {
  210. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  211. return;
  212. }
  213. }
  214. else
  215. {
  216. TrigTimeCnt_Roil = HAL_GetTick();
  217. }
  218. }
  219. }
  220. //踏频传感器故障检测
  221. void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  222. {
  223. static MC_CadenceSensorStatus_Struct_t CadenceSensorStatus;
  224. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  225. static uint32_t TrigTimeCnt_1 = 0;
  226. static uint32_t TrigTimeCnt_2 = 0;
  227. static TrueOrFalse_Flag_Struct_t TrigFlag = FALSE;
  228. CadenceSensorStatus.HallGropuStatus = Cadence_ReadHallState();
  229. if(IsFirstEnterFlag == TRUE)
  230. {
  231. CadenceSensorStatus.HallGropuStatus_Old = CadenceSensorStatus.HallGropuStatus;
  232. TrigTimeCnt_1 = HAL_GetTick();
  233. TrigTimeCnt_2 = HAL_GetTick();
  234. IsFirstEnterFlag = FALSE;
  235. }
  236. if(p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor == 0)
  237. {
  238. //两个霍尔传感器同时检测,包含两个同时短路、开路及黏连
  239. if((Torque > 1000) && (BikeSpeed > 100))
  240. {
  241. if((CadenceSensorStatus.HallGropuStatus == 0x00) || (CadenceSensorStatus.HallGropuStatus == 0x03))
  242. {
  243. if((HAL_GetTick() - TrigTimeCnt_1) > 200)
  244. {
  245. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  246. return;
  247. }
  248. }
  249. else
  250. {
  251. TrigTimeCnt_1 = HAL_GetTick();
  252. }
  253. }
  254. else
  255. {
  256. TrigTimeCnt_1 = HAL_GetTick();
  257. }
  258. if(CadenceSensorStatus.HallGropuStatus != CadenceSensorStatus.HallGropuStatus_Old)
  259. {
  260. //单个霍尔传感器检测
  261. if((CadenceSensorStatus.HallGropuStatus != ForwardDir_EncoderData[CadenceSensorStatus.HallGropuStatus_Old]) && //不满足正转编码表
  262. (CadenceSensorStatus.HallGropuStatus != BackwardDir_EncoderData[CadenceSensorStatus.HallGropuStatus_Old])) //不满足反转编码表
  263. {
  264. if(TrigFlag == FALSE)
  265. {
  266. TrigTimeCnt_2 = HAL_GetTick();
  267. TrigFlag = TRUE;
  268. }
  269. if((HAL_GetTick() - TrigTimeCnt_2) > 200)
  270. {
  271. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  272. return;
  273. }
  274. }
  275. else
  276. {
  277. TrigFlag = FALSE;
  278. }
  279. }
  280. }
  281. CadenceSensorStatus.HallGropuStatus_Old = CadenceSensorStatus.HallGropuStatus;
  282. }
  283. //指拨故障检测
  284. void MC_Fault_GasSensor_Process(uint16_t ADC_Data, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  285. {
  286. //开路检测
  287. //...
  288. //短路检测
  289. //...
  290. }
  291. //MOS故障检测
  292. void MC_Fault_MOS_Process(ADC_3ShuntCurrent_Struct_t ShuntCurrent, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  293. {
  294. static uint32_t TrigTimeCnt_A = 0;
  295. static uint32_t TrigTimeCnt_B = 0;
  296. static uint32_t TrigTimeCnt_C = 0;
  297. if(FOC_Status != FOC_Status_RUN)
  298. {
  299. TrigTimeCnt_A = HAL_GetTick();
  300. TrigTimeCnt_B = HAL_GetTick();
  301. TrigTimeCnt_C = HAL_GetTick();
  302. return;
  303. }
  304. if(p_MC_ErrorCode->ERROR_Bit.Fault_MOS == 0)
  305. {
  306. //A相MOS短路
  307. if(abs(ShuntCurrent.uw_phase_a) > 20000)
  308. {
  309. if((HAL_GetTick() - TrigTimeCnt_A) > 200)
  310. {
  311. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  312. return;
  313. }
  314. }
  315. else
  316. {
  317. TrigTimeCnt_A = HAL_GetTick();
  318. }
  319. //B相MOS短路
  320. if(abs(ShuntCurrent.uw_phase_b) > 20000)
  321. {
  322. if((HAL_GetTick() - TrigTimeCnt_B) > 200)
  323. {
  324. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  325. return;
  326. }
  327. }
  328. else
  329. {
  330. TrigTimeCnt_B = HAL_GetTick();
  331. }
  332. //C相MOS短路
  333. if(abs(ShuntCurrent.uw_phase_c) > 20000)
  334. {
  335. if((HAL_GetTick() - TrigTimeCnt_C) > 200)
  336. {
  337. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  338. return;
  339. }
  340. }
  341. else
  342. {
  343. TrigTimeCnt_C = HAL_GetTick();
  344. }
  345. }
  346. }
  347. //TE故障检测
  348. 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)
  349. {
  350. static uint32_t TrigTimeCnt_Com = 0;
  351. static uint32_t TrigTimeCnt_Sensor = 0;
  352. static uint32_t DelayTimeCnt_Sensor = 0;
  353. static FlagStatus SensorCheckFault_Falg = RESET;
  354. static FlagStatus TE_ComFault_Flag = RESET;
  355. //传感器检测异常判断
  356. if(SensorCheckFault_Falg == RESET)
  357. {
  358. if((p_MC_TE_SensorStatus->TE_ErrorCode.Code != 0) || (p_MC_TE_SensorStatus->MCU_Voltage > 3800)) //存在传感器检测异常,或主MCU工作电压大于4.2V
  359. {
  360. if((HAL_GetTick() - TrigTimeCnt_Sensor) > 1000)
  361. {
  362. SensorCheckFault_Falg = SET;
  363. }
  364. }
  365. else
  366. {
  367. TrigTimeCnt_Sensor = HAL_GetTick();
  368. }
  369. }
  370. //传感器检测异常恢复判断
  371. else
  372. {
  373. if((p_MC_TE_SensorStatus->TE_ErrorCode.Code == 0) && (p_MC_TE_SensorStatus->MCU_Voltage < 3600))
  374. {
  375. if((HAL_GetTick() - DelayTimeCnt_Sensor) > 1000)
  376. {
  377. SensorCheckFault_Falg = RESET;
  378. }
  379. }
  380. else
  381. {
  382. DelayTimeCnt_Sensor = HAL_GetTick();
  383. }
  384. }
  385. //TE通信异常判断
  386. if(TE_ComFault_Flag == RESET)
  387. {
  388. if(ComOK_Flag == FALSE)
  389. {
  390. if((HAL_GetTick() - TrigTimeCnt_Com) > 3000)
  391. {
  392. TE_ComFault_Flag = SET;
  393. }
  394. }
  395. else
  396. {
  397. TrigTimeCnt_Com = HAL_GetTick();
  398. }
  399. }
  400. //TE通信异常恢复判断
  401. else
  402. {
  403. if(ComOK_Flag == TRUE)
  404. {
  405. TE_ComFault_Flag = RESET;
  406. }
  407. }
  408. //故障码输出
  409. if((SensorCheckFault_Falg == RESET) && (TE_ComFault_Flag == RESET))
  410. {
  411. p_MC_ErrorCode->ERROR_Bit.Fault_MCU = 0;
  412. }
  413. else
  414. {
  415. if(SensorCheckFault_Falg == SET)
  416. {
  417. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1; //认为电路故障
  418. }
  419. if(TE_ComFault_Flag == SET) //认为MCU故障
  420. {
  421. p_MC_ErrorCode->ERROR_Bit.Fault_MCU = 1;
  422. }
  423. }
  424. }
  425. void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  426. {
  427. static uint32_t PeriodTimeCnt = 0;
  428. static uint32_t C31_SC_TrigTimeCnt = 0;
  429. static uint16_t BusCurrent_AD[10];
  430. static uint16_t PhaseA_AD[10];
  431. static uint16_t PhaseB_AD[10];
  432. static uint16_t PhaseC_AD[10];
  433. static uint8_t i = 0;
  434. uint16_t AvgResult_BusCurrent, AvgResult_PhaseA, AvgResult_PhaseB, AvgResult_PhaseC;
  435. uint32_t DiffSqrtResult_BusCurrent, DiffSqrtResult_PhaseA, DiffSqrtResult_PhaseB, DiffSqrtResult_PhaseC;
  436. static uint32_t PowerDriver_TrigTimeCnt = 0;
  437. //为初始化预留1s
  438. if(HAL_GetTick() < 1000)
  439. {
  440. return;
  441. }
  442. //C31(GearSensor)短路检测
  443. if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15) == GPIO_PIN_RESET)
  444. {
  445. if((HAL_GetTick() - C31_SC_TrigTimeCnt) > 5000)
  446. {
  447. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  448. }
  449. }
  450. else
  451. {
  452. C31_SC_TrigTimeCnt = HAL_GetTick();
  453. }
  454. //MOS驱动电源异常检测
  455. if((FOC_Status == FOC_Status_RUN) &&
  456. (MC_CalParam.AssistRunMode != MC_AssistRunMode_INVALID) &&
  457. (MC_CalParam.Foc_Flag == SET) &&
  458. ((MC_CalParam.Ref_Speed > 100) || (MC_CalParam.Ref_Torque > 100))
  459. )
  460. {
  461. if((MC_RunInfo.MotorSpeed < 5) && (MC_RunInfo.BusCurrent < 2000))
  462. {
  463. if((HAL_GetTick() - PowerDriver_TrigTimeCnt) > 3000)
  464. {
  465. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  466. }
  467. }
  468. else
  469. {
  470. PowerDriver_TrigTimeCnt = HAL_GetTick();
  471. }
  472. }
  473. else
  474. {
  475. PowerDriver_TrigTimeCnt = HAL_GetTick();
  476. }
  477. //以下指令执行周期100ms
  478. if((HAL_GetTick() - PeriodTimeCnt) < 100)
  479. {
  480. return;
  481. }
  482. PeriodTimeCnt = HAL_GetTick();
  483. //更新母线电流、相线电流缓存数据,更新周期100ms
  484. BusCurrent_AD[i] = ADC1_Result_Filt[ADC1_RANK_CURRENT];
  485. PhaseA_AD[i] = ADC2_Result[ADC2_RANK_CURRENT_A];
  486. PhaseB_AD[i] = ADC2_Result[ADC2_RANK_CURRENT_B];
  487. PhaseC_AD[i] = ADC2_Result[ADC2_RANK_CURRENT_C];
  488. i++;
  489. if(i < 10)
  490. {
  491. return;
  492. }
  493. i = 0;
  494. //母线电流采集异常检测
  495. AvgResult_BusCurrent = GetAverageData(BusCurrent_AD, sizeof(BusCurrent_AD) >> 1);
  496. DiffSqrtResult_BusCurrent = GetStandardDeviation(BusCurrent_AD, sizeof(BusCurrent_AD) >> 1);
  497. if((AvgResult_BusCurrent < 500) ||
  498. (((MC_RunInfo.GearSt == 0) && (MC_RunInfo.MotorSpeed == 0)) && (DiffSqrtResult_BusCurrent > 500)) || //随机跳动,需在静止状态检测
  499. (((IqFdbFlt >> 10) > 100) && (abs(AvgResult_BusCurrent - uw_current_offset) < 10)) //相线电流大于约3A时,母线电流无变化
  500. )
  501. {
  502. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  503. }
  504. //相线电流采集异常检测
  505. AvgResult_PhaseA = GetAverageData(PhaseA_AD, sizeof(PhaseA_AD) >> 1);
  506. DiffSqrtResult_PhaseA = GetStandardDeviation(PhaseA_AD, sizeof(PhaseA_AD) >> 1);
  507. AvgResult_PhaseB = GetAverageData(PhaseB_AD, sizeof(PhaseB_AD) >> 1);
  508. DiffSqrtResult_PhaseB = GetStandardDeviation(PhaseB_AD, sizeof(PhaseB_AD) >> 1);
  509. AvgResult_PhaseC = GetAverageData(PhaseC_AD, sizeof(PhaseC_AD) >> 1);
  510. DiffSqrtResult_PhaseC = GetStandardDeviation(PhaseC_AD, sizeof(PhaseC_AD) >> 1);
  511. if(((AvgResult_PhaseA < 6000) || (AvgResult_PhaseB < 6000) || (AvgResult_PhaseC < 6000)) ||
  512. (((MC_RunInfo.GearSt == 0) && (MC_RunInfo.MotorSpeed == 0)) && ((DiffSqrtResult_PhaseA > 10000) || (DiffSqrtResult_PhaseB > 10000) || (DiffSqrtResult_PhaseC > 10000)))
  513. )
  514. {
  515. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  516. }
  517. }
  518. //CAN设备通信状态检测处理
  519. void MC_Fault_CanRx_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  520. {
  521. //PBU通信状态检测
  522. if(IsComOK_PBU.IsOK_Flag == TRUE)
  523. {
  524. p_MC_ErrorCode->ERROR_Bit.Fault_PBU_Check = 0;
  525. if((HAL_GetTick() - IsComOK_PBU.OK_TrigTime) > 1000)
  526. {
  527. IsComOK_PBU.IsOK_Flag = FALSE;
  528. p_MC_ErrorCode->ERROR_Bit.Fault_PBU_Check = 1;
  529. }
  530. }
  531. }
  532. /***********************全局函数定义***********************/
  533. //霍尔传感器故障检测
  534. void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  535. {
  536. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  537. static uint32_t TrigTimeCnt_1 = 0;
  538. static uint32_t TrigTimeCnt_2 = 0;
  539. static TrueOrFalse_Flag_Struct_t TrigFlag = FALSE;
  540. if(IsFirstEnterFlag == TRUE)
  541. {
  542. TrigTimeCnt_1 = HAL_GetTick();
  543. TrigTimeCnt_2 = HAL_GetTick();
  544. IsFirstEnterFlag = FALSE;
  545. }
  546. if(p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor == 0)
  547. {
  548. //霍尔传感器全部短路或开路检测
  549. if((HallSensorStatus.HallGropuStatus == 0x00) || (HallSensorStatus.HallGropuStatus == 0x07))
  550. {
  551. if((HAL_GetTick() - TrigTimeCnt_1) > 200)
  552. {
  553. p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
  554. return;
  555. }
  556. }
  557. else
  558. {
  559. TrigTimeCnt_1 = HAL_GetTick();
  560. }
  561. //相邻黏连检测和单个短、开路检测
  562. if(HallSensorStatus.HallGropuStatus != HallSensorStatus.HallGropuStatus_Old)
  563. {
  564. if((HallSensorStatus.HallGropuStatus != HallSensorGroup_Encoder_Forward[HallSensorStatus.HallGropuStatus_Old]) && //不满足正转编码
  565. (HallSensorStatus.HallGropuStatus != HallSensorGroup_Encoder_Backward[HallSensorStatus.HallGropuStatus_Old])) //不满足反转编码
  566. {
  567. if(TrigFlag == FALSE)
  568. {
  569. TrigTimeCnt_2 = HAL_GetTick();
  570. TrigFlag = TRUE;
  571. }
  572. if((HAL_GetTick() - TrigTimeCnt_2) > 200)
  573. {
  574. p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
  575. return;
  576. }
  577. }
  578. else
  579. {
  580. TrigFlag = FALSE;
  581. }
  582. }
  583. else
  584. {
  585. TrigFlag = FALSE;
  586. }
  587. }
  588. }
  589. //故障检测
  590. void MC_Fault_Check_Process(void)
  591. {
  592. //速度传感器故障检测
  593. if(MC_WorkMode == MC_WorkMode_Run)
  594. {
  595. MC_Fault_SpeedSensor_Process(MC_RunInfo.BikeSpeed, MC_CadenceResult, MC_RunInfo.MotorSpeed, MC_CalParam.AssistRunMode, &MC_ErrorCode);
  596. }
  597. //力矩传感器故障检测
  598. MC_Fault_TorqueSensor_Process(ADC1_Result[ADC1_RANK_TORQUE_SENSOR], MC_ControlCode.GearSt, MC_CadenceResult.Cadence_Data, &MC_ErrorCode);
  599. //相线故障检测
  600. MC_Fault_PhaseLine_Process(MC_CalParam.Foc_Flag, MC_RunInfo.BusCurrent, ADC_3ShuntCurrent, &MC_ErrorCode);
  601. //温度传感器故障检测
  602. MC_Fault_NTCSensor_Process(MC_RunInfo.T_PCB, MC_RunInfo.T_Roil, &MC_ErrorCode);
  603. //踏频传感器故障检测
  604. MC_Fault_CadenceSensor_Process(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
  605. //指拨故障检测
  606. MC_Fault_GasSensor_Process(ADC1_Result[ADC1_RANK_GAS], &MC_ErrorCode);
  607. //MOS故障检测
  608. MC_Fault_MOS_Process(ADC_3ShuntCurrent, &MC_ErrorCode);
  609. //TE故障检测
  610. MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE, &MC_ErrorCode);
  611. //电路故障检测
  612. MC_Fault_Circuit_Process(&MC_ErrorCode);
  613. }