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
* @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);
}
/**
* @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 */
#define MICROS_PER_DEG_1_RPM INT32_C(166667)

View File

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

View File

@ -134,7 +134,7 @@ volatile uint16_t ignitionCount; /**< The count of ignition events that have tak
byte tertiaryTriggerEdge;
#endif
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 seclx10;
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;
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
if (currentStatus.nSquirts > 2)
{
@ -969,7 +977,7 @@ void initialiseAll(void)
//This is ONLY the case on 4 stroke systems
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)

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
//Determine the current crank angle
int crankAngle = 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.
int crankAngle = injectorLimits(getCrankAngle());
// if(Serial && false)
// {
@ -1042,8 +1041,7 @@ void loop(void)
{
//Refresh the current crank angle info
//ignition1StartAngle = 335;
crankAngle = getCrankAngle(); //Refresh with the latest crank angle
while (crankAngle > CRANK_ANGLE_MAX_IGN ) { crankAngle -= CRANK_ANGLE_MAX_IGN; }
crankAngle = ignitionLimits(getCrankAngle()); //Refresh the crank angle info
#if IGN_CHANNELS >= 1
uint32_t timeOut = calculateIgnitionTimeout(ignitionSchedule1, ignition1StartAngle, channel1IgnDegrees, crankAngle);
@ -1059,8 +1057,7 @@ void loop(void)
{
unsigned long uSToEnd = 0;
crankAngle = getCrankAngle(); //Refresh with the latest crank angle
if (crankAngle > CRANK_ANGLE_MAX_IGN ) { crankAngle -= 360; }
crankAngle = ignitionLimits(getCrankAngle()); //Refresh the crank angle info
//ONLY ONE OF THE BELOW SHOULD BE USED (PROBABLY THE FIRST):
//*********