Spaces:
Running
Running
| // Карта оборотов для УОЗ и впрыска (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; | |
| } | |