File size: 1,709 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
#ifndef FUEL_LEARNING_H
#define FUEL_LEARNING_H

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

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

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

#endif