#include "gas_sensor.h" #include "math_tools.h" #include "log_save.h" uint16_t GasSensor_OffSet = 0; GasSensorCruiceCheckParam_Struct_t GasSensorCruiceCheckParam = {0, 0, RESET, 0, FALSE}; TrueOrFalse_Flag_Struct_t IsGasSensorConnectedFlag = FALSE; #define ZeroOffSetData 100 //指拨零点值初始化 void GasSensorOffSet_Init(uint16_t* OffSet, uint16_t AdcData) { //根据开始时刻采集值判断是否连接转把 if(AdcData < 300) { IsGasSensorConnectedFlag = FALSE; } else { IsGasSensorConnectedFlag = TRUE; } *OffSet = AdcData + ZeroOffSetData; } //指拨零点值更新 void GasSensorOffSetData_Update(uint16_t* PresentData, uint16_t AdcData, MC_ErrorCode_Struct_t* p_MC_ErrorCode) { static uint16_t Array[50]; static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE; static uint8_t i = 0; uint16_t TempData; static uint32_t ErrorDelayTimeCnt = 0; //刚开机时,数组未存满 if(IsArrayFullFalg == FALSE) { Array[i++] = AdcData; if(i >= 50) { IsArrayFullFalg = TRUE; i = 0; } } //存满后取滑动均值 else { TempData = MovingAverageFilter(AdcData, Array, sizeof(Array) / 2) + ZeroOffSetData; if(TempData < *PresentData) { //更新零点值 if(TempData > 300)//避免线缆松脱导致零点变为异常值 { *PresentData = TempData; } } } //判断零点是否超出范围 if(p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor == 0) { if(*PresentData <= 1500) { ErrorDelayTimeCnt = HAL_GetTick(); } if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000) { p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor = 1; //记录故障日志 MC_ErrorLogSaveInfo.NotesInfo1 = 1; MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData; ErrorLogSave_Update(&MC_ErrorLogSaveInfo); IsErrorLogSaveInfoUpdateFlag = TRUE; //存储故障次数 MC_RunLog2.GasSensor_FaultCnt++; RunLogSaveIndex = 2; } } } //定速巡航检测 void GasSensorCruiceCheck(uint16_t GasSensorData, uint16_t BikeSpeed, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_GearSt_Struct_t GearSt, GasSensorCruiceCheckParam_Struct_t* p_GasSensorCruiceCheckParam) { //进入定速巡航检测 if(p_GasSensorCruiceCheckParam->CruiceFlag == RESET) { //转把大于启动值、车速低于3km/h、刹车,清除巡航标志 if((GasSensorData < 100) || (BikeSpeed < 30) || (IsBreakFlag == TRUE) || (GearSt == MC_GearSt_OFF) || (abs(GasSensorData - p_GasSensorCruiceCheckParam->Old_Data) > 100)) { p_GasSensorCruiceCheckParam->CruiceFlag = RESET; p_GasSensorCruiceCheckParam->CruiceSetData = 0; p_GasSensorCruiceCheckParam->DelayTimeCnt = HAL_GetTick(); } //巡航判断,持续时间8s else { if((HAL_GetTick() - p_GasSensorCruiceCheckParam->DelayTimeCnt) > 8000) { p_GasSensorCruiceCheckParam->CruiceFlag = SET; p_GasSensorCruiceCheckParam->CruiceSetData = GasSensorData; p_GasSensorCruiceCheckParam->IsGasReleaseFlag = FALSE; } } p_GasSensorCruiceCheckParam->Old_Data = GasSensorData; } //退出定速巡航检测 else { //刹车、关闭助力、档位变化 static MC_GearSt_Struct_t GearSt_Old; if((IsBreakFlag == TRUE) || (GearSt == MC_GearSt_OFF) || (GearSt_Old != GearSt)) { p_GasSensorCruiceCheckParam->CruiceFlag = RESET; p_GasSensorCruiceCheckParam->CruiceSetData = 0; p_GasSensorCruiceCheckParam->DelayTimeCnt = HAL_GetTick(); } GearSt_Old = GearSt; //松开转把后,再转动转把 if(GasSensorData < 100) { p_GasSensorCruiceCheckParam->IsGasReleaseFlag = TRUE; } else if(GasSensorData > 300) { if(p_GasSensorCruiceCheckParam->IsGasReleaseFlag == TRUE) { p_GasSensorCruiceCheckParam->CruiceFlag = RESET; p_GasSensorCruiceCheckParam->CruiceSetData = 0; p_GasSensorCruiceCheckParam->IsGasReleaseFlag = FALSE; p_GasSensorCruiceCheckParam->DelayTimeCnt = HAL_GetTick(); } } } }