#include "Data_Fuel.h" #include "Components.h" #define FUEL_DATA_TIME 25u /*这里填写多长时间采集一个数据,单位ms*/ #define FUEL_DATA_NUM 20u /*燃油电阻采集数据总数 最大255*/ #define FUEL_CAL_START 5u /*数据排序后取中间部分计算平均:起始*/ #define FUEL_CAL_END 15u /*数据排序后取中间部分计算平均:结束*/ #define RETURN_DIFFERENCE 25u /*判断上升或下降的回差,精度0.1*/ #define FUEL_SEG_UP 0u #define FUEL_SEG_DOWN 1u uint16_t g_u16FuelData[FUEL_DATA_NUM]; uint8_t g_u8FuelDataCount = 0u; uint16_t FuelR = 0u; /*滤波后的燃油电阻,精度0.1*/ static uint16_t FuelRBak = 0; uint8_t g_u8DesFuelSetp = 0u; uint8_t g_u8CurFuelSetp = 0u; uint8_t g_u8FuelInitFlag = 0u; uint8_t g_u8FuelStateInitFlag = 0u; uint8_t g_u8FuelDir = FUEL_SEG_UP; FuelSensorSts_t FuelSensorState = FuelSensorNormal; uint16_t g_u16FuelSensorNormalTime = 0u; uint16_t g_u16FuelSensorShortTime = 0u; uint16_t g_u16FuelSensorOpenTime = 0u; uint8_t g_u8FuelADCompleteFlg = 0u; void Fuel_KL30_Init(void) { g_u8DesFuelSetp = 0u; g_u8CurFuelSetp = 0u; g_u8FuelInitFlag = 1u; g_u8FuelStateInitFlag = 1u; g_u8FuelDir = FUEL_SEG_UP; FuelSensorState = FuelSensorNormal; g_u16FuelSensorNormalTime = 0u; g_u16FuelSensorShortTime = 0u; g_u16FuelSensorOpenTime = 0u; g_u8FuelADCompleteFlg = 0u; } void Fuel_KL15_Init(void) { g_u8DesFuelSetp = 0u; g_u8CurFuelSetp = 0u; g_u8FuelInitFlag = 1u; g_u8FuelStateInitFlag = 1u; g_u8FuelDir = FUEL_SEG_UP; FuelSensorState = FuelSensorNormal; g_u16FuelSensorNormalTime = 0u; g_u16FuelSensorShortTime = 0u; g_u16FuelSensorOpenTime = 0u; g_u8FuelADCompleteFlg = 0u; } void Fuel_R_Cal(uint8_t deltaTime) { uint16_t FuelRes = 0; uint8_t i, j; uint32_t temp32; static uint16_t timeCount = 0; if(g_u8FuelStateInitFlag) { FuelR = ADC_Read_Signal(ADC_CH_FUEL1); } if (timeCount >= FUEL_DATA_TIME) { timeCount = 0; if (g_u8FuelDataCount < FUEL_DATA_NUM) { /*获取燃油电阻*/ FuelRes = ADC_Read_Signal(ADC_CH_FUEL1); /*四舍五入*/ if (FuelRes < 5000) { if (FuelRes % 10 >= 5) { FuelRes += 5; } } else { FuelRes = 0xFFFF; } /*由小到大插入数据*/ for (i = 0; i < g_u8FuelDataCount; i++) { if (FuelRes < g_u16FuelData[i]) { break; } } for (j = g_u8FuelDataCount; j > i; j--) { g_u16FuelData[j] = g_u16FuelData[j - 1]; } g_u16FuelData[i] = FuelRes; g_u8FuelDataCount++; } else { /*一组数据采集完毕,取中间部分计算平均值*/ temp32 = 0; for (i = FUEL_CAL_START; i < FUEL_CAL_END; i++) { temp32 += g_u16FuelData[i]; } FuelR = temp32 / (FUEL_CAL_END - FUEL_CAL_START); g_u8FuelDataCount = 0; g_u8FuelADCompleteFlg = 1; } } timeCount += deltaTime; } void Fuel_State_Check(uint8_t deltaTime) { if (FuelR < 30) { /*短路3*/ g_u16FuelSensorOpenTime = 0; g_u16FuelSensorNormalTime = 0; if ((g_u16FuelSensorShortTime > 3000) || ((g_u8FuelStateInitFlag) && (g_u16FuelSensorShortTime > 3000))) { FuelSensorState = FuelSensorShortCircuit; g_u8DesFuelSetp = 0; g_u8CurFuelSetp = 6; g_u8FuelStateInitFlag = 0; g_u8FuelInitFlag = 1; g_u8FuelDir = FUEL_SEG_UP; } else { g_u16FuelSensorShortTime += deltaTime; } } else if (FuelR > 5000) { /*开路 310*/ g_u16FuelSensorShortTime = 0; g_u16FuelSensorNormalTime = 0; if ((g_u16FuelSensorOpenTime > 3000) || ((g_u8FuelStateInitFlag) && (g_u16FuelSensorOpenTime > 3000))) { FuelSensorState = FuelSensorOpenCircuit; g_u8DesFuelSetp = 0; g_u8CurFuelSetp = 0; g_u8FuelStateInitFlag = 0; g_u8FuelInitFlag = 1; g_u8FuelDir = FUEL_SEG_UP; } else { g_u16FuelSensorOpenTime += deltaTime; } } else { g_u16FuelSensorShortTime = 0; g_u16FuelSensorOpenTime = 0; if (g_u16FuelSensorNormalTime > 3000) { FuelSensorState = FuelSensorNormal; g_u8FuelStateInitFlag = 0; } else { g_u16FuelSensorNormalTime += deltaTime; } } } void Fuel_Gauges_Cal(uint8_t deltaTime) { static uint16_t time = 0; if ((FuelSensorState == FuelSensorNormal) && (FuelR <= 3100) && (FuelR >= 30)) { /*采集完第一组数据后,开始计算燃油格数*/ if (g_u8FuelADCompleteFlg) { if (g_u8FuelInitFlag) { FuelRBak = FuelR; } /*根据回差计算走动方向*/ if (g_u8FuelDir == FUEL_SEG_UP) { if (FuelR >= FuelRBak + RETURN_DIFFERENCE) { g_u8FuelDir = FUEL_SEG_DOWN; FuelRBak = FuelR; } if (FuelR < FuelRBak) { FuelRBak = FuelR; } } else { if (FuelRBak >= FuelR + RETURN_DIFFERENCE) { g_u8FuelDir = FUEL_SEG_UP; FuelRBak = FuelR; } if (FuelR > FuelRBak) { FuelRBak = FuelR; } } /*计算目标格数*/ if (g_u8FuelDir == FUEL_SEG_UP) { if (((g_u8DesFuelSetp == 7) || g_u8FuelInitFlag) && (FuelR <= 110)) { g_u8DesFuelSetp = 8; } else if (((g_u8DesFuelSetp == 6) || g_u8FuelInitFlag) && (FuelR <= 210)) { g_u8DesFuelSetp = 7; } else if (((g_u8DesFuelSetp == 5) || g_u8FuelInitFlag) && (FuelR <= 310)) { g_u8DesFuelSetp = 6; } else if (((g_u8DesFuelSetp == 4) || g_u8FuelInitFlag) && (FuelR <= 380)) { g_u8DesFuelSetp = 5; } else if (((g_u8DesFuelSetp == 3) || g_u8FuelInitFlag) && (FuelR <= 490)) { g_u8DesFuelSetp = 4; } else if (((g_u8DesFuelSetp == 2) || g_u8FuelInitFlag) && (FuelR <= 610)) { g_u8DesFuelSetp = 3; } else if (((g_u8DesFuelSetp == 1) || g_u8FuelInitFlag) && (FuelR <= 830)) { g_u8DesFuelSetp = 2; } else if (((g_u8DesFuelSetp == 0) || g_u8FuelInitFlag) && (FuelR <= 5000)) { g_u8DesFuelSetp = 1; } } else if (g_u8FuelDir == FUEL_SEG_DOWN) { if (((g_u8DesFuelSetp == 1) || g_u8FuelInitFlag) && (FuelR > 5000)) { g_u8DesFuelSetp = 0; } else if (((g_u8DesFuelSetp == 2) || g_u8FuelInitFlag) && (FuelR > 830)) { g_u8DesFuelSetp = 1; } else if (((g_u8DesFuelSetp == 3) || g_u8FuelInitFlag) && (FuelR > 610)) { g_u8DesFuelSetp = 2; } else if (((g_u8DesFuelSetp == 4) || g_u8FuelInitFlag) && (FuelR > 490)) { g_u8DesFuelSetp = 3; } else if (((g_u8DesFuelSetp == 5) || g_u8FuelInitFlag) && (FuelR > 380)) { g_u8DesFuelSetp = 4; } else if (((g_u8DesFuelSetp == 6) || g_u8FuelInitFlag) && (FuelR > 310)) { g_u8DesFuelSetp = 5; } else if (((g_u8DesFuelSetp == 7) || g_u8FuelInitFlag) && (FuelR > 210)) { g_u8DesFuelSetp = 6; } else if (((g_u8DesFuelSetp == 8) || g_u8FuelInitFlag) && (FuelR > 110)) { g_u8DesFuelSetp = 7; } } } /*IGN ON 1秒/故障恢复后,开始走格 立即指向当前格 20220704*/ if (Common_GetIgnOnTime() >= 3000) { time += deltaTime; if (g_u8FuelInitFlag) { g_u8FuelInitFlag = 0; time = 0; g_u8CurFuelSetp = g_u8DesFuelSetp; } if (time >= 15000) { /* 15S变化一格 */ time = 0; if (g_u8CurFuelSetp < g_u8DesFuelSetp) { g_u8CurFuelSetp++; } else if (g_u8CurFuelSetp > g_u8DesFuelSetp) { g_u8CurFuelSetp--; } } if (g_u8CurFuelSetp == g_u8DesFuelSetp) { time = 0; } } } } void Fuel_Cal_Sevice(uint8_t deltaTime) { /*检测燃油电阻状态*/ Fuel_State_Check(deltaTime); /*显示燃油格*/ Fuel_Gauges_Cal(deltaTime); } uint8_t Get_CurFuelSetp(void) { uint8_t u8CurFuelSetp = g_u8CurFuelSetp; if(FuelSensorState == FuelSensorOpenCircuit) { if(FLASH_SYNC_1Hz) { u8CurFuelSetp = 6; } else { u8CurFuelSetp = 0; } } else if(FuelSensorState == FuelSensorShortCircuit) { if(FLASH_SYNC_1Hz) { u8CurFuelSetp = 7; } else { u8CurFuelSetp = 0; } } else if(u8CurFuelSetp == 1) { if(FLASH_SYNC_1Hz) { u8CurFuelSetp = 1; } else { u8CurFuelSetp = 0; } } else { ; } return u8CurFuelSetp; } FuelSensorSts_t Get_Fuel_Sensor_State(void) { uint8_t u8CurFuelSetp = 0; if(FuelSensorState == FuelSensorOpenCircuit || g_u8CurFuelSetp == 1u) { if(FLASH_SYNC_1Hz) { u8CurFuelSetp = 2; } else { u8CurFuelSetp = 0; } } else { u8CurFuelSetp = 1u; } return u8CurFuelSetp; }