From 52701e98adad42a5965eb6887a9f0dc4ab6261c7 Mon Sep 17 00:00:00 2001 From: ConnerMcLaughlin Date: Wed, 20 Dec 2017 18:07:04 -0600 Subject: [PATCH 1/5] Initial commit for missing tooth secondary This also includes setups that have Toyota 36-2+3 trigger wheels to work. --- reference/speeduino.ini | 6 +++++- speeduino/decoders.h | 4 ++++ speeduino/decoders.ino | 32 ++++++++++++++++++++++++++++++-- speeduino/globals.h | 4 +++- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 04ad75ea..9e343685 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -280,7 +280,7 @@ page = 4 fuelPumpPin= bits , U08, 6,[1:6], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID" useResync = bits, U08, 6,[7:7], "No", "Yes" sparkDur = scalar, U08, 7, "ms", 0.1, 0, 0, 25.5, 1 ; Spark duration - unused4-8 = scalar, U08, 8, "ms", 0.1, 0.0, 0.0, 25.5, 1 + cam4minus1 = bits, U08, 8,[0:7], "Single tooth cam", "4-1 cam", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" unused4-9 = scalar, U08, 9, "ms", 0.1, 0.0, 0.0, 25.5, 1 unused4-10 = scalar, U08, 10, "ms", 0.1, 0.0, 0.0, 25.5, 1 SkipCycles = scalar, U08, 11, "cycles", 1, 0, 0, 255, 0 @@ -728,6 +728,7 @@ page = 10 requiresPowerCycle = reqFuel requiresPowerCycle = numTeeth requiresPowerCycle = missingTeeth + requiresPowerCycle = cam4minus1 requiresPowerCycle = injOpen requiresPowerCycle = IgInv requiresPowerCycle = fanInv @@ -757,6 +758,7 @@ page = 10 defaultValue = pinLayout, 1 defaultValue = TrigPattern, 0 defaultValue = useResync, 1 + defaultValue = cam4minus1, 0 defaultValue = sparkMode, 0 defaultValue = indInjAng, 0 defaultValue = inj1Ang, 355 @@ -940,6 +942,7 @@ menuDialog = main TrigPattern = "The type of input trigger decoder to be used." useResync = "If enabled, sync will be rechecked once every full cycle from the cam input. This is good for accuracy, however if your cam input is noisy then this can cause issues." + cam4minus1 = "Cam mode/type also known as Secondary Trigger Pattern." numTeeth = "Number of teeth on Primary Wheel." TrigSpeed = "Primary trigger speed." missingTeeth= "Number of Missing teeth on Primary Wheel." @@ -1325,6 +1328,7 @@ menuDialog = main field = "cranking before the injectors and coils are fired" field = "Trigger edge", TrigEdge field = "Secondary trigger edge", TrigEdgeSec, { TrigPattern == 0 || TrigPattern == 2 || TrigPattern == 9 || TrigPattern == 12 } ;Missing tooth, dual wheel and Miata 9905 + field = "Missing Tooth Secondary type" cam4minus1, { TrigPattern == 0 } field = "Trigger Filter", TrigFilter field = "Re-sync every cycle", useResync, { TrigPattern == 2 || TrigPattern == 4 || TrigPattern == 7 || TrigPattern == 12 || TrigPattern == 9 } ;Dual wheel, 4G63, Audi 135, Nissan 360, Miata 99-05 field = "" diff --git a/speeduino/decoders.h b/speeduino/decoders.h index 5ece0970..9e571645 100644 --- a/speeduino/decoders.h +++ b/speeduino/decoders.h @@ -43,6 +43,10 @@ volatile unsigned long toothSystemLastToothTime = 0; //As below, but used for de volatile unsigned long toothLastToothTime = 0; //The time (micros()) that the last tooth was registered volatile unsigned long toothLastSecToothTime = 0; //The time (micros()) that the last tooth was registered on the secondary input volatile unsigned long toothLastMinusOneToothTime = 0; //The time (micros()) that the tooth before the last tooth was registered +#ifndef SMALL_FLASH_MODE +volatile unsigned long toothLastMinusOneSecToothTime = 0; //The time (micros()) that the tooth before the last tooth was registered on secondary input +volatile unsigned long targetGap2; +#endif volatile unsigned long toothOneTime = 0; //The time (micros()) that tooth 1 last triggered volatile unsigned long toothOneMinusOneTime = 0; //The 2nd to last time (micros()) that tooth 1 last triggered volatile bool revolutionOne = 0; // For sequential operation, this tracks whether the current revolution is 1 or 2 (not 1) diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index abe970d1..2a3c9dcd 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -128,6 +128,7 @@ void triggerSetup_missingTooth() if(configPage2.TrigSpeed == 1) { triggerToothAngle = 720 / configPage2.triggerTeeth; } //Account for cam speed missing tooth triggerActualTeeth = configPage2.triggerTeeth - configPage2.triggerMissingTeeth; //The number of physical teeth on the wheel. Doing this here saves us a calculation each time in the interrupt triggerFilterTime = (int)(1000000 / (MAX_RPM / 60 * configPage2.triggerTeeth)); //Trigger filter time is the shortest possible time (in uS) that there can be between crank teeth (ie at max RPM). Any pulses that occur faster than this time will be disgarded as noise + triggerSecFilterTime = (cam4minus1 == true) ? (int)(1000000 / (MAX_RPM / 60 * 4)) / 2 : (int)(1000000 / (MAX_RPM / 60 * 2)) / 2; //Same as above, but fixed at 2 teeth on the secondary input and divided by 2 (for cam speed) secondDerivEnabled = false; decoderIsSequential = false; checkSyncToothCount = (configPage2.triggerTeeth) >> 1; //50% of the total teeth. @@ -197,8 +198,35 @@ void triggerPri_missingTooth() void triggerSec_missingTooth() { - //TODO: This should really have filtering enabled on the secondary input. - revolutionOne = 1; + curTime2 = micros(); + curGap2 = curTime2 - toothLastSecToothTime; + if( (toothLastSecToothTime == 0) || (toothLastMinusOneSecToothTime == 0) ) { curGap2 = 0; } + if ( curGap2 >= triggerSecFilterTime ) + { +#ifndef SMALL_FLASH_MODE + if ( cam4minus1 == true ) + { + targetGap2 = (3 * (toothLastSecToothTime - toothLastMinusOneSecToothTime)) >> 1; //If the time between the current tooth and the last is greater than 1.5x the time between the last tooth and the tooth before that, we make the assertion that we must be at the first tooth after the gap + toothLastMinusOneSecToothTime = toothLastSecToothTime; + if ( ( curGap2 >= targetGap2 ) || ( secondaryToothCount > 3 ) ) + { + secondaryToothCount = 1; + revolutionOne = 1; //Sequential revolution reset + triggerSecFilterTime = 0; //This is used to prevent a condition where serious intermitent signals (Eg someone furiously plugging the sensor wire in and out) can leave the filter in an unrecoverable state + } + else + { + triggerSecFilterTime = curGap2 >> 2; //Set filter at 25% of the current speed. Filter can only be recalc'd for the regular teeth, not the missing one. + secondaryToothCount++; + } + } + else +#endif + { + revolutionOne = 1; //Sequential revolution reset + } + toothLastSecToothTime = curTime2; + } //Trigger filter } uint16_t getRPM_missingTooth() diff --git a/speeduino/globals.h b/speeduino/globals.h index 4a0c1b4f..2b9bc705 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -428,7 +428,7 @@ struct config2 { byte useResync : 1; byte sparkDur; //Spark duration in ms * 10 - byte unused4_8; + bool cam4minus1; //Mode for Missing tooth secondary trigger. Either single tooth cam wheel or 4-1 byte unused4_9; byte unused4_10; byte StgCycles; //The number of initial cycles before the ignition should fire when first cranking @@ -727,5 +727,7 @@ extern byte cltCalibrationTable[CALIBRATION_TABLE_SIZE]; extern byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; extern byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; +// alias(es) for ease of code reading!! +bool& cam4minus1 = configPage2.cam4minus1; #endif // GLOBALS_H From dc0e1c7b8880f6e39d9adc10b52c53787ee2ad8b Mon Sep 17 00:00:00 2001 From: ConnerMcLaughlin Date: Fri, 22 Dec 2017 20:18:28 -0600 Subject: [PATCH 2/5] Correction of choices for cam4minus1 var In speeduino.ini you have to explictly show an INVALID placeholder for all the choices a constant can have. There were only 130 for cam4minus1. The numer was increased to 254. --- reference/speeduino.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 9e343685..c0ed3537 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -280,7 +280,7 @@ page = 4 fuelPumpPin= bits , U08, 6,[1:6], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID" useResync = bits, U08, 6,[7:7], "No", "Yes" sparkDur = scalar, U08, 7, "ms", 0.1, 0, 0, 25.5, 1 ; Spark duration - cam4minus1 = bits, U08, 8,[0:7], "Single tooth cam", "4-1 cam", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" + cam4minus1 = bits, U08, 8,[0:7], "Single tooth cam", "4-1 cam", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" unused4-9 = scalar, U08, 9, "ms", 0.1, 0.0, 0.0, 25.5, 1 unused4-10 = scalar, U08, 10, "ms", 0.1, 0.0, 0.0, 25.5, 1 SkipCycles = scalar, U08, 11, "cycles", 1, 0, 0, 255, 0 From 0622666434285edbae9ca960018ae2f662742d65 Mon Sep 17 00:00:00 2001 From: ConnerMcLaughlin Date: Sun, 31 Dec 2017 22:27:56 -0600 Subject: [PATCH 3/5] Special fix for STM32F103C8 uCs Was not compiling because of misplaced and/or insufficient preprocessor directives --- speeduino/decoders.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index 2a3c9dcd..baef59f1 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -200,7 +200,11 @@ void triggerSec_missingTooth() { curTime2 = micros(); curGap2 = curTime2 - toothLastSecToothTime; - if( (toothLastSecToothTime == 0) || (toothLastMinusOneSecToothTime == 0) ) { curGap2 = 0; } + if( (toothLastSecToothTime == 0) +#ifndef SMALL_FLASH_MODE + || (toothLastMinusOneSecToothTime == 0 ) +#endif + ) { curGap2 = 0; } if ( curGap2 >= triggerSecFilterTime ) { #ifndef SMALL_FLASH_MODE From b2ed338f2ef83c84d188c80b2e1c37c5b34ad798 Mon Sep 17 00:00:00 2001 From: ConnerMcLaughlin Date: Sat, 6 Jan 2018 13:29:28 -0600 Subject: [PATCH 4/5] MISRA violation fix rule 12.1 was being violated and this is the fix where several sets of parentheses are removed. --- speeduino/decoders.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index baef59f1..7ebc9bef 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -128,7 +128,7 @@ void triggerSetup_missingTooth() if(configPage2.TrigSpeed == 1) { triggerToothAngle = 720 / configPage2.triggerTeeth; } //Account for cam speed missing tooth triggerActualTeeth = configPage2.triggerTeeth - configPage2.triggerMissingTeeth; //The number of physical teeth on the wheel. Doing this here saves us a calculation each time in the interrupt triggerFilterTime = (int)(1000000 / (MAX_RPM / 60 * configPage2.triggerTeeth)); //Trigger filter time is the shortest possible time (in uS) that there can be between crank teeth (ie at max RPM). Any pulses that occur faster than this time will be disgarded as noise - triggerSecFilterTime = (cam4minus1 == true) ? (int)(1000000 / (MAX_RPM / 60 * 4)) / 2 : (int)(1000000 / (MAX_RPM / 60 * 2)) / 2; //Same as above, but fixed at 2 teeth on the secondary input and divided by 2 (for cam speed) + triggerSecFilterTime = (int)((cam4minus1 == true) ? 1000000 * 60 / MAX_RPM / 4 / 2 : 1000000 * 60 / MAX_RPM / 2 / 2); //Same as above, but fixed at 2 teeth on the secondary input and divided by 2 (for cam speed) secondDerivEnabled = false; decoderIsSequential = false; checkSyncToothCount = (configPage2.triggerTeeth) >> 1; //50% of the total teeth. From b6096329d8c186ec1ac767cea2a0c9b77dd11195 Mon Sep 17 00:00:00 2001 From: ConnerMcLaughlin Date: Mon, 15 Jan 2018 20:38:37 -0600 Subject: [PATCH 5/5] cam4minus1 var is now trigPatternSec All the instances of the variable name cam4minus1 is changed to trigPatternSec --- reference/speeduino.ini | 10 +++++----- speeduino/decoders.ino | 4 ++-- speeduino/globals.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index c0ed3537..72902c7b 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -280,7 +280,7 @@ page = 4 fuelPumpPin= bits , U08, 6,[1:6], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID" useResync = bits, U08, 6,[7:7], "No", "Yes" sparkDur = scalar, U08, 7, "ms", 0.1, 0, 0, 25.5, 1 ; Spark duration - cam4minus1 = bits, U08, 8,[0:7], "Single tooth cam", "4-1 cam", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" + trigPatternSec = bits, U08, 8,[0:7], "Single tooth cam", "4-1 cam", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" unused4-9 = scalar, U08, 9, "ms", 0.1, 0.0, 0.0, 25.5, 1 unused4-10 = scalar, U08, 10, "ms", 0.1, 0.0, 0.0, 25.5, 1 SkipCycles = scalar, U08, 11, "cycles", 1, 0, 0, 255, 0 @@ -728,7 +728,7 @@ page = 10 requiresPowerCycle = reqFuel requiresPowerCycle = numTeeth requiresPowerCycle = missingTeeth - requiresPowerCycle = cam4minus1 + requiresPowerCycle = trigPatternSec requiresPowerCycle = injOpen requiresPowerCycle = IgInv requiresPowerCycle = fanInv @@ -758,7 +758,7 @@ page = 10 defaultValue = pinLayout, 1 defaultValue = TrigPattern, 0 defaultValue = useResync, 1 - defaultValue = cam4minus1, 0 + defaultValue = trigPatternSec, 0 defaultValue = sparkMode, 0 defaultValue = indInjAng, 0 defaultValue = inj1Ang, 355 @@ -942,7 +942,7 @@ menuDialog = main TrigPattern = "The type of input trigger decoder to be used." useResync = "If enabled, sync will be rechecked once every full cycle from the cam input. This is good for accuracy, however if your cam input is noisy then this can cause issues." - cam4minus1 = "Cam mode/type also known as Secondary Trigger Pattern." + trigPatternSec = "Cam mode/type also known as Secondary Trigger Pattern." numTeeth = "Number of teeth on Primary Wheel." TrigSpeed = "Primary trigger speed." missingTeeth= "Number of Missing teeth on Primary Wheel." @@ -1328,7 +1328,7 @@ menuDialog = main field = "cranking before the injectors and coils are fired" field = "Trigger edge", TrigEdge field = "Secondary trigger edge", TrigEdgeSec, { TrigPattern == 0 || TrigPattern == 2 || TrigPattern == 9 || TrigPattern == 12 } ;Missing tooth, dual wheel and Miata 9905 - field = "Missing Tooth Secondary type" cam4minus1, { TrigPattern == 0 } + field = "Missing Tooth Secondary type" trigPatternSec, { TrigPattern == 0 } field = "Trigger Filter", TrigFilter field = "Re-sync every cycle", useResync, { TrigPattern == 2 || TrigPattern == 4 || TrigPattern == 7 || TrigPattern == 12 || TrigPattern == 9 } ;Dual wheel, 4G63, Audi 135, Nissan 360, Miata 99-05 field = "" diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index 7ebc9bef..b5ef7637 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -128,7 +128,7 @@ void triggerSetup_missingTooth() if(configPage2.TrigSpeed == 1) { triggerToothAngle = 720 / configPage2.triggerTeeth; } //Account for cam speed missing tooth triggerActualTeeth = configPage2.triggerTeeth - configPage2.triggerMissingTeeth; //The number of physical teeth on the wheel. Doing this here saves us a calculation each time in the interrupt triggerFilterTime = (int)(1000000 / (MAX_RPM / 60 * configPage2.triggerTeeth)); //Trigger filter time is the shortest possible time (in uS) that there can be between crank teeth (ie at max RPM). Any pulses that occur faster than this time will be disgarded as noise - triggerSecFilterTime = (int)((cam4minus1 == true) ? 1000000 * 60 / MAX_RPM / 4 / 2 : 1000000 * 60 / MAX_RPM / 2 / 2); //Same as above, but fixed at 2 teeth on the secondary input and divided by 2 (for cam speed) + triggerSecFilterTime = (int)((trigPatternSec == true) ? 1000000 * 60 / MAX_RPM / 4 / 2 : 1000000 * 60 / MAX_RPM / 2 / 2); //Same as above, but fixed at 2 teeth on the secondary input and divided by 2 (for cam speed) secondDerivEnabled = false; decoderIsSequential = false; checkSyncToothCount = (configPage2.triggerTeeth) >> 1; //50% of the total teeth. @@ -208,7 +208,7 @@ void triggerSec_missingTooth() if ( curGap2 >= triggerSecFilterTime ) { #ifndef SMALL_FLASH_MODE - if ( cam4minus1 == true ) + if ( trigPatternSec == true ) { targetGap2 = (3 * (toothLastSecToothTime - toothLastMinusOneSecToothTime)) >> 1; //If the time between the current tooth and the last is greater than 1.5x the time between the last tooth and the tooth before that, we make the assertion that we must be at the first tooth after the gap toothLastMinusOneSecToothTime = toothLastSecToothTime; diff --git a/speeduino/globals.h b/speeduino/globals.h index 2b9bc705..c6eb04a7 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -428,7 +428,7 @@ struct config2 { byte useResync : 1; byte sparkDur; //Spark duration in ms * 10 - bool cam4minus1; //Mode for Missing tooth secondary trigger. Either single tooth cam wheel or 4-1 + bool trigPatternSec; //Mode for Missing tooth secondary trigger. Either single tooth cam wheel or 4-1 byte unused4_9; byte unused4_10; byte StgCycles; //The number of initial cycles before the ignition should fire when first cranking @@ -728,6 +728,6 @@ extern byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; extern byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; // alias(es) for ease of code reading!! -bool& cam4minus1 = configPage2.cam4minus1; +bool& trigPatternSec = configPage2.trigPatternSec; #endif // GLOBALS_H