Data_Coolant.c 5.85 KB
Newer Older
1 2 3
#include "Data_Coolant.h"
#include "Components.h"

郑萍's avatar
郑萍 committed
4 5 6 7
#define Coolant_DATA_TIME 25u /*这里填写多长时间采集一个数据,单位ms*/
#define Coolant_DATA_NUM 20u  /*燃油电阻采集数据总数 最大255*/
#define Coolant_CAL_START 5u  /*数据排序后取中间部分计算平均:起始*/
#define Coolant_CAL_END 15u   /*数据排序后取中间部分计算平均:结束*/
8 9 10

#define RETURN_DIFFERENCE 25u /*判断上升或下降的回差,精度0.1*/

郑萍's avatar
郑萍 committed
11 12
#define Coolant_SEG_UP 0u
#define Coolant_SEG_DOWN 1u
13

郑萍's avatar
郑萍 committed
14 15
uint16_t g_u16CoolantData[Coolant_DATA_NUM];
uint8_t g_u8CoolantDataCount = 0u;
16

郑萍's avatar
郑萍 committed
17 18
uint16_t CoolantR = 0u; /*滤波后的燃油电阻,精度0.1*/
static uint16_t CoolantRBak = 0;
19

郑萍's avatar
郑萍 committed
20 21 22 23 24 25 26 27 28 29
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;
30

郑萍's avatar
郑萍 committed
31
void Coolant_KL30_Init(void)
32
{
郑萍's avatar
郑萍 committed
33 34 35 36 37 38 39 40 41 42
    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;
43 44
}

郑萍's avatar
郑萍 committed
45
void Coolant_KL15_Init(void)
46
{
郑萍's avatar
郑萍 committed
47 48 49 50 51 52 53 54 55 56
    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;
57 58
}

郑萍's avatar
郑萍 committed
59
void Coolant_R_Cal(uint8_t deltaTime)
60
{
郑萍's avatar
郑萍 committed
61
    uint16_t CoolantRes = 0;
62 63 64 65
    uint8_t i, j;
    uint32_t temp32;
    static uint16_t timeCount = 0;

66
    if (g_u8CoolantStateInitFlag)
67
    {
68
        CoolantR = ADC_Read_Signal(ADC_CH_COOLANT_TEMP1_R);
69 70
    }

郑萍's avatar
郑萍 committed
71
    if (timeCount >= Coolant_DATA_TIME)
72 73
    {
        timeCount = 0;
郑萍's avatar
郑萍 committed
74
        if (g_u8CoolantDataCount < Coolant_DATA_NUM)
75 76
        {
            /*获取燃油电阻*/
77
            CoolantRes = ADC_Read_Signal(ADC_CH_COOLANT_TEMP1_R);
78 79

            /*四舍五入*/
郑萍's avatar
郑萍 committed
80
            if (CoolantRes < 3100)
81
            {
郑萍's avatar
郑萍 committed
82
                if (CoolantRes % 10 >= 5)
83
                {
郑萍's avatar
郑萍 committed
84
                    CoolantRes += 5;
85 86 87 88
                }
            }
            else
            {
郑萍's avatar
郑萍 committed
89
                CoolantRes = 0xFFFF;
90 91
            }
            /*由小到大插入数据*/
郑萍's avatar
郑萍 committed
92
            for (i = 0; i < g_u8CoolantDataCount; i++)
93
            {
郑萍's avatar
郑萍 committed
94
                if (CoolantRes < g_u16CoolantData[i])
95 96 97 98
                {
                    break;
                }
            }
郑萍's avatar
郑萍 committed
99
            for (j = g_u8CoolantDataCount; j > i; j--)
100
            {
郑萍's avatar
郑萍 committed
101
                g_u16CoolantData[j] = g_u16CoolantData[j - 1];
102
            }
郑萍's avatar
郑萍 committed
103 104
            g_u16CoolantData[i] = CoolantRes;
            g_u8CoolantDataCount++;
105 106 107 108 109
        }
        else
        {
            /*一组数据采集完毕,取中间部分计算平均值*/
            temp32 = 0;
郑萍's avatar
郑萍 committed
110
            for (i = Coolant_CAL_START; i < Coolant_CAL_END; i++)
111
            {
郑萍's avatar
郑萍 committed
112
                temp32 += g_u16CoolantData[i];
113
            }
郑萍's avatar
郑萍 committed
114 115 116
            CoolantR = temp32 / (Coolant_CAL_END - Coolant_CAL_START);
            g_u8CoolantDataCount = 0;
            g_u8CoolantADCompleteFlg = 1;
117 118 119 120 121
        }
    }
    timeCount += deltaTime;
}

郑萍's avatar
郑萍 committed
122
void Coolant_State_Check(uint8_t deltaTime)
123
{
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    // 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;
    //     }
    // }
    if (CoolantR > 3000)
    { /*开路 300*/
郑萍's avatar
郑萍 committed
144 145 146
        g_u16CoolantSensorShortTime = 0;
        g_u16CoolantSensorNormalTime = 0;
        if ((g_u16CoolantSensorOpenTime > 3000) || ((g_u8CoolantStateInitFlag) && (g_u16CoolantSensorOpenTime > 3000)))
147
        {
郑萍's avatar
郑萍 committed
148 149 150 151 152 153
            CoolantSensorState = CoolantSensorOpenCircuit;
            g_u8DesCoolantSetp = 0;
            g_u8CurCoolantSetp = 0;
            g_u8CoolantStateInitFlag = 0;
            g_u8CoolantInitFlag = 1;
            g_u8CoolantDir = Coolant_SEG_UP;
154 155 156
        }
        else
        {
郑萍's avatar
郑萍 committed
157
            g_u16CoolantSensorOpenTime += deltaTime;
158 159 160 161
        }
    }
    else
    {
郑萍's avatar
郑萍 committed
162 163 164
        g_u16CoolantSensorShortTime = 0;
        g_u16CoolantSensorOpenTime = 0;
        if (g_u16CoolantSensorNormalTime > 3000)
165
        {
郑萍's avatar
郑萍 committed
166 167
            CoolantSensorState = CoolantSensorNormal;
            g_u8CoolantStateInitFlag = 0;
168 169 170
        }
        else
        {
郑萍's avatar
郑萍 committed
171
            g_u16CoolantSensorNormalTime += deltaTime;
172 173 174 175
        }
    }
}

郑萍's avatar
郑萍 committed
176
void Coolant_Gauges_Cal(uint8_t deltaTime)
177 178 179
{
    static uint16_t time = 0;

180 181 182
    if ((CoolantSensorState == CoolantSensorNormal) && (CoolantR <= 3000)) // && (CoolantR >= 30)
    {
        if (CoolantR < 180)
183
        {
184
            g_u8DesCoolantSetp = 1;
185
        }
186
        else if(CoolantR > 220)
187
        {
188
            g_u8DesCoolantSetp = 0;
189 190 191 192
        }
    }
}

郑萍's avatar
郑萍 committed
193
void Coolant_Cal_Sevice(uint8_t deltaTime)
194 195
{
    /*检测燃油电阻状态*/
郑萍's avatar
郑萍 committed
196
    Coolant_State_Check(deltaTime);
197 198

    /*显示燃油格*/
郑萍's avatar
郑萍 committed
199
    Coolant_Gauges_Cal(deltaTime);
200 201
}

202
uint8_t Get_CurCoolantSetpState(void)
203
{
204
    return g_u8DesCoolantSetp;
205 206
}

郑萍's avatar
郑萍 committed
207
CoolantSensorSts_t Get_Coolant_Sensor_State(void)
208
{
209
    return CoolantSensorState;
210
}