File size: 2,265 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
#ifndef IGNITION_LEARNING_H
#define IGNITION_LEARNING_H

#include <Arduino.h>
#include "config.h"

// Размеры таблиц обучения
#define LOAD_POINTS 16    // Точки по нагрузке
#define RPM_POINTS 16     // Точки по оборотам

class IgnitionLearningTable {
private:
    float cells[LOAD_POINTS][RPM_POINTS];    // Таблица коррекции УОЗ
    float loadPoints[LOAD_POINTS];           // Точки по нагрузке (кПа)
    float rpmPoints[RPM_POINTS];            // Точки по оборотам
    float learningRate;                     // Скорость обучения
    float maxCorrection;                    // Максимальная коррекция
    float minCorrection;                    // Минимальная коррекция
    float knockThreshold;                   // Порог детонации
    float knockProtectionOffset;            // Защитное смещение при детонации
    
    // История детонации для каждой ячейки
    uint8_t knockHistory[LOAD_POINTS][RPM_POINTS];
    uint8_t knockHistorySize;
    
    // Вспомогательные методы
    int findNearestIndex(float value, const float* points, int size);
    float interpolate2D(float load, float rpm);
    void updateCell(int loadIdx, int rpmIdx, float correction);
    void updateKnockHistory(int loadIdx, int rpmIdx, bool knockDetected);
    
public:
    IgnitionLearningTable();
    
    // Основные методы
    void begin();
    float getCorrection(float load, float rpm);
    void learn(float load, float rpm, float knockLevel);
    void reset();
    
    // Методы сохранения/загрузки
    bool save();
    bool load();
    
    // Настройка параметров
    void setLearningRate(float rate);
    void setCorrectionLimits(float min, float max);
    void setKnockParameters(float threshold, float protection);
    
    // Доступ к данным для визуализации
    float getCellValue(int loadIdx, int rpmIdx);
    float getLoadPoint(int idx);
    float getRPMPoint(int idx);
    uint8_t getKnockCount(int loadIdx, int rpmIdx);
};

#endif