#include "Data_Fuel.h" #include "Application.h" #define FUEL_DATA_TIME 10u /*这里填写多长时间采集一个数据,单位ms*/ #define FUEL_DATA_NUM 40u /*燃油电阻采集数据总数 最大255*/ #define FUEL_CAL_START 15u /*数据排序后取中间部分计算平均:起始*/ #define FUEL_CAL_END 25u /*数据排序后取中间部分计算平均:结束*/ #define RETURN_DIFFERENCE 10u /*判断上升或下降的回差,精度0.1*/ #define FUEL_SEG_UP 0u #define FUEL_SEG_DOWN 1u uint16_t FuelData[FUEL_DATA_NUM]; uint8_t FuelDataCount = 0u; uint16_t FuelR = 0u; /*滤波后的燃油电阻,精度0.1*/ static uint16_t FuelRBak = 0; uint8_t DesFuelSetp = 0u; uint8_t CurFuelSetp = 0u; uint8_t FuelInitFlag = 0u; uint8_t FuelStateInitFlag = 0u; uint8_t FuelDir = FUEL_SEG_UP; FuelSensorSts_t FuelSensorState = FuelSensorNormal; uint16_t FuelSensorNormalTime = 0u; uint16_t FuelSensorShortTime = 0u; uint16_t FuelSensorOpenTime = 0u; uint8_t FuelADCompleteFlg = 0u; void Fuel_KL30_Init(void) { DesFuelSetp = 0u; CurFuelSetp = 0u; FuelInitFlag = 1u; FuelStateInitFlag = 1u; FuelDir = FUEL_SEG_UP; FuelSensorState = FuelSensorNormal;//FuelSensorShortCircuit;//FuelSensorNormal; FuelSensorNormalTime = 0u; FuelSensorShortTime = 0u; FuelSensorOpenTime = 0u; FuelADCompleteFlg = 0u; // PORT_ClrBit(Fuel_Vcc_en); } void Fuel_KL15_Init(void) { // PORT_SetBit(Fuel_Vcc_en); DesFuelSetp = 0u; CurFuelSetp = 0u; FuelInitFlag = 1u; FuelStateInitFlag = 1u; FuelDir = FUEL_SEG_UP; FuelSensorState = FuelSensorNormal;//FuelSensorShortCircuit;//FuelSensorNormal; FuelSensorNormalTime = 0u; FuelSensorShortTime = 0u; FuelSensorOpenTime = 0u; FuelADCompleteFlg = 0u; } uint16_t TestFuelR = 1100u; void Fuel_R_Cal(uint8_t deltaTime) { uint16_t FuelRes = 0; uint8_t i = 0, j = 0; uint32_t temp32 = 0; static uint16_t timeCount = 0; if((FuelStateInitFlag) && (ADC_Read_Signal_Valid(ADC_CH_FUEL1))) { FuelR = ADC_Read_Signal(ADC_CH_FUEL1); } if (timeCount >= FUEL_DATA_TIME) { timeCount = 0; if (FuelDataCount < FUEL_DATA_NUM) { /*获取燃油电阻*/ FuelRes = ADC_Read_Signal(ADC_CH_FUEL1); /*四舍五入*/ //if (FuelRes < 32000) //{ //if (FuelRes % 10 >= 5) //{ // FuelRes += 5; //} //} //else //{ // FuelRes = 32000; //} /*由小到大插入数据*/ for (i = 0; i < FuelDataCount; i++) { if (FuelRes < FuelData[i]) { break; } } for (j = FuelDataCount; j > i; j--) { FuelData[j] = FuelData[j - 1]; } FuelData[i] = FuelRes; FuelDataCount++; } else { /*一组数据采集完毕,取中间部分计算平均值*/ temp32 = 0; for (i = FUEL_CAL_START; i < FUEL_CAL_END; i++) { temp32 += FuelData[i]; } FuelR = (uint16_t)(temp32 / (FUEL_CAL_END - FUEL_CAL_START)); FuelDataCount = 0; FuelADCompleteFlg = 1; } } timeCount += deltaTime; } void Fuel_State_Check(uint8_t deltaTime) { if (FuelR < 30) { /*短路 1*/ FuelSensorOpenTime = 0; FuelSensorNormalTime = 0; if ((FuelSensorShortTime > 3000) || ((FuelStateInitFlag) && (FuelSensorShortTime <= 3000))) { FuelSensorState = FuelSensorShortCircuit; DesFuelSetp = 0; CurFuelSetp = 0; FuelStateInitFlag = 0; FuelInitFlag = 1; FuelDir = FUEL_SEG_UP; } else { FuelSensorShortTime += deltaTime; } } else if (FuelR >= 3100) { /*断路 320*/ FuelSensorShortTime = 0; FuelSensorNormalTime = 0; if ((FuelSensorOpenTime > 3000) || ((FuelStateInitFlag) && (FuelSensorOpenTime <= 3000))) { FuelSensorState = FuelSensorOpenCircuit; DesFuelSetp = 0; CurFuelSetp = 5; FuelStateInitFlag = 0; FuelInitFlag = 1; FuelDir = FUEL_SEG_UP; } else { FuelSensorOpenTime += deltaTime; } } else { FuelSensorShortTime = 0; FuelSensorOpenTime = 0; if (FuelSensorNormalTime > 3000) { FuelSensorState = FuelSensorNormal; FuelStateInitFlag = 0; } else { FuelSensorNormalTime += deltaTime; } } } void Fuel_Gauges_Cal(uint8_t deltaTime) { static uint32_t time = 0; if ((FuelSensorState == FuelSensorNormal) && (FuelR < 3100)) { // 32000 //FuelR >10 change FuelR >20 /*采集完第一组数据后,开始计算燃油格数*/ if (FuelADCompleteFlg) { if (FuelInitFlag) { FuelRBak = FuelR; } /*根据回差计算走动方向*/ if (FuelDir == FUEL_SEG_UP) { if (FuelR >= FuelRBak + RETURN_DIFFERENCE) { FuelDir = FUEL_SEG_DOWN; FuelRBak = FuelR; } if (FuelR < FuelRBak) { FuelRBak = FuelR; } } else { if (FuelRBak >= FuelR + RETURN_DIFFERENCE) { FuelDir = FUEL_SEG_UP; FuelRBak = FuelR; } if (FuelR > FuelRBak) { FuelRBak = FuelR; } } if (FuelDir == FUEL_SEG_UP) { if (((DesFuelSetp == 4) || FuelInitFlag) && (FuelR < 130)) { DesFuelSetp = 5; } else if (((DesFuelSetp == 3) || FuelInitFlag) && (FuelR < 280)) { DesFuelSetp = 4; } else if (((DesFuelSetp == 2) || FuelInitFlag) && (FuelR < 430)) { DesFuelSetp = 3; } else if (((DesFuelSetp == 1) || FuelInitFlag) && (FuelR < 700)) { DesFuelSetp = 2; } else if (((DesFuelSetp == 0) || FuelInitFlag) && (FuelR < 900)) { DesFuelSetp = 1; } } else if (FuelDir == FUEL_SEG_DOWN) { if (((DesFuelSetp == 1) || FuelInitFlag) && (FuelR >= 900)) { DesFuelSetp = 0; } else if (((DesFuelSetp == 2) || FuelInitFlag) && (FuelR >= 700)) { DesFuelSetp = 1; } else if (((DesFuelSetp == 3) || FuelInitFlag) && (FuelR >= 430)) { DesFuelSetp = 2; } else if (((DesFuelSetp == 4) || FuelInitFlag) && (FuelR >= 280)) { DesFuelSetp = 3; } else if (((DesFuelSetp == 5) || FuelInitFlag) && (FuelR >= 130)) { DesFuelSetp = 4; } } } /*IGN ON 1秒/故障恢复后,开始走格 立即指向当前格 20220704*/ if (Common_GetIgnOnTime() >= 3030) { time += deltaTime; if (FuelInitFlag) { FuelInitFlag = 0; time = 0; CurFuelSetp = DesFuelSetp; } if(Get_ActualVechileSpeed() == 0) { if (time >= 24000) { /* 24S变化一格 */ time = 0; if (CurFuelSetp < DesFuelSetp) { CurFuelSetp++; } else if (CurFuelSetp > DesFuelSetp) { CurFuelSetp--; } } } else { if (time >= 360000) { /* 360S变化一格 */ time = 0; if (CurFuelSetp < DesFuelSetp) { CurFuelSetp++; } else if (CurFuelSetp > DesFuelSetp) { CurFuelSetp--; } } } if (CurFuelSetp == DesFuelSetp) { time = 0; } } } } uint8_t Get_Fuel_Disp_Byte(void) { uint8_t FuelDispByte = 0u; FuelDispByte = CurFuelSetp; // if (FuelSensorState == FuelSensorShortCircuit) //{ // //Short // FuelDispByte = FLASH_SYNC_1Hz ? 7 : 0; // } // else if (FuelSensorState == FuelSensorOpenCircuit) //{ // //Open // FuelDispByte = FLASH_SYNC_1Hz ? 6 : 0; // } // else if (CurFuelSetp == 1) //{ // FuelDispByte = FLASH_SYNC_1Hz ? 1 : 0; // } // // else if(CurFuelSetp == 0) //{ // FuelDispByte = 0; // } return FuelDispByte; } void Fuel_Cal_Sevice(uint8_t deltaTime) { /*检测燃油电阻状态*/ Fuel_State_Check(deltaTime); /*显示燃油格*/ Fuel_Gauges_Cal(deltaTime); } uint8_t Get_CurFuelSetp(void) { return CurFuelSetp; } FuelSensorSts_t Get_Fuel_Sensor_State(void) { return FuelSensorState; } //燃油阻值,用于外发 uint16_t Get_Fuel_RES(void) { uint16_t Fuel_Res = 0; if(Get_Fuel_Sensor_State() == FuelSensorShortCircuit) { Fuel_Res = 0; } else if (Get_Fuel_Sensor_State() == FuelSensorOpenCircuit) { Fuel_Res = 310; } else { Fuel_Res = FuelR / 10; } return Fuel_Res; }