fault_check.c 20 KB

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