#include "Data_Coolant.h" #include "Components.h" #define Coolant_DATA_TIME 25u /*这里填写多长时间采集一个数据,单位ms*/ #define Coolant_DATA_NUM 20u /*燃油电阻采集数据总数 最大255*/ #define Coolant_CAL_START 5u /*数据排序后取中间部分计算平均:起始*/ #define Coolant_CAL_END 15u /*数据排序后取中间部分计算平均:结束*/ #define RETURN_DIFFERENCE 25u /*判断上升或下降的回差,精度0.1*/ #define Coolant_SEG_UP 0u #define Coolant_SEG_DOWN 1u uint16_t g_u16CoolantData[Coolant_DATA_NUM]; uint8_t g_u8CoolantDataCount = 0u; uint16_t CoolantR = 0u; /*滤波后的燃油电阻,精度0.1*/ static uint16_t CoolantRBak = 0; uint8_t g_u8DesCoolantSetp = 0u; uint8_t g_u8CurCoolantSetp = 0u; uint8_t g_u8CoolantInitFlag = 0u; uint8_t g_u8CoolantStateInitFlag = 0u; uint8_t g_u8CoolantDir = Coolant_SEG_UP; CoolantSensorSts_t CoolantSensorState = CoolantSensorNormal; uint16_t g_u16CoolantSensorNormalTime = 0u; uint16_t g_u16CoolantSensorShortTime = 0u; uint16_t g_u16CoolantSensorOpenTime = 0u; uint8_t g_u8CoolantADCompleteFlg = 0u; void Coolant_KL30_Init(void) { g_u8DesCoolantSetp = 0u; g_u8CurCoolantSetp = 0u; g_u8CoolantInitFlag = 1u; g_u8CoolantStateInitFlag = 1u; g_u8CoolantDir = Coolant_SEG_UP; CoolantSensorState = CoolantSensorNormal; g_u16CoolantSensorNormalTime = 0u; g_u16CoolantSensorShortTime = 0u; g_u16CoolantSensorOpenTime = 0u; g_u8CoolantADCompleteFlg = 0u; } void Coolant_KL15_Init(void) { g_u8DesCoolantSetp = 0u; g_u8CurCoolantSetp = 0u; g_u8CoolantInitFlag = 1u; g_u8CoolantStateInitFlag = 1u; g_u8CoolantDir = Coolant_SEG_UP; CoolantSensorState = CoolantSensorNormal; g_u16CoolantSensorNormalTime = 0u; g_u16CoolantSensorShortTime = 0u; g_u16CoolantSensorOpenTime = 0u; g_u8CoolantADCompleteFlg = 0u; } void Coolant_R_Cal(uint8_t deltaTime) { uint16_t CoolantRes = 0; uint8_t i, j; uint32_t temp32; static uint16_t timeCount = 0; if(g_u8CoolantStateInitFlag) { CoolantR = ADC_Read_Signal(ADC_CH_COOLANT_TEMP1_R); } if (timeCount >= Coolant_DATA_TIME) { timeCount = 0; if (g_u8CoolantDataCount < Coolant_DATA_NUM) { /*获取燃油电阻*/ CoolantRes = ADC_Read_Signal(ADC_CH_COOLANT_TEMP1_R); /*四舍五入*/ if (CoolantRes < 3100) { if (CoolantRes % 10 >= 5) { CoolantRes += 5; } } else { CoolantRes = 0xFFFF; } /*由小到大插入数据*/ for (i = 0; i < g_u8CoolantDataCount; i++) { if (CoolantRes < g_u16CoolantData[i]) { break; } } for (j = g_u8CoolantDataCount; j > i; j--) { g_u16CoolantData[j] = g_u16CoolantData[j - 1]; } g_u16CoolantData[i] = CoolantRes; g_u8CoolantDataCount++; } else { /*一组数据采集完毕,取中间部分计算平均值*/ temp32 = 0; for (i = Coolant_CAL_START; i < Coolant_CAL_END; i++) { temp32 += g_u16CoolantData[i]; } CoolantR = temp32 / (Coolant_CAL_END - Coolant_CAL_START); g_u8CoolantDataCount = 0; g_u8CoolantADCompleteFlg = 1; } } timeCount += deltaTime; } void Coolant_State_Check(uint8_t deltaTime) { if (CoolantR < 30) { /*短路3*/ g_u16CoolantSensorOpenTime = 0; g_u16CoolantSensorNormalTime = 0; if ((g_u16CoolantSensorShortTime > 3000) || ((g_u8CoolantStateInitFlag) && (g_u16CoolantSensorShortTime > 3000))) { CoolantSensorState = CoolantSensorShortCircuit; g_u8DesCoolantSetp = 0; g_u8CurCoolantSetp = 6; g_u8CoolantStateInitFlag = 0; g_u8CoolantInitFlag = 1; g_u8CoolantDir = Coolant_SEG_UP; } else { g_u16CoolantSensorShortTime += deltaTime; } } else if (CoolantR > 3100) { /*开路 310*/ g_u16CoolantSensorShortTime = 0; g_u16CoolantSensorNormalTime = 0; if ((g_u16CoolantSensorOpenTime > 3000) || ((g_u8CoolantStateInitFlag) && (g_u16CoolantSensorOpenTime > 3000))) { CoolantSensorState = CoolantSensorOpenCircuit; g_u8DesCoolantSetp = 0; g_u8CurCoolantSetp = 0; g_u8CoolantStateInitFlag = 0; g_u8CoolantInitFlag = 1; g_u8CoolantDir = Coolant_SEG_UP; } else { g_u16CoolantSensorOpenTime += deltaTime; } } else { g_u16CoolantSensorShortTime = 0; g_u16CoolantSensorOpenTime = 0; if (g_u16CoolantSensorNormalTime > 3000) { CoolantSensorState = CoolantSensorNormal; g_u8CoolantStateInitFlag = 0; } else { g_u16CoolantSensorNormalTime += deltaTime; } } } void Coolant_Gauges_Cal(uint8_t deltaTime) { static uint16_t time = 0; if ((CoolantSensorState == CoolantSensorNormal) && (CoolantR <= 3100) && (CoolantR >= 30)) { /*采集完第一组数据后,开始计算燃油格数*/ if (g_u8CoolantADCompleteFlg) { if (g_u8CoolantInitFlag) { CoolantRBak = CoolantR; } /*根据回差计算走动方向*/ if (g_u8CoolantDir == Coolant_SEG_UP) { if (CoolantR >= CoolantRBak + RETURN_DIFFERENCE) { g_u8CoolantDir = Coolant_SEG_DOWN; CoolantRBak = CoolantR; } if (CoolantR < CoolantRBak) { CoolantRBak = CoolantR; } } else { if (CoolantRBak >= CoolantR + RETURN_DIFFERENCE) { g_u8CoolantDir = Coolant_SEG_UP; CoolantRBak = CoolantR; } if (CoolantR > CoolantRBak) { CoolantRBak = CoolantR; } } /*计算目标格数*/ if (g_u8CoolantDir == Coolant_SEG_UP) { if (((g_u8DesCoolantSetp == 5) || g_u8CoolantInitFlag) && (CoolantR < 30)) { g_u8DesCoolantSetp = 6; } else if (((g_u8DesCoolantSetp == 4) || g_u8CoolantInitFlag) && (CoolantR < 160)) { g_u8DesCoolantSetp = 5; } else if (((g_u8DesCoolantSetp == 3) || g_u8CoolantInitFlag) && (CoolantR < 300)) { g_u8DesCoolantSetp = 4; } else if (((g_u8DesCoolantSetp == 2) || g_u8CoolantInitFlag) && (CoolantR < 500)) { g_u8DesCoolantSetp = 3; } else if (((g_u8DesCoolantSetp == 1) || g_u8CoolantInitFlag) && (CoolantR < 790)) { g_u8DesCoolantSetp = 2; } else if (((g_u8DesCoolantSetp == 0) || g_u8CoolantInitFlag) && (CoolantR <= 3100)) { g_u8DesCoolantSetp = 1; } } else if (g_u8CoolantDir == Coolant_SEG_DOWN) { if (((g_u8DesCoolantSetp == 1) || g_u8CoolantInitFlag) && (CoolantR > 3100)) { g_u8DesCoolantSetp = 0; } else if (((g_u8DesCoolantSetp == 2) || g_u8CoolantInitFlag) && (CoolantR >= 790)) { g_u8DesCoolantSetp = 1; } else if (((g_u8DesCoolantSetp == 3) || g_u8CoolantInitFlag) && (CoolantR >= 500)) { g_u8DesCoolantSetp = 2; } else if (((g_u8DesCoolantSetp == 4) || g_u8CoolantInitFlag) && (CoolantR >= 300)) { g_u8DesCoolantSetp = 3; } else if (((g_u8DesCoolantSetp == 5) || g_u8CoolantInitFlag) && (CoolantR >= 160)) { g_u8DesCoolantSetp = 4; } else if (((g_u8DesCoolantSetp == 6) || g_u8CoolantInitFlag) && (CoolantR >= 30)) { g_u8DesCoolantSetp = 5; } } } /*IGN ON 1秒/故障恢复后,开始走格 立即指向当前格 20220704*/ if (Common_GetIgnOnTime() >= 3000) { time += deltaTime; if (g_u8CoolantInitFlag) { g_u8CoolantInitFlag = 0; time = 0; g_u8CurCoolantSetp = g_u8DesCoolantSetp; } if (time >= 15000) { /* 15S变化一格 */ time = 0; if (g_u8CurCoolantSetp < g_u8DesCoolantSetp) { g_u8CurCoolantSetp++; } else if (g_u8CurCoolantSetp > g_u8DesCoolantSetp) { g_u8CurCoolantSetp--; } } if (g_u8CurCoolantSetp == g_u8DesCoolantSetp) { time = 0; } } } } void Coolant_Cal_Sevice(uint8_t deltaTime) { /*检测燃油电阻状态*/ Coolant_State_Check(deltaTime); /*显示燃油格*/ Coolant_Gauges_Cal(deltaTime); } uint8_t Get_CurCoolantSetp(void) { uint8_t u8CurCoolantSetp = g_u8CurCoolantSetp; if(CoolantSensorState == CoolantSensorOpenCircuit) { if(FLASH_SYNC_1Hz) { u8CurCoolantSetp = 6; } else { u8CurCoolantSetp = 0; } } else if(CoolantSensorState == CoolantSensorShortCircuit) { if(FLASH_SYNC_1Hz) { u8CurCoolantSetp = 7; } else { u8CurCoolantSetp = 0; } } else if(u8CurCoolantSetp == 1) { if(FLASH_SYNC_1Hz) { u8CurCoolantSetp = 1; } else { u8CurCoolantSetp = 0; } } else { ; } return u8CurCoolantSetp; } CoolantSensorSts_t Get_Coolant_Sensor_State(void) { uint8_t u8CurCoolantSetp = 0; if(CoolantSensorState == CoolantSensorOpenCircuit || g_u8CurCoolantSetp == 1u) { if(FLASH_SYNC_1Hz) { u8CurCoolantSetp = 2; } else { u8CurCoolantSetp = 0; } } else { u8CurCoolantSetp = 1u; } return u8CurCoolantSetp; }