From 10c1ad7698cedbb8a67ed63719b4e5c888d8a45b Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Fri, 23 Oct 2020 17:25:47 -0700 Subject: [PATCH] use fuel model (#1901) * use fuel model * spit'n'polish --- firmware/controllers/algo/engine.cpp | 2 -- .../controllers/algo/fuel/injector_model.cpp | 9 ++++- .../controllers/algo/fuel/injector_model.h | 3 ++ firmware/controllers/algo/fuel_math.cpp | 33 +++---------------- firmware/controllers/algo/fuel_math.h | 2 +- .../controllers/gauges/lcd_controller.cpp | 2 +- unit_tests/tests/test_fuel_map.cpp | 5 --- 7 files changed, 17 insertions(+), 39 deletions(-) diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index 258e401a7a..b1a40c8cd5 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -263,8 +263,6 @@ void Engine::updateSlowSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #if EFI_MC33816 initMc33816IfNeeded(); #endif // EFI_MC33816 - - engineState.running.injectorLag = getInjectorLag(sensors.vBatt PASS_ENGINE_PARAMETER_SUFFIX); #endif } diff --git a/firmware/controllers/algo/fuel/injector_model.cpp b/firmware/controllers/algo/fuel/injector_model.cpp index 1cd49eedd5..bd717dd0fa 100644 --- a/firmware/controllers/algo/fuel/injector_model.cpp +++ b/firmware/controllers/algo/fuel/injector_model.cpp @@ -4,7 +4,10 @@ EXTERN_ENGINE; void InjectorModelBase::prepare() { m_massFlowRate = getInjectorMassFlowRate(); - m_deadtime = getDeadtime(); + float deadtime = getDeadtime(); + m_deadtime = deadtime; + + postState(deadtime); } constexpr float convertToGramsPerSecond(float ccPerMinute) { @@ -27,6 +30,10 @@ float InjectorModel::getDeadtime() const { ); } +void InjectorModel::postState(float deadtime) const { + engine->engineState.running.injectorLag = deadtime; +} + float InjectorModelBase::getInjectionDuration(float fuelMassGram) const { // TODO: support injector nonlinearity correction diff --git a/firmware/controllers/algo/fuel/injector_model.h b/firmware/controllers/algo/fuel/injector_model.h index 3d426ac469..01520db644 100644 --- a/firmware/controllers/algo/fuel/injector_model.h +++ b/firmware/controllers/algo/fuel/injector_model.h @@ -15,6 +15,8 @@ public: virtual floatms_t getDeadtime() const = 0; virtual float getInjectorMassFlowRate() const = 0; + virtual void postState(float deadTime) const {}; + private: float m_deadtime = 0; float m_massFlowRate = 0; @@ -24,6 +26,7 @@ class InjectorModel final : public InjectorModelBase { public: DECLARE_ENGINE_PTR; + void postState(float deadtime) const override; floatms_t getDeadtime() const override; float getInjectorMassFlowRate() const override; }; diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index a2a656d5b9..1a544cc24d 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -159,20 +159,6 @@ floatms_t getRunningFuel(floatms_t baseFuel DECLARE_ENGINE_PARAMETER_SUFFIX) { /* DISPLAY_ENDIF */ -constexpr float convertToGramsPerSecond(float ccPerMinute) { - float ccPerSecond = ccPerMinute / 60; - return ccPerSecond * 0.72f; // 0.72g/cc fuel density -} - -/** - * @return per cylinder injection time, in seconds - */ -static float getInjectionDurationForFuelMass(float fuelMass DECLARE_ENGINE_PARAMETER_SUFFIX) { - float gPerSec = convertToGramsPerSecond(CONFIG(injector.flow)); - - return fuelMass / gPerSec; -} - static SpeedDensityAirmass sdAirmass(veMap); static MafAirmass mafAirmass(veMap); static AlphaNAirmass alphaNAirmass(veMap); @@ -218,7 +204,10 @@ floatms_t getBaseFuel(int rpm DECLARE_ENGINE_PARAMETER_SUFFIX) { ENGINE(engineState.ignitionLoad) = getLoadOverride(airmass.EngineLoadPercent, CONFIG(ignOverrideMode) PASS_ENGINE_PARAMETER_SUFFIX); float baseFuelMass = ENGINE(fuelComputer)->getCycleFuel(airmass.CylinderAirmass, rpm, airmass.EngineLoadPercent); - float baseFuel = getInjectionDurationForFuelMass(baseFuelMass PASS_ENGINE_PARAMETER_SUFFIX) * 1000; + + ENGINE(injectorModel)->prepare(); + float baseFuel = ENGINE(injectorModel)->getInjectionDuration(baseFuelMass); + if (cisnan(baseFuel)) { // todo: we should not have this here but https://github.com/rusefi/rusefi/issues/1690 return 0; @@ -347,20 +336,6 @@ floatms_t getInjectionDuration(int rpm DECLARE_ENGINE_PARAMETER_SUFFIX) { #endif } -/** - * @brief Injector lag correction - * @param vBatt Battery voltage. - * @return Time in ms for injection opening time based on current battery voltage - */ -floatms_t getInjectorLag(float vBatt DECLARE_ENGINE_PARAMETER_SUFFIX) { - if (cisnan(vBatt)) { - warning(OBD_System_Voltage_Malfunction, "vBatt=%.2f", vBatt); - return 0; - } - - return interpolate2d("lag", vBatt, engineConfiguration->injector.battLagCorrBins, engineConfiguration->injector.battLagCorr); -} - static FuelComputer fuelComputer(afrMap); static InjectorModel injectorModel; diff --git a/firmware/controllers/algo/fuel_math.h b/firmware/controllers/algo/fuel_math.h index e424369a41..fb4f4c4f10 100644 --- a/firmware/controllers/algo/fuel_math.h +++ b/firmware/controllers/algo/fuel_math.h @@ -26,7 +26,7 @@ float getBaroCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE); int getNumberOfInjections(injection_mode_e mode DECLARE_ENGINE_PARAMETER_SUFFIX); angle_t getInjectionOffset(float rpm, float load DECLARE_ENGINE_PARAMETER_SUFFIX); float getIatFuelCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE); -floatms_t getInjectorLag(float vBatt DECLARE_ENGINE_PARAMETER_SUFFIX); + float getCltFuelCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE); float getFuelCutOffCorrection(efitick_t nowNt, int rpm DECLARE_ENGINE_PARAMETER_SUFFIX); angle_t getCltTimingCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE); diff --git a/firmware/controllers/gauges/lcd_controller.cpp b/firmware/controllers/gauges/lcd_controller.cpp index 1417e21021..1397ea349d 100644 --- a/firmware/controllers/gauges/lcd_controller.cpp +++ b/firmware/controllers/gauges/lcd_controller.cpp @@ -200,7 +200,7 @@ static void showLine(lcd_line_e line, int screenY) { lcdPrintf("IAT corr %.2f", getIatFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE)); return; case LL_FUEL_INJECTOR_LAG: - lcdPrintf("ING LAG %.2f", getInjectorLag(engine->sensors.vBatt PASS_ENGINE_PARAMETER_SIGNATURE)); + lcdPrintf("ING LAG %.2f", engine->engineState.running.injectorLag); return; case LL_VBATT: lcdPrintf("Battery %.2fv", getVBatt(PASS_ENGINE_PARAMETER_SIGNATURE)); diff --git a/unit_tests/tests/test_fuel_map.cpp b/unit_tests/tests/test_fuel_map.cpp index 92a0e893ee..c82b1f82e3 100644 --- a/unit_tests/tests/test_fuel_map.cpp +++ b/unit_tests/tests/test_fuel_map.cpp @@ -22,9 +22,6 @@ TEST(misc, testFuelMap) { printf("Setting up FORD_ASPIRE_1996\r\n"); WITH_ENGINE_TEST_HELPER(FORD_ASPIRE_1996); - printf("*** getInjectorLag\r\n"); - assertEqualsM("lag", 1.04, getInjectorLag(12 PASS_ENGINE_PARAMETER_SUFFIX)); - for (int i = 0; i < VBAT_INJECTOR_CURVE_SIZE; i++) { eth.engine.engineConfigurationPtr->injector.battLagCorrBins[i] = i; eth.engine.engineConfigurationPtr->injector.battLagCorr[i] = 0.5 + 2 * i; @@ -62,8 +59,6 @@ TEST(misc, testFuelMap) { ASSERT_EQ( 6, iatCorrection) << "IAT"; float cltCorrection = getCltFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE); ASSERT_EQ( 7, cltCorrection) << "CLT"; - float injectorLag = getInjectorLag(getVBatt(PASS_ENGINE_PARAMETER_SIGNATURE) PASS_ENGINE_PARAMETER_SUFFIX); - ASSERT_EQ( 0, injectorLag) << "injectorLag"; engineConfiguration->mafAdcChannel = EFI_ADC_10;