File size: 5,074 Bytes
96a5049
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#ifndef MAPS_H
#define MAPS_H

// Карта оборотов для УОЗ и впрыска (RPM)
const float rpmMap[16] = {
    500,    // 0
    1000,   // 1
    1500,   // 2
    2000,   // 3
    2500,   // 4
    3000,   // 5
    3500,   // 6
    4000,   // 7
    4500,   // 8
    5000,   // 9
    5500,   // 10
    6000,   // 11
    6500,   // 12
    7000,   // 13
    7500,   // 14
    8000    // 15
};

// Карта давления для УОЗ и впрыска (MAP в барах)
const float mapMap[16] = {
    0.2,    // 0
    0.3,    // 1
    0.4,    // 2
    0.5,    // 3
    0.6,    // 4
    0.7,    // 5
    0.8,    // 6
    0.9,    // 7
    1.0,    // 8
    1.1,    // 9
    1.2,    // 10
    1.3,    // 11
    1.4,    // 12
    1.5,    // 13
    1.6,    // 14
    1.7     // 15
};

// Карта УОЗ (градусы)
const float ignitionMap[16][16] = {
    // MAP -> 0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0  1.1  1.2  1.3  1.4  1.5  1.6  1.7
    {5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20},  // 500 RPM
    {6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21},  // 1000 RPM
    {7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22},  // 1500 RPM
    {8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23},  // 2000 RPM
    {9,   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24},  // 2500 RPM
    {10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25},  // 3000 RPM
    {11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26},  // 3500 RPM
    {12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27},  // 4000 RPM
    {13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28},  // 4500 RPM
    {14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29},  // 5000 RPM
    {15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30},  // 5500 RPM
    {16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31},  // 6000 RPM
    {17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32},  // 6500 RPM
    {18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33},  // 7000 RPM
    {19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34},  // 7500 RPM
    {20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35}   // 8000 RPM
};

// Карта впрыска (мс)
const float injectionMap[16][16] = {
    // MAP -> 0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0  1.1  1.2  1.3  1.4  1.5  1.6  1.7
    {1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0},  // 500 RPM
    {1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2},  // 1000 RPM
    {1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4},  // 1500 RPM
    {1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6},  // 2000 RPM
    {1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8},  // 2500 RPM
    {2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0},  // 3000 RPM
    {2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2},  // 3500 RPM
    {2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4},  // 4000 RPM
    {2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6},  // 4500 RPM
    {2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8},  // 5000 RPM
    {3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0},  // 5500 RPM
    {3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2},  // 6000 RPM
    {3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4},  // 6500 RPM
    {3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6},  // 7000 RPM
    {3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8},  // 7500 RPM
    {4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0}   // 8000 RPM
};

// Функции для работы с картами
float mapf(float x, float in_min, float in_max, float out_min, float out_max);
float getBaseIgnition(float load, float rpm);
float getBaseInjection(float load, float rpm);

// Вспомогательные функции для интерполяции
inline float interpolate(float x, float x1, float x2, float y1, float y2) {
    return y1 + (x - x1) * (y2 - y1) / (x2 - x1);
}

inline int findNearestIndex(float value, const float* array, int size) {
    int index = 0;
    float minDiff = abs(value - array[0]);
    
    for(int i = 1; i < size; i++) {
        float diff = abs(value - array[i]);
        if(diff < minDiff) {
            minDiff = diff;
            index = i;
        }
    }
    return index;
}

#endif