From 741116378bf0c225570aed8184b0258a418645e5 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sat, 23 Jun 2018 08:32:41 -0500 Subject: [PATCH] Coasting Fuel Cut Fixes (#596) * config changes * generated * new logic for MAP coast cutoff * typo * fix unit test * add short duration injection fix * add f suffix to constant --- firmware/controllers/algo/engine_configuration.cpp | 1 + .../algo/engine_configuration_generated_structures.h | 7 ++++--- firmware/controllers/algo/fuel_math.cpp | 6 ++++-- firmware/controllers/algo/rusefi_generated.h | 4 ++-- firmware/controllers/trigger/main_trigger_callback.cpp | 9 +++++++++ firmware/integration/rusefi_config.txt | 4 ++-- firmware/tunerstudio/rusefi.ini | 6 +++--- java_console/models/src/com/rusefi/config/Fields.java | 6 +++--- unit_tests/test_fuelCut.cpp | 1 + 9 files changed, 29 insertions(+), 15 deletions(-) diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index 6edb6b0fde..c65c1df5ae 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -492,6 +492,7 @@ static void setDefaultFuelCutParameters(DECLARE_ENGINE_PARAMETER_SIGNATURE) { engineConfiguration->coastingFuelCutRpmLow = 1300; engineConfiguration->coastingFuelCutRpmHigh = 1500; engineConfiguration->coastingFuelCutTps = 2; + engineConfiguration->coastingFuelCutMap = 30; engineConfiguration->coastingFuelCutClt = 30; } diff --git a/firmware/controllers/algo/engine_configuration_generated_structures.h b/firmware/controllers/algo/engine_configuration_generated_structures.h index da8bed2053..091bf61a67 100644 --- a/firmware/controllers/algo/engine_configuration_generated_structures.h +++ b/firmware/controllers/algo/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Jun 17 14:48:08 EDT 2018 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jun 22 11:35:17 CDT 2018 // begin #ifndef ENGINE_CONFIGURATION_GENERATED_H_ #define ENGINE_CONFIGURATION_GENERATED_H_ @@ -2126,9 +2126,10 @@ typedef struct { */ int16_t pidExtraForLowRpm; /** + * maximum manifold pressure for fuel cut * offset 3386 */ - int16_t unusedInt16; + int16_t coastingFuelCutMap; /** * CLT-based idle position for coasting (used in Auto-PID Idle mode) * offset 3388 @@ -2388,4 +2389,4 @@ typedef struct { #endif // end -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Jun 17 14:48:08 EDT 2018 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jun 22 11:35:17 CDT 2018 diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index da42c2d77d..0e2e2305d7 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -262,17 +262,19 @@ float getFuelCutOffCorrection(efitick_t nowNt, int rpm DECLARE_ENGINE_PARAMETER_ // coasting fuel cut-off correction if (boardConfiguration->coastingFuelCutEnabled) { percent_t tpsPos = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE); + float map = getMap(); // gather events + bool mapDeactivate = (map >= CONFIG(coastingFuelCutMap)); bool tpsDeactivate = (tpsPos >= CONFIG(coastingFuelCutTps)); bool cltDeactivate = cisnan(engine->sensors.clt) ? false : (engine->sensors.clt < (float)CONFIG(coastingFuelCutClt)); bool rpmDeactivate = (rpm < CONFIG(coastingFuelCutRpmLow)); bool rpmActivate = (rpm > CONFIG(coastingFuelCutRpmHigh)); // state machine (coastingFuelCutStartTime is also used as a flag) - if (!tpsDeactivate && !cltDeactivate && rpmActivate) { + if (!mapDeactivate && !tpsDeactivate && !cltDeactivate && rpmActivate) { ENGINE(engineState.coastingFuelCutStartTime) = nowNt; - } else if (tpsDeactivate || rpmDeactivate || cltDeactivate) { + } else if (mapDeactivate || tpsDeactivate || rpmDeactivate || cltDeactivate) { ENGINE(engineState.coastingFuelCutStartTime) = 0; } // enable fuelcut? diff --git a/firmware/controllers/algo/rusefi_generated.h b/firmware/controllers/algo/rusefi_generated.h index 1d8717443f..4979652653 100644 --- a/firmware/controllers/algo/rusefi_generated.h +++ b/firmware/controllers/algo/rusefi_generated.h @@ -1562,8 +1562,8 @@ #define coastingFuelCutClt_offset_hex d36 #define pidExtraForLowRpm_offset 3384 #define pidExtraForLowRpm_offset_hex d38 -#define unusedInt16_offset 3386 -#define unusedInt16_offset_hex d3a +#define coastingFuelCutMap_offset 3386 +#define coastingFuelCutMap_offset_hex d3a #define iacCoastingBins_offset 3388 #define iacCoastingBins_offset_hex d3c #define iacCoasting_offset 3452 diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index c487aa1a9d..47fcd97c81 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -245,6 +245,15 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE warning(CUSTOM_OBD_NEG_INJECTION, "Negative injection pulse %.2f", injectionDuration); return; } + + // If somebody commanded an impossibly short injection, do nothing. + // Durations under 50us-ish aren't safe for the scheduler + // as their order may be swapped, resulting in a stuck open injector + if (injectionDuration < 0.050f) + { + return; + } + floatus_t durationUs = MS2US(injectionDuration); diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 1c50ba0043..2d0b61163e 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -900,11 +900,11 @@ float[CRANKING_ADVANCE_CURVE_SIZE] crankingAdvance ;Optional timing advance t brain_pin_e[SERVO_COUNT iterate] servoOutputPins;todo: more comments int16_t coastingFuelCutRpmHigh;;"rpm", 1, 0, 0, 5000, 0 int16_t coastingFuelCutRpmLow;;"rpm", 1, 0, 0, 5000, 0 - int16_t coastingFuelCutTps;percent between 0 and 100;"%", 1, 0, 0, 100, 0 + int16_t coastingFuelCutTps;percent between 0 and 100;"%", 1, 0, 0, 100, 1 int16_t coastingFuelCutClt;Fuel cutoff is deactivated if CLTcoastingFuelCutRpmHigh = 1500; engineConfiguration->coastingFuelCutTps = 2; engineConfiguration->coastingFuelCutClt = 30; + engineConfiguration->coastingFuelCutMap = 100; // set cranking threshold engineConfiguration->cranking.rpm = 999; // configure TPS