From 6ee94e556203add151b8dc78f3d869a3a7becd54 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 24 Mar 2024 13:18:14 -0400 Subject: [PATCH] odd fire timing_offset_cylinder not accounted by injection revert #6095 odd fire angles are not right during cranking #6281 only:proteus_f7 --- firmware/controllers/algo/advance_map.cpp | 6 +++++- firmware/controllers/math/engine_math.cpp | 10 +++------- .../test_odd_firing_engine.cpp | 20 +++++++++---------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/firmware/controllers/algo/advance_map.cpp b/firmware/controllers/algo/advance_map.cpp index 384db68fb8..cf04a58454 100644 --- a/firmware/controllers/algo/advance_map.cpp +++ b/firmware/controllers/algo/advance_map.cpp @@ -209,7 +209,11 @@ angle_t getAdvance(int rpm, float engineLoad) { } angle_t getCylinderIgnitionTrim(size_t cylinderNumber, int rpm, float ignitionLoad) { - return interpolate3d( + // we have two separate per-cylinder trims, that's a feature + // Plus or minus any adjustment if this is an odd-fire engine + auto adjustment = engineConfiguration->timing_offset_cylinder[cylinderNumber]; + + return adjustment + interpolate3d( config->ignTrims[cylinderNumber].table, config->ignTrimLoadBins, ignitionLoad, config->ignTrimRpmBins, rpm diff --git a/firmware/controllers/math/engine_math.cpp b/firmware/controllers/math/engine_math.cpp index 6c50652c2f..25d4a15b67 100644 --- a/firmware/controllers/math/engine_math.cpp +++ b/firmware/controllers/math/engine_math.cpp @@ -416,18 +416,14 @@ void prepareOutputSignals() { } angle_t getPerCylinderFiringOrderOffset(uint8_t cylinderIndex, uint8_t cylinderNumber) { + UNUSED(cylinderNumber); // TODO: technical debt // base = position of this cylinder in the firing order. // We get a cylinder every n-th of an engine cycle where N is the number of cylinders auto firingOrderOffset = engine->engineState.engineCycle * cylinderIndex / engineConfiguration->cylindersCount; - // Plus or minus any adjustment if this is an odd-fire engine - auto adjustment = engineConfiguration->timing_offset_cylinder[cylinderNumber]; + assertAngleRange(firingOrderOffset, "getPerCylinderFiringOrderOffset", ObdCode::CUSTOM_ERR_CYL_ANGLE); - auto result = firingOrderOffset + adjustment; - - assertAngleRange(result, "getCylinderAngle", ObdCode::CUSTOM_ERR_CYL_ANGLE); - - return result; + return firingOrderOffset; } void setTimingRpmBin(float from, float to) { diff --git a/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp b/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp index 7e8e7b5103..53c949692c 100644 --- a/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp +++ b/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp @@ -37,18 +37,16 @@ TEST(OddFire, hd) { // ASSERT_NEAR(-200.0, eth.timeToAngle(-66.66666), EPS3D); // ASSERT_NEAR(160.0, eth.timeToAngle(53.333333), EPS3D); // ASSERT_NEAR(-168.0, eth.timeToAngle(-56.0), EPS3D); -// ASSERT_NEAR(-194, eth.timeToAngle(-64.666666), EPS3D); -// ASSERT_NEAR(-201.0, eth.timeToAngle(-67.0), EPS3D); -// ASSERT_NEAR(-522.0, eth.timeToAngle(-174.0), EPS3D); -// ASSERT_NEAR(354.0, eth.timeToAngle(118.0), EPS3D); -// ASSERT_NEAR(127.0, eth.timeToAngle(42.3333333), EPS3D); // ASSERT_NEAR(32, eth.timeToAngle(10.66666666), EPS3D); - angle_t expectedAngle3 = -180 - cylinderTwo - timing; + angle_t expectedAngle3 = -180 + cylinderTwo - timing; - ASSERT_EQ( 6, engine->executor.size()); + ASSERT_EQ( 8, engine->executor.size()); eth.assertEvent5("spark down#3", 3, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle3)); + angle_t expectedAngle7 = 180 - cylinderOne - timing; + eth.assertEvent5("spark down#7", 7, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle7)); + eth.assertRpm( 500, "spinning-RPM#1"); engine->executor.executeAll(eth.getTimeNowUs() + MS2US(1000000)); @@ -58,8 +56,8 @@ TEST(OddFire, hd) { ASSERT_NEAR(0.0069257142022, getInjectionMass(200), EPS3D); ASSERT_EQ( 8, engine->executor.size()); - eth.assertEvent5("spark down2#1", 1, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(-540 + cylinderOne - timing)); - eth.assertEvent5("fuel down2#4", 4, (void*)turnInjectionPinLow, eth.angleToTimeUs(PORT_INJECTION_OFFSET + 180 + cylinderOne)); - eth.assertEvent5("spark down2#5", 5, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(-180 - cylinderTwo - timing)); - eth.assertEvent5("fuel down2#7", 7, (void*)turnInjectionPinLow, eth.angleToTimeUs(PORT_INJECTION_OFFSET + 540 - cylinderTwo)); + eth.assertEvent5("fuel down2#1", 1, (void*)turnInjectionPinLow, eth.angleToTimeUs(180 + PORT_INJECTION_OFFSET)); + eth.assertEvent5("spark down2#3", 3, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(-180 + cylinderTwo - timing)); + eth.assertEvent5("fuel down2#5", 5, (void*)turnInjectionPinLow, eth.angleToTimeUs(540 + PORT_INJECTION_OFFSET)); + eth.assertEvent5("spark down2#7", 7, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(180 - cylinderOne - timing)); }