Fix erratic pulse issue with 3 and 5 squirt configurations

This commit is contained in:
Josh Stewart 2024-01-22 17:20:06 +11:00
parent acece66c7c
commit f49d6ca5d8
5 changed files with 29 additions and 29 deletions

View File

@ -10,10 +10,25 @@
* @param angle A crank angle in degrees * @param angle A crank angle in degrees
* @return int16_t * @return int16_t
*/ */
static inline int16_t ignitionLimits(int16_t angle) { static inline int16_t ignitionLimits(int16_t angle)
{
return nudge(0, CRANK_ANGLE_MAX_IGN, angle, CRANK_ANGLE_MAX_IGN); return nudge(0, CRANK_ANGLE_MAX_IGN, angle, CRANK_ANGLE_MAX_IGN);
} }
/**
* @brief Makes one pass at nudging the angle to within [0,CRANK_ANGLE_MAX_INJ]
*
* @param angle A crank angle in degrees
* @return int16_t
*/
static inline int16_t injectorLimits(int16_t angle)
{
int16_t tempAngle = angle;
if(tempAngle < 0) { tempAngle = tempAngle + CRANK_ANGLE_MAX_INJ; }
while(tempAngle > CRANK_ANGLE_MAX_INJ ) { tempAngle -= CRANK_ANGLE_MAX_INJ; }
return tempAngle;
}
/** @brief At 1 RPM, each degree of angular rotation takes this many microseconds */ /** @brief At 1 RPM, each degree of angular rotation takes this many microseconds */
#define MICROS_PER_DEG_1_RPM INT32_C(166667) #define MICROS_PER_DEG_1_RPM INT32_C(166667)

View File

@ -752,7 +752,6 @@ int getCrankAngle_missingTooth(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
else if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;
@ -958,7 +957,6 @@ int getCrankAngle_DualWheel(void)
if ( (tempRevolutionOne == true) && (configPage4.TrigSpeed == CRANK_SPEED) ) { crankAngle += 360; } if ( (tempRevolutionOne == true) && (configPage4.TrigSpeed == CRANK_SPEED) ) { crankAngle += 360; }
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;
@ -1122,7 +1120,6 @@ int getCrankAngle_BasicDistributor(void)
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;
@ -1314,7 +1311,6 @@ int getCrankAngle_GM7X(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -1724,7 +1720,6 @@ int getCrankAngle_4G63(void)
crankAngle += timeToAngleIntervalTooth(elapsedTime); crankAngle += timeToAngleIntervalTooth(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
} }
return crankAngle; return crankAngle;
@ -1882,7 +1877,6 @@ int getCrankAngle_24X(void)
if (tempRevolutionOne == 1) { crankAngle += 360; } if (tempRevolutionOne == 1) { crankAngle += 360; }
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -1989,7 +1983,6 @@ int getCrankAngle_Jeep2000(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -2110,7 +2103,6 @@ int getCrankAngle_Audi135(void)
if (tempRevolutionOne) { crankAngle += 360; } if (tempRevolutionOne) { crankAngle += 360; }
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
else if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;
@ -2208,7 +2200,6 @@ int getCrankAngle_HondaD17(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -2433,7 +2424,6 @@ int getCrankAngle_Miata9905(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
} }
@ -2631,7 +2621,6 @@ int getCrankAngle_MazdaAU(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
} }
@ -2706,7 +2695,6 @@ int getCrankAngle_non360(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -2922,7 +2910,6 @@ int getCrankAngle_Nissan360(void)
} }
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -3169,7 +3156,6 @@ int getCrankAngle_Subaru67(void)
crankAngle += timeToAngleIntervalTooth(elapsedTime); crankAngle += timeToAngleIntervalTooth(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
} }
@ -3369,7 +3355,6 @@ int getCrankAngle_Daihatsu(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;
@ -3507,7 +3492,6 @@ int getCrankAngle_Harley(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -3992,7 +3976,6 @@ int getCrankAngle_420a(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -4246,7 +4229,6 @@ int getCrankAngle_FordST170(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
else if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;
@ -4847,7 +4829,6 @@ int getCrankAngle_Vmax(void)
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += 360; } if (crankAngle < 0) { crankAngle += 360; }
return crankAngle; return crankAngle;
@ -5254,7 +5235,6 @@ int getCrankAngle_RoverMEMS()
crankAngle += timeToAngleDegPerMicroSec(elapsedTime); crankAngle += timeToAngleDegPerMicroSec(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; } if (crankAngle >= 720) { crankAngle -= 720; }
else if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; } if (crankAngle < 0) { crankAngle += CRANK_ANGLE_MAX; }
return crankAngle; return crankAngle;

View File

@ -134,7 +134,7 @@ volatile uint16_t ignitionCount; /**< The count of ignition events that have tak
byte tertiaryTriggerEdge; byte tertiaryTriggerEdge;
#endif #endif
int CRANK_ANGLE_MAX_IGN = 360; 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 int CRANK_ANGLE_MAX_INJ = 360; ///< The number of crank degrees that the system track over. Typically 720 divided by the number of squirts per cycle (Eg 360 for wasted 2 squirt and 720 for sequential single squirt)
volatile uint32_t runSecsX10; volatile uint32_t runSecsX10;
volatile uint32_t seclx10; volatile uint32_t seclx10;
volatile byte HWTest_INJ = 0; /**< Each bit in this variable represents one of the injector channels and it's HW test status */ volatile byte HWTest_INJ = 0; /**< Each bit in this variable represents one of the injector channels and it's HW test status */

View File

@ -571,6 +571,14 @@ void initialiseAll(void)
channel2InjDegrees = 120; channel2InjDegrees = 120;
channel3InjDegrees = 240; channel3InjDegrees = 240;
if(configPage2.injType == INJ_TYPE_PORT)
{
//Force nSquirts to 2 for individual port injection. This prevents TunerStudio forcing the value to 3 even when this isn't wanted.
currentStatus.nSquirts = 2;
if(configPage2.strokes == FOUR_STROKE) { CRANK_ANGLE_MAX_INJ = 360; }
else { CRANK_ANGLE_MAX_INJ = 180; }
}
//Adjust the injection angles based on the number of squirts //Adjust the injection angles based on the number of squirts
if (currentStatus.nSquirts > 2) if (currentStatus.nSquirts > 2)
{ {
@ -969,7 +977,7 @@ void initialiseAll(void)
//This is ONLY the case on 4 stroke systems //This is ONLY the case on 4 stroke systems
if( (currentStatus.nSquirts == 3) || (currentStatus.nSquirts == 5) ) if( (currentStatus.nSquirts == 3) || (currentStatus.nSquirts == 5) )
{ {
if(configPage2.strokes == FOUR_STROKE) { CRANK_ANGLE_MAX_INJ = 720; } if(configPage2.strokes == FOUR_STROKE) { CRANK_ANGLE_MAX_INJ = (720U / currentStatus.nSquirts); }
} }
switch(configPage2.injLayout) switch(configPage2.injLayout)

View File

@ -744,8 +744,7 @@ void loop(void)
//This may potentially be called a number of times as we get closer and closer to the opening time //This may potentially be called a number of times as we get closer and closer to the opening time
//Determine the current crank angle //Determine the current crank angle
int crankAngle = getCrankAngle(); int crankAngle = injectorLimits(getCrankAngle());
while(crankAngle > CRANK_ANGLE_MAX_INJ ) { crankAngle = crankAngle - CRANK_ANGLE_MAX_INJ; } //Continue reducing the crank angle by the max injection amount until it's below the required limit. This will usually only run (at most) once, but in cases where there is sequential ignition and more than 2 squirts per cycle, it may run up to 4 times.
// if(Serial && false) // if(Serial && false)
// { // {
@ -1042,8 +1041,7 @@ void loop(void)
{ {
//Refresh the current crank angle info //Refresh the current crank angle info
//ignition1StartAngle = 335; //ignition1StartAngle = 335;
crankAngle = getCrankAngle(); //Refresh with the latest crank angle crankAngle = ignitionLimits(getCrankAngle()); //Refresh the crank angle info
while (crankAngle > CRANK_ANGLE_MAX_IGN ) { crankAngle -= CRANK_ANGLE_MAX_IGN; }
#if IGN_CHANNELS >= 1 #if IGN_CHANNELS >= 1
uint32_t timeOut = calculateIgnitionTimeout(ignitionSchedule1, ignition1StartAngle, channel1IgnDegrees, crankAngle); uint32_t timeOut = calculateIgnitionTimeout(ignitionSchedule1, ignition1StartAngle, channel1IgnDegrees, crankAngle);
@ -1059,8 +1057,7 @@ void loop(void)
{ {
unsigned long uSToEnd = 0; unsigned long uSToEnd = 0;
crankAngle = getCrankAngle(); //Refresh with the latest crank angle crankAngle = ignitionLimits(getCrankAngle()); //Refresh the crank angle info
if (crankAngle > CRANK_ANGLE_MAX_IGN ) { crankAngle -= 360; }
//ONLY ONE OF THE BELOW SHOULD BE USED (PROBABLY THE FIRST): //ONLY ONE OF THE BELOW SHOULD BE USED (PROBABLY THE FIRST):
//********* //*********