fault_check.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  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. #include "eeprom_24c02.h"
  10. #include "eeprom_Flash.h"
  11. #include "log_save.h"
  12. /*********************************局部函数定义*****************************/
  13. //速度传感器故障检测
  14. 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)
  15. {
  16. static uint32_t TrigTimeCnt_1 = 0;
  17. static uint32_t TrigTimeCnt_2 = 0;
  18. uint16_t DelayTime = 0;
  19. if(p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor == 0)
  20. {
  21. if(AssistRunMode == MC_AssistRunMode_INVALID)
  22. {
  23. TrigTimeCnt_1 = HAL_GetTick();
  24. TrigTimeCnt_2 = HAL_GetTick();
  25. }
  26. //推行助力模式下,检测速度传感器是否产生信号变化
  27. else if( (AssistRunMode == MC_AssistRunMode_WALK) || (AssistRunMode == MC_AssistRunMode_GAS) )
  28. {
  29. if((MotorSpeed > 50) && (IsStopFlag == TRUE))
  30. {
  31. DelayTime = 1650000 / MotorSpeed;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (电机转速 / (4.55 * 2.4) * 0.8) s, 延长2圈时间
  32. DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
  33. if((HAL_GetTick() - TrigTimeCnt_1) > DelayTime)
  34. {
  35. p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
  36. //记录故障日志
  37. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  38. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  39. IsErrorLogSaveInfoUpdateFlag = TRUE;
  40. //存储故障次数
  41. MC_RunLog1.SPS_FaultCnt++;
  42. RunLogSaveIndex = 1;
  43. return;
  44. }
  45. }
  46. else
  47. {
  48. TrigTimeCnt_1 = HAL_GetTick();
  49. }
  50. }
  51. //骑行状态下,检测速度传感器是否产生信号变化
  52. else
  53. {
  54. if((CadenceSensor.Cadence_Data >= 5) && (CadenceSensor.Cadence_Dir == MC_Cadence_Forward) && (IsStopFlag == TRUE))
  55. {
  56. DelayTime = 150000 / CadenceSensor.Cadence_Data;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (踏频 * 0.8) s, 延长2圈时间
  57. DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
  58. if((HAL_GetTick() - TrigTimeCnt_2) > DelayTime)
  59. {
  60. p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
  61. //记录故障日志
  62. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  63. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  64. IsErrorLogSaveInfoUpdateFlag = TRUE;
  65. //存储故障次数
  66. MC_RunLog1.SPS_FaultCnt++;
  67. RunLogSaveIndex = 1;
  68. return;
  69. }
  70. }
  71. else
  72. {
  73. TrigTimeCnt_2 = HAL_GetTick();
  74. }
  75. }
  76. }
  77. }
  78. //力矩传感器故障检测
  79. typedef struct
  80. {
  81. uint32_t TrigTimeCnt_1;
  82. uint32_t TrigTimeCnt_2;
  83. uint16_t TorqueArray[25];
  84. uint16_t FaultType;
  85. uint32_t DiffStdResult;
  86. }ToruqeSensorFaultCheck_Struct_t;
  87. //力矩传感器故障检测
  88. void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt, MC_CadenceResult_Struct_t CadenceData, MC_AssistRunMode_Struct_t AstMode, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  89. {
  90. static uint32_t TrigTimeCnt_1 = 0;
  91. static uint32_t TrigTimeCnt_2 = 0;
  92. static uint16_t TorqueArray[25] = {0};
  93. static uint32_t DiffSqrtResult = 0;
  94. uint16_t i;
  95. uint16_t DelayTime;
  96. static uint32_t PeriodTimeCnt = 0;
  97. if(HAL_GetTick() < 5000)
  98. {
  99. TrigTimeCnt_1 = HAL_GetTick();
  100. TrigTimeCnt_2 = HAL_GetTick();
  101. }
  102. //运行周期20ms
  103. if((HAL_GetTick() - PeriodTimeCnt) >= 20)
  104. {
  105. PeriodTimeCnt = HAL_GetTick();
  106. for(i=0; i<(sizeof(TorqueArray) / 2 - 1); i++)
  107. {
  108. TorqueArray[i] = TorqueArray[i + 1];
  109. }
  110. TorqueArray[sizeof(TorqueArray) / 2 - 1] = ADC_Data;
  111. if(p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor == 0)
  112. {
  113. DiffSqrtResult = GetStandardDeviation(TorqueArray, sizeof(TorqueArray) / 2);
  114. //传感器感应失效检测,进入力矩助力模式、踏频正转大于10rpm、标准差较小
  115. if(((GearSt != 0x22) && ((GearSt & 0x0F) != 0)) && (CadenceData.Cadence_Data > 30) && (CadenceData.Cadence_Dir == MC_Cadence_Forward) && (AstMode == MC_AssistRunMode_TORQUE) && (DiffSqrtResult < 10))
  116. {
  117. DelayTime = 60000 / CadenceData.Cadence_Data; //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
  118. DelayTime = (DelayTime < 250) ? 250 : DelayTime;
  119. if((HAL_GetTick() - TrigTimeCnt_1) > (DelayTime * 2))
  120. {
  121. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  122. //记录故障日志
  123. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  124. MC_ErrorLogSaveInfo.NotesInfo2 = (uint16_t)(DiffSqrtResult);
  125. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  126. IsErrorLogSaveInfoUpdateFlag = TRUE;
  127. //存储故障次数
  128. MC_RunLog1.TQS_FaultCnt++;
  129. RunLogSaveIndex = 1;
  130. return;
  131. }
  132. }
  133. else
  134. {
  135. TrigTimeCnt_1 = HAL_GetTick();
  136. }
  137. //传感器短路或开路检测
  138. if((ADC_Data < 50) || (ADC_Data > 4050))
  139. {
  140. if((HAL_GetTick() - TrigTimeCnt_2) > 200)
  141. {
  142. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  143. //记录故障日志
  144. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  145. MC_ErrorLogSaveInfo.NotesInfo2 = ADC_Data;
  146. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  147. IsErrorLogSaveInfoUpdateFlag = TRUE;
  148. //存储故障次数
  149. MC_RunLog1.TQS_FaultCnt++;
  150. RunLogSaveIndex = 1;
  151. return;
  152. }
  153. }
  154. else
  155. {
  156. TrigTimeCnt_2 = HAL_GetTick();
  157. }
  158. }
  159. }
  160. }
  161. //缺相检测
  162. 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)
  163. {
  164. static uint32_t TrigTimeCnt_PhaseA = 0;
  165. static uint32_t TrigTimeCnt_PhaseB = 0;
  166. static uint32_t TrigTimeCnt_PhaseC = 0;
  167. if(p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine == 0)
  168. {
  169. if((Foc_Flag == SET) && (BusCurrent > 5000) && (MotorSpeed > 500))
  170. {
  171. //A相电流
  172. if(abs(Phase_Current.uw_phase_a) < 300)
  173. {
  174. if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 3000)
  175. {
  176. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  177. //记录故障日志
  178. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  179. MC_ErrorLogSaveInfo.NotesInfo2 = abs(Phase_Current.uw_phase_a);
  180. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  181. IsErrorLogSaveInfoUpdateFlag = TRUE;
  182. //存储故障次数
  183. MC_RunLog1.PhaseLine_FaultCnt++;
  184. RunLogSaveIndex = 1;
  185. return;
  186. }
  187. }
  188. else
  189. {
  190. TrigTimeCnt_PhaseA = HAL_GetTick();
  191. }
  192. //B相电流
  193. if(abs(Phase_Current.uw_phase_b) < 300)
  194. {
  195. if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 3000)
  196. {
  197. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  198. //记录故障日志
  199. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  200. MC_ErrorLogSaveInfo.NotesInfo2 = abs(Phase_Current.uw_phase_b);
  201. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  202. IsErrorLogSaveInfoUpdateFlag = TRUE;
  203. //存储故障次数
  204. MC_RunLog1.PhaseLine_FaultCnt++;
  205. RunLogSaveIndex = 1;
  206. return;
  207. }
  208. }
  209. else
  210. {
  211. TrigTimeCnt_PhaseB = HAL_GetTick();
  212. }
  213. //C相电流
  214. if(abs(Phase_Current.uw_phase_c) < 300)
  215. {
  216. if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 3000)
  217. {
  218. p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
  219. //记录故障日志
  220. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  221. MC_ErrorLogSaveInfo.NotesInfo2 = abs(Phase_Current.uw_phase_c);
  222. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  223. IsErrorLogSaveInfoUpdateFlag = TRUE;
  224. //存储故障次数
  225. MC_RunLog1.PhaseLine_FaultCnt++;
  226. RunLogSaveIndex = 1;
  227. return;
  228. }
  229. }
  230. else
  231. {
  232. TrigTimeCnt_PhaseC = HAL_GetTick();
  233. }
  234. }
  235. else
  236. {
  237. TrigTimeCnt_PhaseA = HAL_GetTick();
  238. TrigTimeCnt_PhaseB = HAL_GetTick();
  239. TrigTimeCnt_PhaseC = HAL_GetTick();
  240. }
  241. }
  242. }
  243. //温度传感器故障检测
  244. void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  245. {
  246. static uint32_t TrigTimeCnt_PCB = 0; //PCB NTC采集异常计时
  247. static uint32_t TrigTimeCnt_Coil = 0; //绕组 NTC采集异常计时
  248. static uint32_t NTC_Check_PeriodTimeCnt = 0; //NTC检测,母线电流采集周期
  249. static uint16_t NTC_Check_Count = 0;
  250. static uint32_t BusCurrentSum = 0;
  251. uint8_t BusCurrentAvg = 0;
  252. static uint8_t T_PCB_Old = 0;
  253. static uint8_t T_Coil_Old = 0;
  254. //初始化5s,且50度以上,不检测NTC故障
  255. if((HAL_GetTick() < 5000) || (MC_RunInfo.T_MCU > 90))
  256. {
  257. TrigTimeCnt_PCB = HAL_GetTick();
  258. TrigTimeCnt_PCB = HAL_GetTick();
  259. NTC_Check_PeriodTimeCnt = HAL_GetTick();
  260. NTC_Check_Count = 0;
  261. T_PCB_Old = T_PCB_Result;
  262. T_Coil_Old = T_Coil_Result;
  263. return;
  264. }
  265. if(p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor == 0)
  266. {
  267. //PCB上NTC短路或开路检测,判断AD值是否为异常值
  268. if((T_PCB_Result < 5) || (T_PCB_Result > 180)) //5(-35度):AD为4000,180(140度):AD为80
  269. {
  270. if((HAL_GetTick() - TrigTimeCnt_PCB) > 500)
  271. {
  272. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  273. //记录故障日志
  274. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  275. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  276. IsErrorLogSaveInfoUpdateFlag = TRUE;
  277. //存储故障次数
  278. MC_RunLog1.NTC_FaultCnt++;
  279. RunLogSaveIndex = 1;
  280. return;
  281. }
  282. }
  283. else
  284. {
  285. TrigTimeCnt_PCB = HAL_GetTick();
  286. }
  287. //NTC短路或开路检测,判断AD值是否为异常值
  288. if((T_Coil_Result < 5) || (T_Coil_Result > 180)) //5(-35度):AD为4000,180(140度):AD为80
  289. {
  290. if((HAL_GetTick() - TrigTimeCnt_Coil) > 500)
  291. {
  292. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  293. //记录故障日志
  294. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  295. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  296. IsErrorLogSaveInfoUpdateFlag = TRUE;
  297. //存储故障次数
  298. MC_RunLog1.NTC_FaultCnt++;
  299. RunLogSaveIndex = 1;
  300. return;
  301. }
  302. }
  303. else
  304. {
  305. TrigTimeCnt_Coil = HAL_GetTick();
  306. }
  307. //NTC为固定值的检测,检测3min内母线电流平均值 > 10A 时的前后温差
  308. if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
  309. {
  310. NTC_Check_PeriodTimeCnt = HAL_GetTick();
  311. BusCurrentSum += (uint16_t)(MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A
  312. NTC_Check_Count++;
  313. //采集100 * 8192 = 819.2s内母线电流平均值
  314. if(NTC_Check_Count >= 8192)
  315. {
  316. NTC_Check_Count = 0;
  317. BusCurrentAvg = BusCurrentSum >> 13;//8192个值取均值
  318. BusCurrentSum = 0;
  319. //平均电流超过10A,判断是否有温升
  320. if(BusCurrentAvg > 79) // 79 * 1.28 = 101
  321. {
  322. if((abs(T_PCB_Result - T_PCB_Old) < 1) || //PCB 温升低于2度
  323. (abs(T_Coil_Result - T_Coil_Old) < 1)) //绕组温升低于2度
  324. {
  325. p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
  326. //记录故障日志
  327. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  328. MC_ErrorLogSaveInfo.NotesInfo2 = BusCurrentAvg;
  329. MC_ErrorLogSaveInfo.NotesInfo3 = (uint16_t)((abs(T_PCB_Result - T_PCB_Old) << 8) + (abs(T_Coil_Result - T_Coil_Old) < 2));
  330. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  331. IsErrorLogSaveInfoUpdateFlag = TRUE;
  332. //存储故障次数
  333. MC_RunLog1.NTC_FaultCnt++;
  334. RunLogSaveIndex = 1;
  335. return;
  336. }
  337. }
  338. T_PCB_Old = T_PCB_Result;
  339. T_Coil_Old = T_Coil_Result;
  340. }
  341. }
  342. }
  343. }
  344. //指拨故障检测
  345. void MC_Fault_GasSensor_Process(uint16_t ADC_Data, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  346. {
  347. //开路检测
  348. //...
  349. //短路检测
  350. //...
  351. }
  352. //MOS短路检测
  353. void MC_Fault_MOS_Process(ADC_3ShuntCurrent_Struct_t ShuntCurrent, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  354. {
  355. static uint32_t TrigTimeCnt_A = 0;
  356. static uint32_t TrigTimeCnt_B = 0;
  357. static uint32_t TrigTimeCnt_C = 0;
  358. if(FOC_Status != FOC_Status_RUN)
  359. {
  360. TrigTimeCnt_A = HAL_GetTick();
  361. TrigTimeCnt_B = HAL_GetTick();
  362. TrigTimeCnt_C = HAL_GetTick();
  363. return;
  364. }
  365. if(p_MC_ErrorCode->ERROR_Bit.Fault_MOS == 0)
  366. {
  367. //A相MOS短路
  368. if(abs(ShuntCurrent.uw_phase_a) > 20000)
  369. {
  370. if((HAL_GetTick() - TrigTimeCnt_A) > 1000)
  371. {
  372. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  373. //记录故障日志
  374. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  375. MC_ErrorLogSaveInfo.NotesInfo2 = abs(ShuntCurrent.uw_phase_a);
  376. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  377. IsErrorLogSaveInfoUpdateFlag = TRUE;
  378. //存储故障次数
  379. MC_RunLog2.MOS_ShortCircuit_FaultCnt++;
  380. RunLogSaveIndex = 2;
  381. return;
  382. }
  383. }
  384. else
  385. {
  386. TrigTimeCnt_A = HAL_GetTick();
  387. }
  388. //B相MOS短路
  389. if(abs(ShuntCurrent.uw_phase_b) > 20000)
  390. {
  391. if((HAL_GetTick() - TrigTimeCnt_B) > 1000)
  392. {
  393. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  394. //记录故障日志
  395. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  396. MC_ErrorLogSaveInfo.NotesInfo2 = abs(ShuntCurrent.uw_phase_b);
  397. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  398. IsErrorLogSaveInfoUpdateFlag = TRUE;
  399. //存储故障次数
  400. MC_RunLog2.MOS_ShortCircuit_FaultCnt++;
  401. RunLogSaveIndex = 2;
  402. return;
  403. }
  404. }
  405. else
  406. {
  407. TrigTimeCnt_B = HAL_GetTick();
  408. }
  409. //C相MOS短路
  410. if(abs(ShuntCurrent.uw_phase_c) > 20000)
  411. {
  412. if((HAL_GetTick() - TrigTimeCnt_C) > 1000)
  413. {
  414. p_MC_ErrorCode->ERROR_Bit.Fault_MOS = 1;
  415. //记录故障日志
  416. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  417. MC_ErrorLogSaveInfo.NotesInfo2 = abs(ShuntCurrent.uw_phase_c);
  418. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  419. IsErrorLogSaveInfoUpdateFlag = TRUE;
  420. //存储故障次数
  421. MC_RunLog2.MOS_ShortCircuit_FaultCnt++;
  422. RunLogSaveIndex = 2;
  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 uint8_t ErrorCount_TE_Circuit = 0;
  436. static uint8_t ErrorCount_MCU = 0;
  437. static uint8_t ErrorCount_TE_MCU = 0;
  438. static FlagStatus Fault_TE_MCU_Com_Flag = RESET;
  439. static FlagStatus Fault_TE_MCU_Soft_Flag = RESET;
  440. //开机前5s不检测
  441. if(HAL_GetTick() < 5000)
  442. {
  443. return;
  444. }
  445. //TE通讯故障超时判断
  446. static FlagStatus SaveFlag1 = RESET;
  447. if(ComOK_Flag == FALSE)
  448. {
  449. p_MC_ErrorCode->ERROR_Bit.Fault_TE_MCU = 1;
  450. if(SaveFlag1 == RESET)
  451. {
  452. //记录故障日志
  453. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  454. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  455. IsErrorLogSaveInfoUpdateFlag = TRUE;
  456. //存储故障次数
  457. MC_RunLog2.TE_MCU_FaultCnt++;
  458. RunLogSaveIndex = 2;
  459. SaveFlag1 = SET;
  460. Fault_TE_MCU_Com_Flag = SET;
  461. }
  462. }
  463. else
  464. {
  465. Fault_TE_MCU_Com_Flag = RESET;
  466. SaveFlag1 = RESET;
  467. }
  468. if(TE_MCU_DataRefreshFlag == TRUE) //TE发送数据周期500ms
  469. {
  470. //TE电路故障异常判断,存在TE与主控采集值差异较大(故障位bit0-9),或主MCU工作电压大于4.2V
  471. static FlagStatus SaveFlag2 = RESET;
  472. if(((p_MC_TE_SensorStatus->TE_ErrorCode.Code & 0x03FF) != 0) || (p_MC_TE_SensorStatus->MCU_Voltage > 4200))
  473. {
  474. ErrorCount_TE_Circuit++;
  475. if(ErrorCount_TE_Circuit >= 5)
  476. {
  477. ErrorCount_TE_Circuit = 0;
  478. p_MC_ErrorCode->ERROR_Bit.Fault_TE_Circuit = 1;
  479. if(SaveFlag2 == RESET)
  480. {
  481. //记录故障日志
  482. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  483. MC_ErrorLogSaveInfo.NotesInfo2 = p_MC_TE_SensorStatus->TE_ErrorCode.Code;
  484. MC_ErrorLogSaveInfo.NotesInfo3 = p_MC_TE_SensorStatus->MCU_Voltage;
  485. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  486. IsErrorLogSaveInfoUpdateFlag = TRUE;
  487. //存储故障次数
  488. MC_RunLog2.TE_Circuit_FaultCnt++;
  489. RunLogSaveIndex = 2;
  490. SaveFlag2 = SET;
  491. }
  492. }
  493. }
  494. //TE电路故障异常恢复判断
  495. else if(((p_MC_TE_SensorStatus->TE_ErrorCode.Code & 0x03FF) == 0) && (p_MC_TE_SensorStatus->MCU_Voltage < 3600))
  496. {
  497. p_MC_ErrorCode->ERROR_Bit.Fault_TE_Circuit = 0;
  498. ErrorCount_TE_Circuit = 0;
  499. SaveFlag2 = RESET;
  500. }
  501. //主控MCU异常判断,主控发送TE的数据超时或时钟频率异常
  502. static FlagStatus SaveFlag3 = RESET;
  503. if(((p_MC_TE_SensorStatus->TE_ErrorCode.Code & 0x0C00) != 0))
  504. {
  505. ErrorCount_MCU++;
  506. if(ErrorCount_MCU >= 5)
  507. {
  508. ErrorCount_MCU = 0;
  509. p_MC_ErrorCode->ERROR_Bit.Fault_MCU = 1;
  510. if(SaveFlag3 == RESET)
  511. {
  512. //记录故障日志
  513. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  514. MC_ErrorLogSaveInfo.NotesInfo2 = p_MC_TE_SensorStatus->TE_ErrorCode.Code;
  515. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  516. IsErrorLogSaveInfoUpdateFlag = TRUE;
  517. //存储故障次数
  518. MC_RunLog2.MCU_FaultCnt++;
  519. RunLogSaveIndex = 2;
  520. SaveFlag3 = SET;
  521. }
  522. }
  523. }
  524. //主控MCU异常恢复判断
  525. else if((p_MC_TE_SensorStatus->TE_ErrorCode.Code & 0x0C00) == 0)
  526. {
  527. p_MC_ErrorCode->ERROR_Bit.Fault_MCU = 0;
  528. ErrorCount_MCU = 0;
  529. SaveFlag3 = RESET;
  530. }
  531. //TE MCU异常判断,TE时钟频率异常或TE检测的MCU故障位置位
  532. static FlagStatus SaveFlag4 = RESET;
  533. if( ((MC_TE_SyncClockFreqScan < (p_MC_TE_SensorStatus->SyncClockFreq - 200)) || (MC_TE_SyncClockFreqScan > (p_MC_TE_SensorStatus->SyncClockFreq + 200))) //TE发送的时钟频率超限
  534. || ((p_MC_TE_SensorStatus->TE_ErrorCode.Code & 0x1000) != 0) //TE MCU异常
  535. )
  536. {
  537. ErrorCount_TE_MCU++;
  538. if(ErrorCount_TE_MCU >= 5)
  539. {
  540. ErrorCount_TE_MCU = 0;
  541. p_MC_ErrorCode->ERROR_Bit.Fault_TE_MCU = 1;
  542. if(SaveFlag4 == RESET)
  543. {
  544. //记录故障日志
  545. MC_ErrorLogSaveInfo.NotesInfo1 = 4;
  546. MC_ErrorLogSaveInfo.NotesInfo2 = p_MC_TE_SensorStatus->TE_ErrorCode.Code;
  547. MC_ErrorLogSaveInfo.NotesInfo3 = MC_TE_SyncClockFreqScan;
  548. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  549. IsErrorLogSaveInfoUpdateFlag = TRUE;
  550. //存储故障次数
  551. MC_RunLog2.TE_MCU_FaultCnt++;
  552. RunLogSaveIndex = 2;
  553. SaveFlag4 = SET;
  554. Fault_TE_MCU_Soft_Flag = SET;
  555. }
  556. }
  557. }
  558. else
  559. {
  560. Fault_TE_MCU_Soft_Flag = RESET;
  561. ErrorCount_TE_MCU = 0;
  562. SaveFlag4 = RESET;
  563. }
  564. TE_MCU_DataRefreshFlag = FALSE;
  565. }
  566. //Fault_TE_MCU故障恢复判断
  567. if((Fault_TE_MCU_Com_Flag == RESET) && (Fault_TE_MCU_Soft_Flag == RESET))//通信正常,且时钟频率正常、TE的MCU微故障检测正常
  568. {
  569. p_MC_ErrorCode->ERROR_Bit.Fault_TE_MCU = 0;
  570. }
  571. }
  572. void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  573. {
  574. static uint32_t PeriodTimeCnt = 0;
  575. static uint32_t C31_SC_TrigTimeCnt = 0;//C32 短路判断计时
  576. static uint32_t PowerDriver_TrigTimeCnt = 0; //驱动电源判断计时
  577. //为初始化预留5s
  578. if(HAL_GetTick() < 5000)
  579. {
  580. PeriodTimeCnt = HAL_GetTick();
  581. C31_SC_TrigTimeCnt = HAL_GetTick();
  582. PowerDriver_TrigTimeCnt = HAL_GetTick();
  583. return;
  584. }
  585. if(p_MC_ErrorCode->ERROR_Bit.Fault_Circuit == 0)
  586. {
  587. //C31(GearSensor)短路检测
  588. if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15) == GPIO_PIN_RESET)
  589. {
  590. if((HAL_GetTick() - C31_SC_TrigTimeCnt) > 5000)
  591. {
  592. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  593. //记录故障日志
  594. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  595. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  596. IsErrorLogSaveInfoUpdateFlag = TRUE;
  597. //存储故障次数
  598. MC_RunLog2.Circuit_FaultCnt++;
  599. RunLogSaveIndex = 2;
  600. }
  601. }
  602. else
  603. {
  604. C31_SC_TrigTimeCnt = HAL_GetTick();
  605. }
  606. //MOS驱动电源异常检测
  607. if((MC_TE_SensorStatus.TE_ErrorCode.Code == 0x0000) && //TE无故障,未关闭驱动电源
  608. (FOC_Status == FOC_Status_RUN) && //FOC运算启动
  609. (MC_CalParam.AssistRunMode != MC_AssistRunMode_INVALID) &&
  610. (MC_CalParam.Foc_Flag == SET) &&
  611. ((MC_CalParam.Ref_Speed > 200) || (MC_CalParam.Ref_Torque > 200)) //给定值
  612. )
  613. {
  614. if((MC_HallSensorData.IsStopFlag == TRUE) && (MC_RunInfo.BusCurrent < 200)) //电机未启动,0.2A
  615. {
  616. if((HAL_GetTick() - PowerDriver_TrigTimeCnt) > 5000)
  617. {
  618. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  619. //记录故障日志
  620. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  621. MC_ErrorLogSaveInfo.NotesInfo2 = MC_TE_SensorStatus.TE_ErrorCode.Code;
  622. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  623. IsErrorLogSaveInfoUpdateFlag = TRUE;
  624. //存储故障次数
  625. MC_RunLog2.Circuit_FaultCnt++;
  626. RunLogSaveIndex = 2;
  627. }
  628. }
  629. else
  630. {
  631. PowerDriver_TrigTimeCnt = HAL_GetTick();
  632. }
  633. }
  634. else
  635. {
  636. PowerDriver_TrigTimeCnt = HAL_GetTick();
  637. }
  638. //以下指令执行周期20ms
  639. if((HAL_GetTick() - PeriodTimeCnt) >= 20)
  640. {
  641. PeriodTimeCnt = HAL_GetTick();
  642. //检测母线电流和相电流是否为异常
  643. static uint8_t i = 0, CurrentFaultCount = 0;
  644. static uint32_t BusCurrent_Flt = 0, PhasesCurrentA_Flt = 0, PhasesCurrentB_Flt = 0, PhasesCurrentC_Flt = 0;
  645. BusCurrent_Flt += ADC1_Result_Filt[ADC1_RANK_CURRENT];
  646. PhasesCurrentA_Flt += ADC2_Result_Filt[ADC2_RANK_CURRENT_A];
  647. PhasesCurrentB_Flt += ADC2_Result_Filt[ADC2_RANK_CURRENT_B];
  648. PhasesCurrentC_Flt += ADC2_Result_Filt[ADC2_RANK_CURRENT_C];
  649. i++;
  650. if(i >= 32) //计算20 * 32 ms内的平均值
  651. {
  652. i = 0;
  653. if((((BusCurrent_Flt >> 5) < 500) || (BusCurrent_Flt >> 5) > 4000) || //母线电流采样异常
  654. (((PhasesCurrentA_Flt >> 5) < 5000) || ((PhasesCurrentA_Flt >> 5) > 60000)) || //A相电流采样异常
  655. (((PhasesCurrentB_Flt >> 5) < 5000) || ((PhasesCurrentB_Flt >> 5) > 60000)) || //B相电流采样异常
  656. (((PhasesCurrentC_Flt >> 5) < 5000) || ((PhasesCurrentC_Flt >> 5) > 60000)) //C相电流采样异常
  657. )
  658. {
  659. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  660. //记录故障日志
  661. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  662. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  663. IsErrorLogSaveInfoUpdateFlag = TRUE;
  664. //存储故障次数
  665. MC_RunLog2.Circuit_FaultCnt++;
  666. RunLogSaveIndex = 2;
  667. }
  668. if((IqFdbFlt >> 10) > 200) //250时,相电流为9.6A;330时,相电流为12.4A;350时,相电流为13.6A。得到,相电流 = 0.038 * IqFdb
  669. {
  670. if(((BusCurrent_Flt >> 5) - uw_current_offset) < 25) //25对应的母线电流约0.6A, DATA / 2048 * 50A
  671. {
  672. CurrentFaultCount++;
  673. if(CurrentFaultCount > 10)
  674. {
  675. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  676. //记录故障日志
  677. MC_ErrorLogSaveInfo.NotesInfo1 = 4;
  678. MC_ErrorLogSaveInfo.NotesInfo2 = (BusCurrent_Flt >> 5);
  679. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  680. IsErrorLogSaveInfoUpdateFlag = TRUE;
  681. //存储故障次数
  682. MC_RunLog2.Circuit_FaultCnt++;
  683. RunLogSaveIndex = 2;
  684. CurrentFaultCount = 0;
  685. }
  686. }
  687. else
  688. {
  689. CurrentFaultCount = 0;
  690. }
  691. }
  692. else
  693. {
  694. CurrentFaultCount = 0;
  695. }
  696. BusCurrent_Flt = 0;
  697. PhasesCurrentA_Flt = 0;
  698. PhasesCurrentB_Flt = 0;
  699. PhasesCurrentC_Flt = 0;
  700. }
  701. //静止状态,检测母线电流和相电流是否随机跳动
  702. static uint8_t j = 0;
  703. static uint16_t BusCurrent_Array[50], PhaseCurrentA_Array[50], PhaseCurrentB_Array[50], PhaseCurrentC_Array[50];
  704. static uint32_t DiffSqrtResult_BusCurrent = 0, DiffSqrtResult_PhaseA = 0, DiffSqrtResult_PhaseB = 0, DiffSqrtResult_PhaseC = 0;
  705. static uint32_t DelayTimeCnt = 0;
  706. if((MC_RunInfo.GearSt == 0) && (MC_RunInfo.MotorSpeed == 0))
  707. {
  708. if((HAL_GetTick() - DelayTimeCnt) > 5000) // 由运动转为静止5s后进行判断
  709. {
  710. BusCurrent_Array[j] = ADC1_Result_Filt[ADC1_RANK_CURRENT];
  711. PhaseCurrentA_Array[j] = ADC2_Result_Filt[ADC2_RANK_CURRENT_A];
  712. PhaseCurrentB_Array[j] = ADC2_Result_Filt[ADC2_RANK_CURRENT_B];
  713. PhaseCurrentC_Array[j] = ADC2_Result_Filt[ADC2_RANK_CURRENT_C];
  714. j++;
  715. if(j >= 50)
  716. {
  717. j = 0;
  718. //计算均方差值
  719. DiffSqrtResult_BusCurrent = GetStandardDeviation(BusCurrent_Array, 50);
  720. DiffSqrtResult_PhaseA = GetStandardDeviation(PhaseCurrentA_Array, 50);
  721. DiffSqrtResult_PhaseB = GetStandardDeviation(PhaseCurrentB_Array, 50);
  722. DiffSqrtResult_PhaseC = GetStandardDeviation(PhaseCurrentC_Array, 50);
  723. if((DiffSqrtResult_BusCurrent > 500) || //母线电流采集异常变化
  724. ((DiffSqrtResult_PhaseA > 12000) || (DiffSqrtResult_PhaseB > 12000) || (DiffSqrtResult_PhaseC > 12000)) //相线电流采集异常变化
  725. )
  726. {
  727. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  728. //记录故障日志
  729. MC_ErrorLogSaveInfo.NotesInfo1 = 5;
  730. MC_ErrorLogSaveInfo.NotesInfo2 = DiffSqrtResult_BusCurrent;
  731. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  732. IsErrorLogSaveInfoUpdateFlag = TRUE;
  733. //存储故障次数
  734. MC_RunLog2.Circuit_FaultCnt++;
  735. RunLogSaveIndex = 2;
  736. }
  737. }
  738. }
  739. }
  740. else
  741. {
  742. j = 0;
  743. DelayTimeCnt = HAL_GetTick();
  744. }
  745. }
  746. }
  747. }
  748. //机械故障
  749. void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, ADC_SensorData_Struct_t SensorData, uint16_t speedratio, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  750. {
  751. static uint32_t TimeCount_ClutchFault=0;
  752. static uint16_t ClutchFaultCount=0;
  753. if( p_MC_ErrorCode->ERROR_Bit.Fault_Machine == 0) //单向器没有故障时开始检测,有故障后故障一直存在,故障检测不再执行
  754. {
  755. if( (HAL_GetTick()-TimeCount_ClutchFault)>=20 ) //20ms执行一次故障判断
  756. {
  757. TimeCount_ClutchFault = HAL_GetTick();
  758. if( (MotorSpeed > 500)&&(CadenceSpeed >= 15)&&(SensorData.TorqueSensor > 200)&&(SensorData.GasSensor < 50) )
  759. {
  760. if( speedratio > 1500 )
  761. {
  762. ClutchFaultCount++;
  763. if( ClutchFaultCount>= 50) //速比连续出错50次判断为故障,时间将近1s
  764. {
  765. ClutchFaultCount=0;
  766. p_MC_ErrorCode->ERROR_Bit.Fault_Machine = 1;
  767. //记录故障日志
  768. MC_ErrorLogSaveInfo.NotesInfo1 = 1; //单向器打滑故障
  769. MC_ErrorLogSaveInfo.NotesInfo2 = SensorData.TorqueSensor;
  770. MC_ErrorLogSaveInfo.NotesInfo3 = SensorData.GasSensor;
  771. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  772. IsErrorLogSaveInfoUpdateFlag = TRUE;
  773. //存储故障次数
  774. MC_RunLog1.MachineFaultCnt++;
  775. RunLogSaveIndex = 1;
  776. }
  777. }
  778. else
  779. {
  780. ClutchFaultCount=0;
  781. }
  782. }
  783. else
  784. {
  785. ClutchFaultCount=0;
  786. }
  787. }
  788. }
  789. }
  790. //硬件识别故障
  791. void MC_Fault_Hardware_Identify(TrueOrFalse_Flag_Struct_t TEComOKFlag, uint16_t SyncClockFreqScan, uint16_t Hardware_AD, TrueOrFalse_Flag_Struct_t *inverterExistFlag, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  792. {
  793. static uint32_t TimeCount_HardwareFault=0;
  794. static uint8_t HardwareFaultCount=0, HardwareFaultCount2=0;
  795. if( HAL_GetTick() < 5000) return;
  796. if( p_MC_ErrorCode->ERROR_Bit.Fault_Circuit == 0) //单向器没有故障时开始检测,有故障后故障一直存在,故障检测不再执行
  797. {
  798. if( (HAL_GetTick()-TimeCount_HardwareFault)>=20 ) //20ms执行一次故障判断
  799. {
  800. TimeCount_HardwareFault = HAL_GetTick();
  801. if(*inverterExistFlag == TRUE) //电路板有反相器和TE
  802. {
  803. if( ((TEComOKFlag == TRUE)||(SyncClockFreqScan>200))&&((Hardware_AD>1986)&&(Hardware_AD<2110)) )
  804. {
  805. HardwareFaultCount=0;
  806. }
  807. else
  808. {
  809. HardwareFaultCount++;
  810. if( HardwareFaultCount>= 50)
  811. {
  812. HardwareFaultCount = 0;
  813. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  814. //记录故障日志
  815. MC_ErrorLogSaveInfo.NotesInfo1 = 6;
  816. MC_ErrorLogSaveInfo.NotesInfo2 = SyncClockFreqScan;
  817. MC_ErrorLogSaveInfo.NotesInfo3 = Hardware_AD;
  818. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  819. IsErrorLogSaveInfoUpdateFlag = TRUE;
  820. //存储故障次数
  821. MC_RunLog2.Circuit_FaultCnt++;
  822. RunLogSaveIndex = 2;
  823. }
  824. }
  825. }
  826. else
  827. {
  828. if( (TEComOKFlag == TRUE)||(SyncClockFreqScan>200) )
  829. {
  830. *inverterExistFlag = TRUE;
  831. }
  832. else
  833. {
  834. if( (Hardware_AD>3723)||(Hardware_AD<372) )
  835. {
  836. HardwareFaultCount2++;
  837. if( HardwareFaultCount2>= 50)
  838. {
  839. HardwareFaultCount2 = 0;
  840. p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
  841. //记录故障日志
  842. MC_ErrorLogSaveInfo.NotesInfo1 = 6;
  843. MC_ErrorLogSaveInfo.NotesInfo2 = SyncClockFreqScan;
  844. MC_ErrorLogSaveInfo.NotesInfo3 = Hardware_AD;
  845. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  846. IsErrorLogSaveInfoUpdateFlag = TRUE;
  847. //存储故障次数
  848. MC_RunLog2.Circuit_FaultCnt++;
  849. RunLogSaveIndex = 2;
  850. }
  851. }
  852. else
  853. {
  854. HardwareFaultCount2 = 0;
  855. }
  856. }
  857. }
  858. }
  859. }
  860. }
  861. /***********************全局函数定义***********************/
  862. //霍尔传感器故障检测
  863. void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  864. {
  865. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  866. static uint32_t TrigTimeCnt_1 = 0;//用于检测霍尔全部短路或开路检测 延时判断
  867. static uint8_t HallGroupOldBak[6];//用于单个霍尔故障判断霍尔状态缓存
  868. static uint8_t Count = 0;
  869. static uint32_t TrigCnt_2 = 0;//用于单个霍尔故障次数计数
  870. if(IsFirstEnterFlag == TRUE)
  871. {
  872. TrigTimeCnt_1 = HAL_GetTick();
  873. memset(HallGroupOldBak, HallSensorStatus.HallGropuStatus_Old, sizeof(HallGroupOldBak));
  874. IsFirstEnterFlag = FALSE;
  875. }
  876. if(p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor == 0)
  877. {
  878. //霍尔传感器全部短路或开路检测
  879. if((HallSensorStatus.HallGropuStatus == 0x00) || (HallSensorStatus.HallGropuStatus == 0x07))
  880. {
  881. if((HAL_GetTick() - TrigTimeCnt_1) > 250)
  882. {
  883. p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
  884. //记录故障日志
  885. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  886. MC_ErrorLogSaveInfo.NotesInfo2 = (uint16_t)HallSensorStatus.HallGropuStatus;
  887. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  888. IsErrorLogSaveInfoUpdateFlag = TRUE;
  889. //存储故障次数
  890. MC_RunLog1.Hall_FaultCnt++;
  891. RunLogSaveIndex = 1;
  892. return;
  893. }
  894. }
  895. else
  896. {
  897. TrigTimeCnt_1 = HAL_GetTick();
  898. }
  899. //相邻黏连检测和单个短、开路检测
  900. if(HallSensorStatus.HallGropuStatus != HallSensorStatus.HallGropuStatus_Old)
  901. {
  902. HallGroupOldBak[Count++] = HallSensorStatus.HallGropuStatus;
  903. if(Count >= 6)
  904. {
  905. Count = 0;
  906. //检测是否有霍尔异常
  907. if(CheckIsHasDouble(HallGroupOldBak, sizeof(HallGroupOldBak)) == TRUE)
  908. {
  909. TrigCnt_2++;
  910. }
  911. else
  912. {
  913. TrigCnt_2 = 0;
  914. }
  915. if(TrigCnt_2 > 50)
  916. {
  917. p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
  918. //记录故障日志
  919. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  920. MC_ErrorLogSaveInfo.NotesInfo2 = ((uint16_t)HallGroupOldBak[0] << 8) + ((uint16_t)HallGroupOldBak[1] << 4) + ((uint16_t)HallGroupOldBak[2]);
  921. MC_ErrorLogSaveInfo.NotesInfo3 = ((uint16_t)HallGroupOldBak[3] << 8) + ((uint16_t)HallGroupOldBak[4] << 4) + ((uint16_t)HallGroupOldBak[5]);
  922. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  923. IsErrorLogSaveInfoUpdateFlag = TRUE;
  924. //存储故障次数
  925. MC_RunLog1.Hall_FaultCnt++;
  926. RunLogSaveIndex = 1;
  927. return;
  928. }
  929. }
  930. }
  931. }
  932. }
  933. //踏频传感器故障检测
  934. void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  935. {
  936. static uint8_t Hall_1_Trg = 0; //霍尔1信号变化标志
  937. static uint8_t Hall_1_Cont = 0;//霍尔1状态
  938. static uint32_t Hall_1_Fault_TrigTimeCnt = 0;
  939. static uint8_t Hall_2_Trg = 0; //霍尔2信号变化标志
  940. static uint8_t Hall_2_Cont = 0;//霍尔2状态
  941. static uint32_t Hall_2_Fault_TrigTimeCnt = 0;
  942. static uint8_t Hall_1_2_EQA_Flag = 1;
  943. static uint32_t Hall_1_2_EQA_TrigTimeCnt = 0;
  944. static uint8_t Hall_1_State;
  945. static uint8_t Hall_2_State;
  946. Hall_1_State = HAL_GPIO_ReadPin(CADENCE_1_GPIO_Port, CADENCE_1_Pin);
  947. Hall_2_State = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
  948. //更新霍尔1信号变化状态,相同为0,不同为1
  949. Hall_1_Trg = Hall_1_State ^ Hall_1_Cont;
  950. Hall_1_Cont = Hall_1_State;
  951. //更新霍尔2信号变化状态,相同为0,不同为1
  952. Hall_2_Trg = Hall_2_State ^ Hall_2_Cont;
  953. Hall_2_Cont = Hall_2_State;
  954. //更新霍尔1和霍尔2相同标志,相同为0,不同为1
  955. Hall_1_2_EQA_Flag = Hall_1_State ^ Hall_2_State;
  956. if(HAL_GetTick() < 1000)
  957. {
  958. Hall_1_Fault_TrigTimeCnt = HAL_GetTick();
  959. Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
  960. Hall_1_2_EQA_TrigTimeCnt = HAL_GetTick();
  961. return;
  962. }
  963. if(p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor == 0)
  964. {
  965. //两个霍尔传感器分别检测是否存在开路或短路
  966. if((Torque > 1200) && (BikeSpeed > 70))
  967. {
  968. //判断霍尔1
  969. if(Hall_1_Trg == 0)
  970. {
  971. if((HAL_GetTick() - Hall_1_Fault_TrigTimeCnt) > 5000)
  972. {
  973. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  974. //记录故障日志
  975. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  976. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  977. IsErrorLogSaveInfoUpdateFlag = TRUE;
  978. //存储故障次数
  979. MC_RunLog2.CadenceSensor_FaultCnt++;
  980. RunLogSaveIndex = 2;
  981. return;
  982. }
  983. }
  984. else
  985. {
  986. Hall_1_Fault_TrigTimeCnt = HAL_GetTick();
  987. }
  988. //判断霍尔2
  989. if(Hall_2_Trg == 0)
  990. {
  991. if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 5000)
  992. {
  993. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  994. //记录故障日志
  995. MC_ErrorLogSaveInfo.NotesInfo1 = 2;
  996. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  997. IsErrorLogSaveInfoUpdateFlag = TRUE;
  998. //存储故障次数
  999. MC_RunLog2.CadenceSensor_FaultCnt++;
  1000. RunLogSaveIndex = 2;
  1001. return;
  1002. }
  1003. }
  1004. else
  1005. {
  1006. Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
  1007. }
  1008. //判断霍尔1和霍尔2黏连
  1009. if(Hall_1_2_EQA_Flag == 0)
  1010. {
  1011. if((HAL_GetTick() - Hall_1_2_EQA_TrigTimeCnt) > 5000)
  1012. {
  1013. p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
  1014. //记录故障日志
  1015. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  1016. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  1017. IsErrorLogSaveInfoUpdateFlag = TRUE;
  1018. //存储故障次数
  1019. MC_RunLog2.CadenceSensor_FaultCnt++;
  1020. RunLogSaveIndex = 2;
  1021. return;
  1022. }
  1023. }
  1024. else
  1025. {
  1026. Hall_1_2_EQA_TrigTimeCnt = HAL_GetTick();
  1027. }
  1028. }
  1029. else
  1030. {
  1031. Hall_1_Fault_TrigTimeCnt = HAL_GetTick();
  1032. Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
  1033. Hall_1_2_EQA_TrigTimeCnt = HAL_GetTick();
  1034. }
  1035. }
  1036. }
  1037. //故障检测
  1038. void MC_Fault_Check_Process(void)
  1039. {
  1040. //速度传感器故障检测
  1041. if((MC_WorkMode == MC_WorkMode_Run) && (MC_ConfigParam1.SpeedSignal == MC_SPEED_WHEEL_TRIG))
  1042. {
  1043. MC_Fault_SpeedSensor_Process(MC_SpeedSensorData.IsStopFlag, MC_CadenceResult, MC_RunInfo.MotorSpeed, MC_CalParam.AssistRunMode, &MC_ErrorCode);
  1044. }
  1045. //力矩传感器故障检测
  1046. MC_Fault_TorqueSensor_Process(ADC1_Result[ADC1_RANK_TORQUE_SENSOR], MC_ControlCode.GearSt, MC_CadenceResult, MC_CalParam.AssistRunMode, &MC_ErrorCode);
  1047. //相线故障检测
  1048. MC_Fault_PhaseLine_Process(MC_CalParam.Foc_Flag, MC_RunInfo.BusCurrent, MC_RunInfo.MotorSpeed, ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
  1049. //温度传感器故障检测
  1050. MC_Fault_NTCSensor_Process(MC_RunInfo.T_PCB, MC_RunInfo.T_Coil, &MC_ErrorCode);
  1051. //指拨故障检测
  1052. MC_Fault_GasSensor_Process(ADC1_Result[ADC1_RANK_GAS], &MC_ErrorCode);
  1053. //MOS故障检测
  1054. MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
  1055. //TE故障检测
  1056. #if 0
  1057. MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
  1058. #endif
  1059. //电路故障检测
  1060. MC_Fault_Circuit_Process(&MC_ErrorCode);
  1061. //单向器打滑故障检测
  1062. MC_Fault_Machine_Process(MC_RunInfo.MotorSpeed, MC_CadenceResult.Cadence_Data, ADC_SensorData, SpeedRatio, &MC_ErrorCode);
  1063. //硬件识别故障
  1064. MC_Fault_Hardware_Identify(IsComOK_TE.IsOK_Flag, MC_TE_SyncClockFreqScan, ADC1_Result_Filt[ADC1_RANK_HARDWARE_VER], &MC_HallSensorData.InverterExistFlag, &MC_ErrorCode);
  1065. }