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


郑萍's avatar
郑萍 committed
5 6 7 8 9

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

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

郑萍's avatar
郑萍 committed
13 14
#define Coolant_SEG_UP 0u
#define Coolant_SEG_DOWN 1u
15

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

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

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

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

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

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

郑萍's avatar
郑萍 committed
68
    if(g_u8CoolantStateInitFlag)
69
    {
70
        CoolantR = ADC_Read_Signal(ADC_CH_COOLANT_TEMP1_R);
71 72
    }

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

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

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

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

郑萍's avatar
郑萍 committed
182
    if ((CoolantSensorState == CoolantSensorNormal) && (CoolantR <= 3100) && (CoolantR >= 30))
183 184
    { 
        /*采集完第一组数据后,开始计算燃油格数*/
郑萍's avatar
郑萍 committed
185
        if (g_u8CoolantADCompleteFlg)
186
        {
郑萍's avatar
郑萍 committed
187
            if (g_u8CoolantInitFlag)
188
            {
郑萍's avatar
郑萍 committed
189
                CoolantRBak = CoolantR;
190 191 192
            }

            /*根据回差计算走动方向*/
郑萍's avatar
郑萍 committed
193
            if (g_u8CoolantDir == Coolant_SEG_UP)
194
            {
郑萍's avatar
郑萍 committed
195
                if (CoolantR >= CoolantRBak + RETURN_DIFFERENCE)
196
                {
郑萍's avatar
郑萍 committed
197 198
                    g_u8CoolantDir = Coolant_SEG_DOWN;
                    CoolantRBak = CoolantR;
199
                }
郑萍's avatar
郑萍 committed
200
                if (CoolantR < CoolantRBak)
201
                {
郑萍's avatar
郑萍 committed
202
                    CoolantRBak = CoolantR;
203 204 205 206
                }
            }
            else
            {
郑萍's avatar
郑萍 committed
207
                if (CoolantRBak >= CoolantR + RETURN_DIFFERENCE)
208
                {
郑萍's avatar
郑萍 committed
209 210
                    g_u8CoolantDir = Coolant_SEG_UP;
                    CoolantRBak = CoolantR;
211
                }
郑萍's avatar
郑萍 committed
212
                if (CoolantR > CoolantRBak)
213
                {
郑萍's avatar
郑萍 committed
214
                    CoolantRBak = CoolantR;
215 216 217 218
                }
            }

            /*计算目标格数*/
郑萍's avatar
郑萍 committed
219
            if (g_u8CoolantDir == Coolant_SEG_UP)
220
            {
郑萍's avatar
郑萍 committed
221
                if (((g_u8DesCoolantSetp == 5) || g_u8CoolantInitFlag) && (CoolantR < 30))
222
                {
郑萍's avatar
郑萍 committed
223
                    g_u8DesCoolantSetp = 6;
224
                }
郑萍's avatar
郑萍 committed
225
                else if (((g_u8DesCoolantSetp == 4) || g_u8CoolantInitFlag) && (CoolantR < 160))
226
                {
郑萍's avatar
郑萍 committed
227
                    g_u8DesCoolantSetp = 5;
228
                }
郑萍's avatar
郑萍 committed
229
                else if (((g_u8DesCoolantSetp == 3) || g_u8CoolantInitFlag) && (CoolantR < 300))
230
                {
郑萍's avatar
郑萍 committed
231
                    g_u8DesCoolantSetp = 4;
232
                }
郑萍's avatar
郑萍 committed
233
                else if (((g_u8DesCoolantSetp == 2) || g_u8CoolantInitFlag) && (CoolantR < 500))
234
                {
郑萍's avatar
郑萍 committed
235
                    g_u8DesCoolantSetp = 3;
236
                }
郑萍's avatar
郑萍 committed
237
                else if (((g_u8DesCoolantSetp == 1) || g_u8CoolantInitFlag) && (CoolantR < 790))
238
                {
郑萍's avatar
郑萍 committed
239
                    g_u8DesCoolantSetp = 2;
240
                }
郑萍's avatar
郑萍 committed
241
                else if (((g_u8DesCoolantSetp == 0) || g_u8CoolantInitFlag) && (CoolantR <= 3100))
242
                {
郑萍's avatar
郑萍 committed
243
                    g_u8DesCoolantSetp = 1;
244 245
                }
            }
郑萍's avatar
郑萍 committed
246
            else if (g_u8CoolantDir == Coolant_SEG_DOWN)
247
            {
郑萍's avatar
郑萍 committed
248
                if (((g_u8DesCoolantSetp == 1) || g_u8CoolantInitFlag) && (CoolantR > 3100))
249
                {
郑萍's avatar
郑萍 committed
250
                    g_u8DesCoolantSetp = 0;
251
                }
郑萍's avatar
郑萍 committed
252
                else if (((g_u8DesCoolantSetp == 2) || g_u8CoolantInitFlag) && (CoolantR >= 790))
253
                {
郑萍's avatar
郑萍 committed
254
                    g_u8DesCoolantSetp = 1;
255
                }
郑萍's avatar
郑萍 committed
256
                else if (((g_u8DesCoolantSetp == 3) || g_u8CoolantInitFlag) && (CoolantR >= 500))
257
                {
郑萍's avatar
郑萍 committed
258
                    g_u8DesCoolantSetp = 2;
259
                }
郑萍's avatar
郑萍 committed
260
                else if (((g_u8DesCoolantSetp == 4) || g_u8CoolantInitFlag) && (CoolantR >= 300))
261
                {
郑萍's avatar
郑萍 committed
262
                    g_u8DesCoolantSetp = 3;
263
                }
郑萍's avatar
郑萍 committed
264
                else if (((g_u8DesCoolantSetp == 5) || g_u8CoolantInitFlag) && (CoolantR >= 160))
265
                {
郑萍's avatar
郑萍 committed
266
                    g_u8DesCoolantSetp = 4;
267
                }
郑萍's avatar
郑萍 committed
268
                else if (((g_u8DesCoolantSetp == 6) || g_u8CoolantInitFlag) && (CoolantR >= 30))
269
                {
郑萍's avatar
郑萍 committed
270
                    g_u8DesCoolantSetp = 5;
271 272 273 274 275 276 277 278
                }
            }
        }

        /*IGN ON 1秒/故障恢复后,开始走格  立即指向当前格 20220704*/
        if (Common_GetIgnOnTime() >= 3000)
        {
            time += deltaTime;
郑萍's avatar
郑萍 committed
279
            if (g_u8CoolantInitFlag)
280
            {
郑萍's avatar
郑萍 committed
281
                g_u8CoolantInitFlag = 0;
282
                time = 0;
郑萍's avatar
郑萍 committed
283
                g_u8CurCoolantSetp = g_u8DesCoolantSetp;
284 285 286 287 288
            }

            if (time >= 15000)
            { /* 15S变化一格 */
                time = 0;
郑萍's avatar
郑萍 committed
289
                if (g_u8CurCoolantSetp < g_u8DesCoolantSetp)
290
                {
郑萍's avatar
郑萍 committed
291
                    g_u8CurCoolantSetp++;
292
                }
郑萍's avatar
郑萍 committed
293
                else if (g_u8CurCoolantSetp > g_u8DesCoolantSetp)
294
                {
郑萍's avatar
郑萍 committed
295
                    g_u8CurCoolantSetp--;
296 297 298
                }
            }
            
郑萍's avatar
郑萍 committed
299
            if (g_u8CurCoolantSetp == g_u8DesCoolantSetp)
300 301 302 303 304 305 306
            {
                time = 0;
            }
        }
    }
}

郑萍's avatar
郑萍 committed
307
void Coolant_Cal_Sevice(uint8_t deltaTime)
308 309
{
    /*检测燃油电阻状态*/
郑萍's avatar
郑萍 committed
310
    Coolant_State_Check(deltaTime);
311 312

    /*显示燃油格*/
郑萍's avatar
郑萍 committed
313
    Coolant_Gauges_Cal(deltaTime);
314 315
}

郑萍's avatar
郑萍 committed
316
uint8_t Get_CurCoolantSetp(void)
317
{
郑萍's avatar
郑萍 committed
318 319
    uint8_t u8CurCoolantSetp = g_u8CurCoolantSetp;
    if(CoolantSensorState == CoolantSensorOpenCircuit)
320 321 322
    {
        if(FLASH_SYNC_1Hz)
        {
郑萍's avatar
郑萍 committed
323
            u8CurCoolantSetp = 6;
324 325 326
        }
        else
        {
郑萍's avatar
郑萍 committed
327
            u8CurCoolantSetp = 0;
328 329
        }
    }
郑萍's avatar
郑萍 committed
330
    else if(CoolantSensorState == CoolantSensorShortCircuit)
331 332 333
    {
        if(FLASH_SYNC_1Hz)
        {
郑萍's avatar
郑萍 committed
334
            u8CurCoolantSetp = 7;
335 336 337
        }
        else
        {
郑萍's avatar
郑萍 committed
338
            u8CurCoolantSetp = 0;
339 340
        }
    }
郑萍's avatar
郑萍 committed
341
    else if(u8CurCoolantSetp == 1)
342 343 344
    {
        if(FLASH_SYNC_1Hz)
        {
郑萍's avatar
郑萍 committed
345
            u8CurCoolantSetp = 1;
346 347 348
        }
        else
        {
郑萍's avatar
郑萍 committed
349
            u8CurCoolantSetp = 0;
350 351 352 353 354 355
        }
    }
    else
    {
        ;
    }
郑萍's avatar
郑萍 committed
356
    return u8CurCoolantSetp;
357 358
}

郑萍's avatar
郑萍 committed
359
CoolantSensorSts_t Get_Coolant_Sensor_State(void)
360
{
郑萍's avatar
郑萍 committed
361 362
    uint8_t u8CurCoolantSetp = 0;
    if(CoolantSensorState == CoolantSensorOpenCircuit || g_u8CurCoolantSetp == 1u)
363 364 365
    {
        if(FLASH_SYNC_1Hz)
        {
郑萍's avatar
郑萍 committed
366
            u8CurCoolantSetp = 2;
367 368 369
        }
        else
        {
郑萍's avatar
郑萍 committed
370
            u8CurCoolantSetp = 0;
371 372 373 374
        }
    }
    else
    {
郑萍's avatar
郑萍 committed
375
        u8CurCoolantSetp = 1u;
376
    }
郑萍's avatar
郑萍 committed
377
    return u8CurCoolantSetp;
378 379
}