Spaces:
Running
Running
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
|