IGN CLT Correction as 5x5 table [was 8*2 curve]

* change curve to table on ign clt correction
* bump FLASH_DATA_VERSION
This commit is contained in:
FDSoftware 2025-02-20 12:30:39 -03:00 committed by rusefillc
parent d77612fb1b
commit 2d1a0c9827
7 changed files with 39 additions and 23 deletions

View File

@ -30,6 +30,15 @@ static void setDefaultIatTimingCorrection() {
copyArray(config->ignitionIatCorrTable[2], {0, 0, 0, 0, 0, 0, -1, -2});
}
static void setDefaultCltTimingCorrection() {
copyArray(config->ignitionCltCorrTempBins, { -20, 0, 20, 40, 60});
setLinearCurve(config->ignitionCltCorrLoadBins, /*from=*/ 0, /*to*/ 140, 1);
for (size_t i = 0; i < CLT_TIMING_CURVE_SIZE; i++) {
copyArray(config->ignitionCltCorrTable[i], {0, 0, 0, 0, 0});
}
}
static void setDefaultTrailingSparkTable() {
setLinearCurve(config->trailingSparkLoadBins, 20, 100, 1);
setRpmTableBin(config->trailingSparkRpmBins);
@ -112,8 +121,7 @@ void setDefaultIgnition() {
setDefaultTrailingSparkTable();
// CLT correction
setLinearCurve(config->cltTimingBins, CLT_CURVE_RANGE_FROM, 120, 1);
setArrayValues(config->cltTimingExtra, 0.0f);
setDefaultCltTimingCorrection();
// IAT correction
setDefaultIatTimingCorrection();

View File

@ -144,8 +144,6 @@ void EngineState::periodicFastCallback() {
}
engine->fuelComputer.running.postCrankingFuelCorrection = m_postCrankingFactor;
engine->ignitionState.updateAdvanceCorrections();
baroCorrection = getBaroCorrection();
auto tps = Sensor::get(SensorType::Tps1);
@ -175,6 +173,7 @@ void EngineState::periodicFastCallback() {
#endif //EFI_LAUNCH_CONTROL
float l_ignitionLoad = getIgnitionLoad();
engine->ignitionState.updateAdvanceCorrections(l_ignitionLoad);
float baseAdvance = engine->ignitionState.getWrappedAdvance(rpm, l_ignitionLoad);
float corrections = engineConfiguration->timingMode == TM_DYNAMIC ?
// Pull any extra timing for knock retard

View File

@ -130,17 +130,21 @@ angle_t getRunningAdvance(float rpm, float engineLoad) {
return advanceAngle;
}
angle_t getCltTimingCorrection() {
angle_t getCltTimingCorrection(float engineLoad) {
const auto clt = Sensor::get(SensorType::Clt);
if (!clt)
return 0; // this error should be already reported somewhere else, let's just handle it
return interpolate2d(clt.Value, config->cltTimingBins, config->cltTimingExtra);
return interpolate3d(
config->ignitionCltCorrTable,
config->ignitionCltCorrLoadBins, engineLoad,
config->ignitionCltCorrTempBins, clt.Value
);
}
void IgnitionState::updateAdvanceCorrections() {
cltTimingCorrection = getCltTimingCorrection();
void IgnitionState::updateAdvanceCorrections(float engineLoad) {
cltTimingCorrection = getCltTimingCorrection(engineLoad);
}
angle_t getAdvanceCorrections(float engineLoad) {

View File

@ -5,7 +5,7 @@
class IgnitionState : public ignition_state_s {
public:
void updateDwell(float rpm, bool isCranking);
void updateAdvanceCorrections();
void updateAdvanceCorrections(float engineLoad);
floatms_t getDwell() const;
angle_t getWrappedAdvance(const float rpm, const float engineLoad);

View File

@ -606,7 +606,8 @@ bool validateConfigOnStartUpOrBurn() {
ensureArrayIsAscendingOrDefault("Ign Trim Rpm", config->ignTrimRpmBins);
ensureArrayIsAscendingOrDefault("Ign Trim Load", config->ignTrimLoadBins);
ensureArrayIsAscending("Ignition CLT corr", config->cltTimingBins);
ensureArrayIsAscending("Ignition CLT corr CLT", config->ignitionCltCorrTempBins);
ensureArrayIsAscending("Ignition CLT corr Load", config->ignitionCltCorrLoadBins);
ensureArrayIsAscending("Ignition IAT corr IAT", config->ignitionIatCorrTempBins);
ensureArrayIsAscending("Ignition IAT corr Load", config->ignitionIatCorrLoadBins);

View File

@ -96,7 +96,7 @@
! This is the version of the data stored in flash configuration
! Any time an incompatible change is made to the configuration format stored in flash,
! update this string to the current date!
#define FLASH_DATA_VERSION 250210
#define FLASH_DATA_VERSION 250220
! all the sub-structures are going to be nested within the primary structure, that's
! needed to get a proper TunerStudio file
@ -154,7 +154,7 @@ struct_no_prefix engine_configuration_s
#define TRAILING_SPARK_SIZE 4
#define ENGINE_NOISE_CURVE_SIZE 16
#define CLT_TIMING_CURVE_SIZE 8
#define CLT_TIMING_CURVE_SIZE 5
#define IDLE_VE_SIZE 4
#define TCU_SOLENOID_COUNT 6
@ -1819,8 +1819,10 @@ engine_configuration_s engineConfiguration;
int8_t[CLT_CURVE_SIZE] autoscale cltIdleRpmBins;CLT-based target RPM for automatic idle controller;"C", 2, 0, -40, @@CLT_UPPER_LIMIT@@, 0
uint8_t[CLT_CURVE_SIZE] autoscale cltIdleRpm;See idleRpmPid;"RPM", 20, 0, 0, 5000, 0
float[CLT_TIMING_CURVE_SIZE] cltTimingBins;CLT-based timing correction;"C", 1, 0, -100, @@CLT_UPPER_LIMIT@@, 1
float[CLT_TIMING_CURVE_SIZE] cltTimingExtra;;"degree", 1, 0, -400, 400, 0
int8_t[CLT_TIMING_CURVE_SIZE x CLT_TIMING_CURVE_SIZE] autoscale ignitionCltCorrTable;;"deg", 0.1, 0, -25, 25, 1
int8_t[CLT_TIMING_CURVE_SIZE] ignitionCltCorrTempBins;CLT-based timing correction;"C", 1, 0, -40, @@CLT_UPPER_LIMIT@@, 0
uint8_t[CLT_TIMING_CURVE_SIZE] autoscale ignitionCltCorrLoadBins;;"Load", 5, 0, 0, @@MAP_UPPER_LIMIT@@, 0
float[SCRIPT_CURVE_16] scriptCurve1Bins;;"x", 1, 0, -10000, 10000, 3

View File

@ -540,14 +540,6 @@ enable2ndByteCanID = false
yBins = iatFuelCorr
gauge = IATGauge
curve = cltTimingCorrCurve, "Warmup timing correction"
columnLabel = "Coolant", "Extra"
xAxis = -40, 120, 9
yAxis = 0, 20, 9
xBins = cltTimingBins, coolant
yBins = cltTimingExtra
gauge = CLTGauge
curve = cltFuelCorrCurve, "Warmup fuel manual Multiplier"
columnLabel = "Coolant", "Multiplier"
xAxis = -40, 120, 9
@ -1192,6 +1184,16 @@ curve = rangeMatrix, "Range Switch Input Matrix"
gridOrient = 250, 0, 340 ; Space 123 rotation of grid in degrees.
upDownLabel = "(RICHER)", "(LEANER)"
table = ignitionCltCorrTable, ignitionCltCorrMap, "Warmup timing correction", 1
xyLabels = "CLT Temp", "Ignition Load"
xBins = ignitionCltCorrTempBins, coolant
yBins = ignitionCltCorrLoadBins, ignitionLoad
zBins = ignitionCltCorrTable
; gridHeight = 2.0
gridOrient = 250, 0, 340 ; Space 123 rotation of grid in degrees.
upDownLabel = "(RICHER)", "(LEANER)"
gauge = CLTGauge
table = trailingSparkTable, trailingSparkMap, "Trailing spark", 1
xyLabels = "RPM", "Ignition Load"
xBins = trailingSparkRpmBins, RPMValue
@ -2048,7 +2050,7 @@ menuDialog = main
subMenu = ignitionTableTbl, "Ignition advance", 0, {isIgnitionEnabled}
subMenu = ignitionTableMap, "Ignition advance", 0, {isIgnitionEnabled}
subMenu = cltTimingCorrCurve, "Ign CLT correction", 0, {isIgnitionEnabled == 1}
subMenu = ignitionCltCorrTable, "Ign CLT correction", 0, {isIgnitionEnabled == 1}
subMenu = ignitionIatCorrTableTbl, "Ign IAT correction", 0, {isIgnitionEnabled == 1}
subMenu = std_separator