From e561836c583b2507cc0f7ffd7d1765755fb9fcfa Mon Sep 17 00:00:00 2001 From: Andrey G Date: Wed, 2 Jun 2021 19:19:52 +0300 Subject: [PATCH] trigger: subaru 7+6: update cranck angles, add comments (#2789) --- .../trigger/decoders/trigger_subaru.cpp | 101 ++++++++++-------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/firmware/controllers/trigger/decoders/trigger_subaru.cpp b/firmware/controllers/trigger/decoders/trigger_subaru.cpp index ded24e66fb..9c0a41ecfa 100644 --- a/firmware/controllers/trigger/decoders/trigger_subaru.cpp +++ b/firmware/controllers/trigger/decoders/trigger_subaru.cpp @@ -49,77 +49,90 @@ void initialize36_2_2_2(TriggerWaveform *s) { static void initializeSubaru7_6(TriggerWaveform *s, bool withCrankWheel) { s->initialize(FOUR_STROKE_CAM_SENSOR); - float magic = 333; - + /* To make trigger decoder happy last event should be exactly at 720 + * This code generates two trigger patterns: crank+cam (7+6) and + * cam only (7-6). + * So last event should be CAM event + * Crank: --------||-|---||-|-----||-|---||-| + * Cam: -|-|-|------|------!-|------|------ + * '!' pulse is selected as event at 720 + * So next event is the first one on following description + * '!' pulse happens 20 degrees ATDC #2 (third in order) + * or 180 + 180 + 20. So we have */ s->tdcPosition = 160 + 360; float width = 5; - s->addEvent720(15 - width, T_PRIMARY, TV_RISE); - s->addEvent720(15, T_PRIMARY, TV_FALL); + /* 97 degrees BTDC, but we have 20 degrees shift: + * 180 - 97 - 20 = 63 */ + #define SUBARU76_CRANK_PULSE0(cycle) \ + s->addEvent720((180 * (cycle)) + 63 - width, T_SECONDARY, TV_RISE); \ + s->addEvent720((180 * (cycle)) + 63, T_SECONDARY, TV_FALL) + /* 65 degrees BTDC, but we have 20 degrees shift: + * 180 - 65 - 20 = 95 */ + #define SUBARU76_CRANK_PULSE1(cycle) \ + s->addEvent720((180 * (cycle)) + 95 - width, T_SECONDARY, TV_RISE); \ + s->addEvent720((180 * (cycle)) + 95, T_SECONDARY, TV_FALL) + /* 10 degrees BTDC, but we have 20 degrees shift: + * 180 - 10 - 20 = 150 */ + #define SUBARU76_CRANK_PULSE2(cycle) \ + s->addEvent720((180 * (cycle)) + 150 - width, T_SECONDARY, TV_RISE); \ + s->addEvent720((180 * (cycle)) + 150, T_SECONDARY, TV_FALL) + + #define SUBARU76_CAM_PULSE(cycle, offset) \ + s->addEvent720((180 * (cycle)) + (offset) - width, T_PRIMARY, TV_RISE); \ + s->addEvent720((180 * (cycle)) + (offset), T_PRIMARY, TV_FALL) + + /* (TDC#2 + 20) + 15 */ + SUBARU76_CAM_PULSE(0, +15); if (withCrankWheel) { - s->addEvent720(66 - width, T_SECONDARY, TV_RISE); - s->addEvent720(66, T_SECONDARY, TV_FALL); - - s->addEvent720(98 - width, T_SECONDARY, TV_RISE); - s->addEvent720(98, T_SECONDARY, TV_FALL); - - s->addEvent720(153 - width, T_SECONDARY, TV_RISE); - s->addEvent720(153, T_SECONDARY, TV_FALL); - + SUBARU76_CRANK_PULSE0(0); + SUBARU76_CRANK_PULSE1(0); + SUBARU76_CRANK_PULSE2(0); } - s->addEvent720(180 - width, T_PRIMARY, TV_RISE); - s->addEvent720(180, T_PRIMARY, TV_FALL); + + /* (TDC#4 + 20) */ + SUBARU76_CAM_PULSE(1, 0); if (withCrankWheel) { - s->addEvent720(246 - width, T_SECONDARY, TV_RISE); - s->addEvent720(246, T_SECONDARY, TV_FALL); - s->addEvent720(magic - 55 - width, T_SECONDARY, TV_RISE); - s->addEvent720(magic - 55, T_SECONDARY, TV_FALL); - s->addEvent720(333 - width, T_SECONDARY, TV_RISE); - s->addEvent720(333, T_SECONDARY, TV_FALL); + SUBARU76_CRANK_PULSE0(1); + SUBARU76_CRANK_PULSE1(1); + SUBARU76_CRANK_PULSE2(1); } - s->addEvent720(345 - width, T_PRIMARY, TV_RISE); - s->addEvent720(345, T_PRIMARY, TV_FALL); + /* (TDC#1 + 20) - 15 */ + SUBARU76_CAM_PULSE(2, -15); - s->addEvent720(360 - width, T_PRIMARY, TV_RISE); - s->addEvent720(360, T_PRIMARY, TV_FALL); + /* (TDC#1 + 20) */ + SUBARU76_CAM_PULSE(2, 0); - s->addEvent720(375 - width, T_PRIMARY, TV_RISE); - s->addEvent720(375, T_PRIMARY, TV_FALL); + /* (TDC#1 + 20) + 15 */ + SUBARU76_CAM_PULSE(2, +15); if (withCrankWheel) { - s->addEvent720(426 - width, T_SECONDARY, TV_RISE); - s->addEvent720(426, T_SECONDARY, TV_FALL); - s->addEvent720(magic + 180 - 55 - width, T_SECONDARY, TV_RISE); - s->addEvent720(magic + 180 - 55, T_SECONDARY, TV_FALL); - s->addEvent720(513 - width, T_SECONDARY, TV_RISE); - s->addEvent720(513, T_SECONDARY, TV_FALL); + SUBARU76_CRANK_PULSE0(2); + SUBARU76_CRANK_PULSE1(2); + SUBARU76_CRANK_PULSE2(2); } - s->addEvent720(540 - width, T_PRIMARY, TV_RISE); - s->addEvent720(540, T_PRIMARY, TV_FALL); + /* (TDC#3 + 20) */ + SUBARU76_CAM_PULSE(3, 0); if (withCrankWheel) { - s->addEvent720(606 - width, T_SECONDARY, TV_RISE); - s->addEvent720(606, T_SECONDARY, TV_FALL); - s->addEvent720(magic + 360 - 55 - width, T_SECONDARY, TV_RISE); - s->addEvent720(magic + 360 - 55, T_SECONDARY, TV_FALL); - s->addEvent720(693 - width, T_SECONDARY, TV_RISE); - s->addEvent720(693, T_SECONDARY, TV_FALL); + SUBARU76_CRANK_PULSE0(3); + SUBARU76_CRANK_PULSE1(3); + SUBARU76_CRANK_PULSE2(3); } - s->addEvent720(720 - width, T_PRIMARY, TV_RISE); - s->addEvent720(720, T_PRIMARY, TV_FALL); + /* (TDC#2 + 20) */ + SUBARU76_CAM_PULSE(4, 0); // why is this trigger gap wider than average? s->setTriggerSynchronizationGap2(6.53 * TRIGGER_GAP_DEVIATION_LOW, 10.4 * TRIGGER_GAP_DEVIATION_HIGH); s->setTriggerSynchronizationGap3(1, 0.8 * TRIGGER_GAP_DEVIATION_LOW, 1 * TRIGGER_GAP_DEVIATION_HIGH); s->useOnlyPrimaryForSync = true; - } void initializeSubaruOnly7(TriggerWaveform *s) {