gas_sensor.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "gas_sensor.h"
  2. #include "math_tools.h"
  3. #include "log_save.h"
  4. uint16_t GasSensor_OffSet = 0;
  5. GasSensorCruiceCheckParam_Struct_t GasSensorCruiceCheckParam = {0, 0, RESET, 0, FALSE};
  6. TrueOrFalse_Flag_Struct_t IsGasSensorConnectedFlag = FALSE;
  7. #define ZeroOffSetData 100
  8. //指拨零点值初始化
  9. void GasSensorOffSet_Init(uint16_t* OffSet, uint16_t AdcData)
  10. {
  11. //根据开始时刻采集值判断是否连接转把
  12. if(AdcData < 300)
  13. {
  14. IsGasSensorConnectedFlag = FALSE;
  15. }
  16. else
  17. {
  18. IsGasSensorConnectedFlag = TRUE;
  19. }
  20. *OffSet = AdcData + ZeroOffSetData;
  21. }
  22. //指拨零点值更新
  23. void GasSensorOffSetData_Update(uint16_t* PresentData, uint16_t AdcData, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  24. {
  25. static uint16_t Array[50];
  26. static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE;
  27. static uint8_t i = 0;
  28. uint16_t TempData;
  29. static uint32_t ErrorDelayTimeCnt = 0;
  30. //刚开机时,数组未存满
  31. if(IsArrayFullFalg == FALSE)
  32. {
  33. Array[i++] = AdcData;
  34. if(i >= 50)
  35. {
  36. IsArrayFullFalg = TRUE;
  37. i = 0;
  38. }
  39. }
  40. //存满后取滑动均值
  41. else
  42. {
  43. TempData = MovingAverageFilter(AdcData, Array, sizeof(Array) / 2) + ZeroOffSetData;
  44. if(TempData < *PresentData)
  45. {
  46. //更新零点值
  47. if(TempData > 300)//避免线缆松脱导致零点变为异常值
  48. {
  49. *PresentData = TempData;
  50. }
  51. }
  52. }
  53. //判断零点是否超出范围
  54. if(p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor == 0)
  55. {
  56. if(*PresentData <= 1500)
  57. {
  58. ErrorDelayTimeCnt = HAL_GetTick();
  59. }
  60. if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
  61. {
  62. p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor = 1;
  63. //记录故障日志
  64. MC_ErrorLogSaveInfo.NotesInfo1 = 1;
  65. MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData;
  66. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  67. IsErrorLogSaveInfoUpdateFlag = TRUE;
  68. //存储故障次数
  69. MC_RunLog2.GasSensor_FaultCnt++;
  70. RunLogSaveIndex = 2;
  71. }
  72. }
  73. }
  74. //定速巡航检测
  75. void GasSensorCruiceCheck(uint16_t GasSensorData, uint16_t BikeSpeed, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_GearSt_Struct_t GearSt, GasSensorCruiceCheckParam_Struct_t* p_GasSensorCruiceCheckParam)
  76. {
  77. //进入定速巡航检测
  78. if(p_GasSensorCruiceCheckParam->CruiceFlag == RESET)
  79. {
  80. //转把大于启动值、车速低于3km/h、刹车,清除巡航标志
  81. if((GasSensorData < 100) || (BikeSpeed < 30) || (IsBreakFlag == TRUE) || (GearSt == MC_GearSt_OFF) || (abs(GasSensorData - p_GasSensorCruiceCheckParam->Old_Data) > 100))
  82. {
  83. p_GasSensorCruiceCheckParam->CruiceFlag = RESET;
  84. p_GasSensorCruiceCheckParam->CruiceSetData = 0;
  85. p_GasSensorCruiceCheckParam->DelayTimeCnt = HAL_GetTick();
  86. }
  87. //巡航判断,持续时间8s
  88. else
  89. {
  90. if((HAL_GetTick() - p_GasSensorCruiceCheckParam->DelayTimeCnt) > 8000)
  91. {
  92. p_GasSensorCruiceCheckParam->CruiceFlag = SET;
  93. p_GasSensorCruiceCheckParam->CruiceSetData = GasSensorData;
  94. p_GasSensorCruiceCheckParam->IsGasReleaseFlag = FALSE;
  95. }
  96. }
  97. p_GasSensorCruiceCheckParam->Old_Data = GasSensorData;
  98. }
  99. //退出定速巡航检测
  100. else
  101. {
  102. //刹车、关闭助力、档位变化
  103. static MC_GearSt_Struct_t GearSt_Old;
  104. if((IsBreakFlag == TRUE) || (GearSt == MC_GearSt_OFF) || (GearSt_Old != GearSt))
  105. {
  106. p_GasSensorCruiceCheckParam->CruiceFlag = RESET;
  107. p_GasSensorCruiceCheckParam->CruiceSetData = 0;
  108. p_GasSensorCruiceCheckParam->DelayTimeCnt = HAL_GetTick();
  109. }
  110. GearSt_Old = GearSt;
  111. //松开转把后,再转动转把
  112. if(GasSensorData < 100)
  113. {
  114. p_GasSensorCruiceCheckParam->IsGasReleaseFlag = TRUE;
  115. }
  116. else if(GasSensorData > 300)
  117. {
  118. if(p_GasSensorCruiceCheckParam->IsGasReleaseFlag == TRUE)
  119. {
  120. p_GasSensorCruiceCheckParam->CruiceFlag = RESET;
  121. p_GasSensorCruiceCheckParam->CruiceSetData = 0;
  122. p_GasSensorCruiceCheckParam->IsGasReleaseFlag = FALSE;
  123. p_GasSensorCruiceCheckParam->DelayTimeCnt = HAL_GetTick();
  124. }
  125. }
  126. }
  127. }