diff --git a/speeduino/decoders.h b/speeduino/decoders.h index df37ef26..b49d34a6 100644 --- a/speeduino/decoders.h +++ b/speeduino/decoders.h @@ -61,10 +61,10 @@ bool secondDerivEnabled; //The use of the 2nd derivative calculation is limited bool decoderIsSequential; //Whether or not the decoder supports sequential operation byte checkSyncToothCount; //How many teeth must've been seen on this revolution before we try to confirm sync (Useful for missing tooth type decoders) -int ignition1EndTooth = 0; -int ignition2EndTooth = 0; -int ignition3EndTooth = 0; -int ignition4EndTooth = 0; +int16_t ignition1EndTooth = 0; +int16_t ignition2EndTooth = 0; +int16_t ignition3EndTooth = 0; +int16_t ignition4EndTooth = 0; int toothAngles[24]; //An array for storing fixed tooth angles. Currently sized at 24 for the GM 24X decoder, but may grow later if there are other decoders that use this style diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index 37124c8e..37366d8f 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -232,10 +232,17 @@ int getCrankAngle_missingTooth(int timePerDegree) void triggerSetEndTeeth_missingTooth() { + ignition1EndTooth = ( (ignition1EndAngle - configPage2.triggerAngle) / triggerToothAngle ) - 1; + if(ignition1EndTooth > configPage2.triggerTeeth) { ignition1EndTooth -= configPage2.triggerTeeth; } + if(ignition1EndTooth <= 0) { ignition1EndTooth -= configPage2.triggerTeeth; } + if(ignition1EndTooth > triggerActualTeeth) { ignition1EndTooth = triggerActualTeeth; } + ignition2EndTooth = ( (ignition2EndAngle - configPage2.triggerAngle) / triggerToothAngle ) - 1; ignition3EndTooth = ( (ignition3EndAngle - configPage2.triggerAngle) / triggerToothAngle ) - 1; ignition4EndTooth = ( (ignition4EndAngle - configPage2.triggerAngle) / triggerToothAngle ) - 1; + + } /* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/speeduino/speeduino.ino b/speeduino/speeduino.ino index 0b8476cf..4667c190 100644 --- a/speeduino/speeduino.ino +++ b/speeduino/speeduino.ino @@ -86,7 +86,8 @@ unsigned long currentLoopTime; //The time the current loop started (uS) unsigned long previousLoopTime; //The time the previous loop started (uS) int CRANK_ANGLE_MAX = 720; -int CRANK_ANGLE_MAX_IGN = 360, CRANK_ANGLE_MAX_INJ = 360; // The number of crank degrees that the system track over. 360 for wasted / timed batch and 720 for sequential +int CRANK_ANGLE_MAX_IGN = 360; +int CRANK_ANGLE_MAX_INJ = 360; // The number of crank degrees that the system track over. 360 for wasted / timed batch and 720 for sequential static byte coilHIGH = HIGH; static byte coilLOW = LOW; @@ -98,6 +99,7 @@ byte deltaToothCount = 0; //The last tooth that was used with the deltaV calc int rpmDelta; byte ignitionCount; uint16_t fixedCrankingOverride = 0; +int16_t lastAdvance; //Stores the previous advance figure to track changes. bool clutchTrigger; bool previousClutchTrigger; @@ -1106,7 +1108,7 @@ void loop() //Begin the fuel calculation //Calculate an injector pulsewidth from the VE currentStatus.corrections = correctionsFuel(); - //currentStatus.corrections = 100; + lastAdvance = currentStatus.advance; //Store the previous advance value if (configPage1.algorithm == 0) //Check which fuelling algorithm is being used { //Speed Density @@ -1380,7 +1382,9 @@ void loop() default: break; } - if(configPage1.perToothIgn == true) { triggerSetEndTeeth(); } //If ignition timing is being tracked per tooth, perform the calcs to get the end teeth + //If ignition timing is being tracked per tooth, perform the calcs to get the end teeth + //This only needs to be run if the advance figure has changed, otherwise the end teeth will still be the same + if( (configPage1.perToothIgn == true) && (lastAdvance != currentStatus.advance) ) { triggerSetEndTeeth(); } //*********************************************************************************************** //| BEGIN FUEL SCHEDULES