From eb257b2335353c35db01a432b9a318e8de3671be Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 17 May 2022 18:38:24 -0700 Subject: [PATCH] 12 tooth crank mode (#4179) * 12 tooth crank * comment * s * rusefi config --- firmware/controllers/algo/engine_types.h | 2 +- firmware/controllers/algo/rusefi_enums.h | 5 +++++ .../engine_cycle/main_trigger_callback.cpp | 5 ++++- .../trigger/decoders/trigger_structure.cpp | 8 +++++++- .../trigger/decoders/trigger_universal.cpp | 19 +++++++++++++++++++ .../trigger/decoders/trigger_universal.h | 3 +++ .../controllers/trigger/trigger_central.cpp | 2 ++ .../controllers/trigger/trigger_central.h | 1 + .../trigger/trigger_emulator_algo.cpp | 3 +++ firmware/integration/rusefi_config.txt | 2 +- 10 files changed, 46 insertions(+), 4 deletions(-) diff --git a/firmware/controllers/algo/engine_types.h b/firmware/controllers/algo/engine_types.h index 5c9150099f..772379e0ab 100644 --- a/firmware/controllers/algo/engine_types.h +++ b/firmware/controllers/algo/engine_types.h @@ -423,7 +423,7 @@ typedef enum { // this one is 6 cylinder, see TT_JEEP_4_cyl for 4 cylinders TT_JEEP_18_2_2_2 = 37, - TT_UNUSED_38 = 38, + TT_12_TOOTH_CRANK = 38, TT_DODGE_NEON_1995_ONLY_CRANK = 39, diff --git a/firmware/controllers/algo/rusefi_enums.h b/firmware/controllers/algo/rusefi_enums.h index c0a2f313cd..19ce65c1a0 100644 --- a/firmware/controllers/algo/rusefi_enums.h +++ b/firmware/controllers/algo/rusefi_enums.h @@ -236,6 +236,11 @@ typedef enum { */ FOUR_STROKE_THREE_TIMES_CRANK_SENSOR = 5, + // Same pattern TWELVE TIMES on the crank wheel! + // This usually means Honda, which often has a 12 tooth crank wheel or 24 tooth cam wheel + // without a missing tooth, plus a single tooth cam channel to resolve the engine phase. + FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR = 6, + } operation_mode_e; /** diff --git a/firmware/controllers/engine_cycle/main_trigger_callback.cpp b/firmware/controllers/engine_cycle/main_trigger_callback.cpp index c5a4336638..c65eefb95e 100644 --- a/firmware/controllers/engine_cycle/main_trigger_callback.cpp +++ b/firmware/controllers/engine_cycle/main_trigger_callback.cpp @@ -332,7 +332,10 @@ bool noFiringUntilVvtSync(vvt_mode_e vvtMode) { // Symmetrical crank modes require cam sync before firing // non-symmetrical cranks can use faster spin-up mode (firing in wasted/batch before VVT sync) // Examples include Nissan MR/VQ, Miata NB, etc - return operationMode == FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR || operationMode == FOUR_STROKE_THREE_TIMES_CRANK_SENSOR; + return + operationMode == FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR || + operationMode == FOUR_STROKE_THREE_TIMES_CRANK_SENSOR || + operationMode == FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR; } /** diff --git a/firmware/controllers/trigger/decoders/trigger_structure.cpp b/firmware/controllers/trigger/decoders/trigger_structure.cpp index 4f7a75794c..631a7b9346 100644 --- a/firmware/controllers/trigger/decoders/trigger_structure.cpp +++ b/firmware/controllers/trigger/decoders/trigger_structure.cpp @@ -108,6 +108,8 @@ angle_t TriggerWaveform::getCycleDuration() const { return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_THREE_TIMES_CRANK_SENSOR_DIVIDER; case FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR: return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_CRANK_SENSOR_DIVIDER; + case FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR: + return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_TWELVE_TIMES_CRANK_SENSOR_DIVIDER; case FOUR_STROKE_CRANK_SENSOR: case TWO_STROKE: return TWO_STROKE_CYCLE_DURATION; @@ -124,6 +126,7 @@ angle_t TriggerWaveform::getCycleDuration() const { */ size_t TriggerWaveform::getLength() const { /** + * 24 for FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR * 6 for FOUR_STROKE_THREE_TIMES_CRANK_SENSOR * 4 for FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR * 2 for FOUR_STROKE_CRANK_SENSOR @@ -726,7 +729,10 @@ void TriggerWaveform::initializeTriggerWaveform(operation_mode_e triggerOperatio initialize2jzGE1_12(this); break; - case TT_UNUSED_38: + case TT_12_TOOTH_CRANK: + configure12ToothCrank(this); + break; + case TT_NISSAN_SR20VE: initializeNissanSR20VE_4(this); break; diff --git a/firmware/controllers/trigger/decoders/trigger_universal.cpp b/firmware/controllers/trigger/decoders/trigger_universal.cpp index f8c7967f12..c9721c6f37 100644 --- a/firmware/controllers/trigger/decoders/trigger_universal.cpp +++ b/firmware/controllers/trigger/decoders/trigger_universal.cpp @@ -146,3 +146,22 @@ void configureQuickStartSenderWheel(TriggerWaveform *s) { s->addEvent360(offset + 270, T_PRIMARY, TV_RISE); s->addEvent360(offset + 340, T_PRIMARY, TV_FALL); } + +// Useful for: +// - Honda 24+1 (set this on crank primary, single tooth cam) +// - AEM 24+1 CAS wheel (same config as Honda) +void configure12ToothCrank(TriggerWaveform* s) { + s->initialize(FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR); + + s->useRiseEdge = true; + s->shapeWithoutTdc = true; + + // Sync after 3 good teeth + for (size_t i = 0; i < 3; i++) { + s->setTriggerSynchronizationGap3(i, 0.75f, 1.25f); + } + + // Just a single tooth with 50% duty cycle + s->addEventAngle(15, T_PRIMARY, TV_FALL); + s->addEventAngle(30, T_PRIMARY, TV_RISE); +} diff --git a/firmware/controllers/trigger/decoders/trigger_universal.h b/firmware/controllers/trigger/decoders/trigger_universal.h index 11e7fcef46..6d81ddd0ed 100644 --- a/firmware/controllers/trigger/decoders/trigger_universal.h +++ b/firmware/controllers/trigger/decoders/trigger_universal.h @@ -29,3 +29,6 @@ void configureQuickStartSenderWheel(TriggerWaveform *s); // TT_KAWA_KX450F void configureKawaKX450F(TriggerWaveform *s); + +// TT_12_TOOTH_CRANK +void configure12ToothCrank(TriggerWaveform*); diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index bef764b1bd..f632360c22 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -92,6 +92,8 @@ static int getCrankDivider(operation_mode_e operationMode) { return SYMMETRICAL_CRANK_SENSOR_DIVIDER; case FOUR_STROKE_THREE_TIMES_CRANK_SENSOR: return SYMMETRICAL_THREE_TIMES_CRANK_SENSOR_DIVIDER; + case FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR: + return SYMMETRICAL_TWELVE_TIMES_CRANK_SENSOR_DIVIDER; default: case FOUR_STROKE_CAM_SENSOR: case TWO_STROKE: diff --git a/firmware/controllers/trigger/trigger_central.h b/firmware/controllers/trigger/trigger_central.h index 695f2804be..533fcc1074 100644 --- a/firmware/controllers/trigger/trigger_central.h +++ b/firmware/controllers/trigger/trigger_central.h @@ -142,3 +142,4 @@ void onConfigurationChangeTriggerCallback(); #define SYMMETRICAL_CRANK_SENSOR_DIVIDER 4 #define SYMMETRICAL_THREE_TIMES_CRANK_SENSOR_DIVIDER 6 +#define SYMMETRICAL_TWELVE_TIMES_CRANK_SENSOR_DIVIDER 24 diff --git a/firmware/controllers/trigger/trigger_emulator_algo.cpp b/firmware/controllers/trigger/trigger_emulator_algo.cpp index 0d88d5deda..ad76f39ec4 100644 --- a/firmware/controllers/trigger/trigger_emulator_algo.cpp +++ b/firmware/controllers/trigger/trigger_emulator_algo.cpp @@ -72,12 +72,15 @@ static float getRpmMultiplier(operation_mode_e mode) { return SYMMETRICAL_THREE_TIMES_CRANK_SENSOR_DIVIDER / 2; } else if (mode == FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR) { return SYMMETRICAL_CRANK_SENSOR_DIVIDER / 2; + } else if (mode == FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR) { + return SYMMETRICAL_TWELVE_TIMES_CRANK_SENSOR_DIVIDER / 2; } else if (mode == FOUR_STROKE_CAM_SENSOR) { return 0.5; } else if (mode == FOUR_STROKE_CRANK_SENSOR) { // unit test coverage still runs if the value below is changed to '2' not a great sign! return 1; } + return 1; } diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 426bf87494..7d8a49dd3a 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -579,7 +579,7 @@ adc_channel_e fuelLevelSensor;+This is the processor pin that your fuel level se struct trigger_config_s @brief Trigger wheel(s) configuration -#define trigger_type_e_enum "custom toothed wheel", "Ford Aspire", "Dodge Neon 1995", "Miata NA", "INVALID", "GM_7X", "Cooper R50", "Mazda SOHC 4", "60/2", "36/1", "Mercedes Two Segment", "Mitsubishi 4G93", "Honda 4+24", "Honda 1+4+24", "Dodge Neon 2003", "Mazda DOHC 1+4", "1+1", "INVALID", "Single Tooth", "Dodge Ram 1+16", "60/2 VW", "Honda 1+24", "Dodge Stratus", "36_2_2_2", "Nissan Primera", "dev 2JZ 3/34 simulator", "Rover K", "GM 24x 5 degree", "Honda CBR 600", "2JZ_1_12", "Honda CBR 600 custom", "3/1 skipped", "Dodge Neon 2003 crank", "Miata NB", "INVALID", "INVALID", "Subaru 7+6", "Jeep 18-2-2-2", "INVALID", "Dodge Neon 1995 crank only", "Jeep XJ 4 cyl", "FiatIAQ_P8", "Mazda Z5", "INVALID", "Renix 44-2-2", "Renix 66-2-2-2", "Honda K 12+1", "INVALID", "36/2", "Subaru SVX", "1+16", "Subaru 7 without 6", "INVALID", "TriTach", "GM 60/2/2/2", "Skoda Favorit", "Barra 3+1 Cam", "Kawa KX450F", "Nissan VQ35", "INVALID", "Nissan VQ30", "Nissan QR25", "Mitsubishi 3A92", "Subaru SVX Crank 1", "Subaru SVX Cam VVT", "Ford PIP", "Suzuki G13B", "Honda K 4+1", "Nissan MR18 Crank", "32/2", "36-2-1", "36-2-1-1", "INVALID", "INVALID", "GM 24x 3 degree", "trg75" +#define trigger_type_e_enum "custom toothed wheel", "Ford Aspire", "Dodge Neon 1995", "Miata NA", "INVALID", "GM_7X", "Cooper R50", "Mazda SOHC 4", "60/2", "36/1", "Mercedes Two Segment", "Mitsubishi 4G93", "Honda 4+24", "Honda 1+4+24", "Dodge Neon 2003", "Mazda DOHC 1+4", "1+1", "INVALID", "Single Tooth", "Dodge Ram 1+16", "60/2 VW", "Honda 1+24", "Dodge Stratus", "36_2_2_2", "Nissan Primera", "dev 2JZ 3/34 simulator", "Rover K", "GM 24x 5 degree", "Honda CBR 600", "2JZ_1_12", "Honda CBR 600 custom", "3/1 skipped", "Dodge Neon 2003 crank", "Miata NB", "INVALID", "INVALID", "Subaru 7+6", "Jeep 18-2-2-2", "12 tooth crank", "Dodge Neon 1995 crank only", "Jeep XJ 4 cyl", "FiatIAQ_P8", "Mazda Z5", "INVALID", "Renix 44-2-2", "Renix 66-2-2-2", "Honda K 12+1", "INVALID", "36/2", "Subaru SVX", "1+16", "Subaru 7 without 6", "INVALID", "TriTach", "GM 60/2/2/2", "Skoda Favorit", "Barra 3+1 Cam", "Kawa KX450F", "Nissan VQ35", "INVALID", "Nissan VQ30", "Nissan QR25", "Mitsubishi 3A92", "Subaru SVX Crank 1", "Subaru SVX Cam VVT", "Ford PIP", "Suzuki G13B", "Honda K 4+1", "Nissan MR18 Crank", "32/2", "36-2-1", "36-2-1-1", "INVALID", "INVALID", "GM 24x 3 degree", "trg75" custom trigger_type_e 4 bits, U32, @OFFSET@, [0:6], @@trigger_type_e_enum@@ trigger_type_e type;+https://github.com/rusefi/rusefi/wiki/All-Supported-Triggers\nset trigger_type X