From 2d1a0c9827c6539e3854c142b4b7800b0b9a632c Mon Sep 17 00:00:00 2001 From: FDSoftware Date: Thu, 20 Feb 2025 12:30:39 -0300 Subject: [PATCH] IGN CLT Correction as 5x5 table [was 8*2 curve] * change curve to table on ign clt correction * bump FLASH_DATA_VERSION --- .../algo/defaults/default_ignition.cpp | 12 +++++++++-- firmware/controllers/algo/engine2.cpp | 3 +-- .../algo/ignition/ignition_state.cpp | 12 +++++++---- .../algo/ignition/ignition_state.h | 2 +- firmware/controllers/engine_controller.cpp | 3 ++- firmware/integration/rusefi_config.txt | 10 ++++++---- firmware/tunerstudio/tunerstudio.template.ini | 20 ++++++++++--------- 7 files changed, 39 insertions(+), 23 deletions(-) diff --git a/firmware/controllers/algo/defaults/default_ignition.cpp b/firmware/controllers/algo/defaults/default_ignition.cpp index d4decc8c21..83d8d1b814 100644 --- a/firmware/controllers/algo/defaults/default_ignition.cpp +++ b/firmware/controllers/algo/defaults/default_ignition.cpp @@ -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(); diff --git a/firmware/controllers/algo/engine2.cpp b/firmware/controllers/algo/engine2.cpp index 90be822698..e58f71730d 100644 --- a/firmware/controllers/algo/engine2.cpp +++ b/firmware/controllers/algo/engine2.cpp @@ -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 diff --git a/firmware/controllers/algo/ignition/ignition_state.cpp b/firmware/controllers/algo/ignition/ignition_state.cpp index 4578590450..69b1ad12be 100644 --- a/firmware/controllers/algo/ignition/ignition_state.cpp +++ b/firmware/controllers/algo/ignition/ignition_state.cpp @@ -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) { diff --git a/firmware/controllers/algo/ignition/ignition_state.h b/firmware/controllers/algo/ignition/ignition_state.h index 67ce1a51d6..7627b763b6 100644 --- a/firmware/controllers/algo/ignition/ignition_state.h +++ b/firmware/controllers/algo/ignition/ignition_state.h @@ -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); diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index e39461eb8f..05a7e47498 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -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); diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 87bda6cb13..a84d048ef0 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -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 diff --git a/firmware/tunerstudio/tunerstudio.template.ini b/firmware/tunerstudio/tunerstudio.template.ini index 79f36c1e24..99af126ed2 100644 --- a/firmware/tunerstudio/tunerstudio.template.ini +++ b/firmware/tunerstudio/tunerstudio.template.ini @@ -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