Addition of common ignition corrections routine

This commit is contained in:
Josh Stewart 2016-12-11 22:51:04 +11:00
parent 397fb56445
commit 4d18ee7911
3 changed files with 90 additions and 24 deletions

View File

@ -7,12 +7,21 @@ All functions in the gamma file return
void initialiseCorrections(); void initialiseCorrections();
byte correctionsTotal(); byte correctionsFuel();
byte correctionWUE(); //Warmup enrichment static inline byte correctionWUE(); //Warmup enrichment
byte correctionASE(); //After Start Enrichment static inline byte correctionASE(); //After Start Enrichment
byte correctionAccel(); //Acceleration Enrichment static inline byte correctionAccel(); //Acceleration Enrichment
byte correctionsFloodClear(); //Check for flood clear on cranking static inline byte correctionsFloodClear(); //Check for flood clear on cranking
byte correctionsAFRClosedLoop(); //Closed loop AFR adjustment static inline byte correctionsAFRClosedLoop(); //Closed loop AFR adjustment
byte correctionsFlex(); //Flex fuel adjustment static inline byte correctionsFlex(); //Flex fuel adjustment
byte correctionsIgn();
static inline byte correctionsFixedTiming(byte);
static inline byte correctionsCrankingFixedTiming(byte);
static inline byte correctionsFlexTiming(byte);
static inline byte correctionsIATretard(byte);
static inline byte correctionsSoftRevLimit(byte);
static inline byte correctionsSoftLaunch(byte);
#endif // CORRECTIONS_H #endif // CORRECTIONS_H

View File

@ -28,7 +28,7 @@ void initialiseCorrections()
correctionsTotal() calls all the other corrections functions and combines their results. correctionsTotal() calls all the other corrections functions and combines their results.
This is the only function that should be called from anywhere outside the file This is the only function that should be called from anywhere outside the file
*/ */
byte correctionsTotal() byte correctionsFuel()
{ {
unsigned long sumCorrections = 100; unsigned long sumCorrections = 100;
byte activeCorrections = 0; byte activeCorrections = 0;
@ -85,7 +85,7 @@ byte correctionsTotal()
Warm Up Enrichment (WUE) Warm Up Enrichment (WUE)
Uses a 2D enrichment table (WUETable) where the X axis is engine temp and the Y axis is the amount of extra fuel to add Uses a 2D enrichment table (WUETable) where the X axis is engine temp and the Y axis is the amount of extra fuel to add
*/ */
byte correctionWUE() static inline byte correctionWUE()
{ {
//Possibly reduce the frequency this runs at (Costs about 50 loops per second) //Possibly reduce the frequency this runs at (Costs about 50 loops per second)
if (currentStatus.coolant > (WUETable.axisX[9] - CALIBRATION_TEMPERATURE_OFFSET)) { BIT_CLEAR(currentStatus.engine, BIT_ENGINE_WARMUP); return 100; } //This prevents us doing the 2D lookup if we're already up to temp if (currentStatus.coolant > (WUETable.axisX[9] - CALIBRATION_TEMPERATURE_OFFSET)) { BIT_CLEAR(currentStatus.engine, BIT_ENGINE_WARMUP); return 100; } //This prevents us doing the 2D lookup if we're already up to temp
@ -97,7 +97,7 @@ byte correctionWUE()
Cranking Enrichment Cranking Enrichment
Additional fuel % to be added when the engine is cranking Additional fuel % to be added when the engine is cranking
*/ */
byte correctionCranking() static inline byte correctionCranking()
{ {
if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { return 100 + configPage1.crankingPct; } if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { return 100 + configPage1.crankingPct; }
else { return 100; } else { return 100; }
@ -108,7 +108,7 @@ After Start Enrichment
This is a short period (Usually <20 seconds) immediately after the engine first fires (But not when cranking) This is a short period (Usually <20 seconds) immediately after the engine first fires (But not when cranking)
where an additional amount of fuel is added (Over and above the WUE amount) where an additional amount of fuel is added (Over and above the WUE amount)
*/ */
byte correctionASE() static inline byte correctionASE()
{ {
//Two checks are requiredL: //Two checks are requiredL:
//1) Is the negine run time less than the configured ase time //1) Is the negine run time less than the configured ase time
@ -128,7 +128,7 @@ TPS based acceleration enrichment
Calculates the % change of the throttle over time (%/second) and performs a lookup based on this Calculates the % change of the throttle over time (%/second) and performs a lookup based on this
When the enrichment is turned on, it runs at that amount for a fixed period of time (taeTime) When the enrichment is turned on, it runs at that amount for a fixed period of time (taeTime)
*/ */
byte correctionAccel() static inline byte correctionAccel()
{ {
//First, check whether the accel. enrichment is already running //First, check whether the accel. enrichment is already running
if( BIT_CHECK(currentStatus.engine, BIT_ENGINE_ACC) ) if( BIT_CHECK(currentStatus.engine, BIT_ENGINE_ACC) )
@ -169,7 +169,7 @@ Simple check to see whether we are cranking with the TPS above the flood clear t
This function always returns either 100 or 0 This function always returns either 100 or 0
*/ */
byte correctionFloodClear() static inline byte correctionFloodClear()
{ {
if(BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK)) if(BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK))
{ {
@ -187,7 +187,7 @@ byte correctionFloodClear()
Battery Voltage correction Battery Voltage correction
Uses a 2D enrichment table (WUETable) where the X axis is engine temp and the Y axis is the amount of extra fuel to add Uses a 2D enrichment table (WUETable) where the X axis is engine temp and the Y axis is the amount of extra fuel to add
*/ */
byte correctionsBatVoltage() static inline byte correctionsBatVoltage()
{ {
if (currentStatus.battery10 > (injectorVCorrectionTable.axisX[5])) { return injectorVCorrectionTable.values[injectorVCorrectionTable.xSize-1]; } //This prevents us doing the 2D lookup if the voltage is above maximum if (currentStatus.battery10 > (injectorVCorrectionTable.axisX[5])) { return injectorVCorrectionTable.values[injectorVCorrectionTable.xSize-1]; } //This prevents us doing the 2D lookup if the voltage is above maximum
return table2D_getValue(&injectorVCorrectionTable, currentStatus.battery10); return table2D_getValue(&injectorVCorrectionTable, currentStatus.battery10);
@ -197,7 +197,7 @@ byte correctionsBatVoltage()
Simple temperature based corrections lookup based on the inlet air temperature. Simple temperature based corrections lookup based on the inlet air temperature.
This corrects for changes in air density from movement of the temperature This corrects for changes in air density from movement of the temperature
*/ */
byte correctionsIATDensity() static inline byte correctionsIATDensity()
{ {
if ( (currentStatus.IAT + CALIBRATION_TEMPERATURE_OFFSET) > (IATDensityCorrectionTable.axisX[8])) { return IATDensityCorrectionTable.values[IATDensityCorrectionTable.xSize-1]; } //This prevents us doing the 2D lookup if the intake temp is above maximum if ( (currentStatus.IAT + CALIBRATION_TEMPERATURE_OFFSET) > (IATDensityCorrectionTable.axisX[8])) { return IATDensityCorrectionTable.values[IATDensityCorrectionTable.xSize-1]; } //This prevents us doing the 2D lookup if the intake temp is above maximum
return table2D_getValue(&IATDensityCorrectionTable, currentStatus.IAT + CALIBRATION_TEMPERATURE_OFFSET); //currentStatus.IAT is the actual temperature, values in IATDensityCorrectionTable.axisX are temp+offset return table2D_getValue(&IATDensityCorrectionTable, currentStatus.IAT + CALIBRATION_TEMPERATURE_OFFSET); //currentStatus.IAT is the actual temperature, values in IATDensityCorrectionTable.axisX are temp+offset
@ -207,7 +207,7 @@ byte correctionsIATDensity()
Launch control has a setting to increase the fuel load to assist in bringing up boost Launch control has a setting to increase the fuel load to assist in bringing up boost
This simple check applies the extra fuel if we're currently launching This simple check applies the extra fuel if we're currently launching
*/ */
byte correctionsLaunch() static inline byte correctionsLaunch()
{ {
if(currentStatus.launchingHard || currentStatus.launchingSoft) { return (100 + configPage3.lnchFuelAdd); } if(currentStatus.launchingHard || currentStatus.launchingSoft) { return (100 + configPage3.lnchFuelAdd); }
else { return 100; } else { return 100; }
@ -216,7 +216,7 @@ byte correctionsLaunch()
/* /*
* Returns true if decelleration fuel cutoff should be on, false if its off * Returns true if decelleration fuel cutoff should be on, false if its off
*/ */
bool correctionsDFCO() static inline bool correctionsDFCO()
{ {
if ( !configPage2.dfcoEnabled ) { return false; } //If the DFCO option isn't turned on, always return false (off) if ( !configPage2.dfcoEnabled ) { return false; } //If the DFCO option isn't turned on, always return false (off)
if ( bitRead(currentStatus.squirt, BIT_SQUIRT_DFCO) ) { return ( currentStatus.RPM > ( configPage2.dfcoRPM * 10) ) && ( currentStatus.TPS < configPage2.dfcoTPSThresh ); } if ( bitRead(currentStatus.squirt, BIT_SQUIRT_DFCO) ) { return ( currentStatus.RPM > ( configPage2.dfcoRPM * 10) ) && ( currentStatus.TPS < configPage2.dfcoTPSThresh ); }
@ -227,7 +227,7 @@ bool correctionsDFCO()
* Flex fuel adjustment to vary fuel based on ethanol content * Flex fuel adjustment to vary fuel based on ethanol content
* The amount of extra fuel required is a linear relationship based on the % of ethanol. * The amount of extra fuel required is a linear relationship based on the % of ethanol.
*/ */
byte correctionsFlex() static inline byte correctionsFlex()
{ {
if(!configPage1.flexEnabled) { return 100; } //Check for flex being enabled if(!configPage1.flexEnabled) { return 100; } //Check for flex being enabled
byte flexRange = configPage1.flexFuelHigh - configPage1.flexFuelLow; byte flexRange = configPage1.flexFuelHigh - configPage1.flexFuelLow;
@ -248,7 +248,7 @@ PID (Best suited to wideband sensors):
*/ */
byte correctionsAFRClosedLoop() static inline byte correctionsAFRClosedLoop()
{ {
if( (configPage3.egoType == 0)) { return 100; } //egoType of 0 means no O2 sensor if( (configPage3.egoType == 0)) { return 100; } //egoType of 0 means no O2 sensor
@ -311,3 +311,60 @@ byte correctionsAFRClosedLoop()
return 100; //Catch all (Includes when AFR target = current AFR return 100; //Catch all (Includes when AFR target = current AFR
} }
//******************************** IGNITION ADVANCE CORRECTIONS ********************************
byte correctionsIgn(byte advance)
{
advance = correctionsFlexTiming(advance);
advance = correctionsIATretard(advance);
advance = correctionsSoftRevLimit(advance);
advance = correctionsSoftLaunch(advance);
//Fixed timing check must go last
advance = correctionsFixedTiming(advance);
advance = correctionsCrankingFixedTiming(advance); //This overrrides the regular fixed timing, must come last
return advance;
}
static inline byte correctionsFixedTiming(byte advance)
{
if (configPage2.FixAng != 0) { return configPage2.FixAng; } //Check whether the user has set a fixed timing angle
return advance;
}
static inline byte correctionsCrankingFixedTiming(byte advance)
{
if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { return configPage2.CrankAng; } //Use the fixed cranking ignition angle
return advance;
}
static inline byte correctionsFlexTiming(byte advance)
{
if(!configPage1.flexEnabled) { return advance; } //Check for flex being enabled
byte flexRange = configPage1.flexAdvHigh - configPage1.flexAdvLow;
return advance + percentage(currentStatus.ethanolPct, flexRange);
}
static inline byte correctionsIATretard(byte advance)
{
//Adjust the advance based on IAT. If the adjustment amount is greater than the current advance, just set advance to 0
byte advanceIATadjust = table2D_getValue(&IATRetardTable, currentStatus.IAT);
if (advanceIATadjust <= advance) { return (advance - advanceIATadjust); }
else { return 0; }
}
static inline byte correctionsSoftRevLimit(byte advance)
{
BIT_CLEAR(currentStatus.spark, BIT_SPARK_SFTLIM);
if (currentStatus.RPM > ((unsigned int)(configPage2.SoftRevLim) * 100) ) { BIT_SET(currentStatus.spark, BIT_SPARK_SFTLIM); return configPage2.SoftLimRetard; } //Softcut RPM limit (If we're above softcut limit, delay timing by configured number of degrees)
return advance;
}
static inline byte correctionsSoftLaunch(byte advance)
{
if (currentStatus.launchingSoft) { return configPage3.lnchRetard; } //SoftCut rev limit for 2-step launch control
return advance;
}

View File

@ -948,7 +948,7 @@ void loop()
//Begin the fuel calculation //Begin the fuel calculation
//Calculate an injector pulsewidth from the VE //Calculate an injector pulsewidth from the VE
currentStatus.corrections = correctionsTotal(); currentStatus.corrections = correctionsFuel();
//currentStatus.corrections = 100; //currentStatus.corrections = 100;
if (configPage1.algorithm == 0) //Check which fuelling algorithm is being used if (configPage1.algorithm == 0) //Check which fuelling algorithm is being used
{ {
@ -965,6 +965,8 @@ void loop()
currentStatus.advance = get3DTableValue(&ignitionTable, currentStatus.TPS, currentStatus.RPM); //As above, but for ignition advance currentStatus.advance = get3DTableValue(&ignitionTable, currentStatus.TPS, currentStatus.RPM); //As above, but for ignition advance
} }
//currentStatus.advance = correctionsIgn(currentStatus.advance);
//Check for fixed ignition angles //Check for fixed ignition angles
if (configPage2.FixAng != 0) { currentStatus.advance = configPage2.FixAng; } //Check whether the user has set a fixed timing angle if (configPage2.FixAng != 0) { currentStatus.advance = configPage2.FixAng; } //Check whether the user has set a fixed timing angle
if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { currentStatus.advance = configPage2.CrankAng; } //Use the fixed cranking ignition angle if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { currentStatus.advance = configPage2.CrankAng; } //Use the fixed cranking ignition angle
@ -1034,7 +1036,7 @@ void loop()
if( !BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) if( !BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) )
{ {
unsigned long pwLimit = percentage(configPage1.dutyLim, revolutionTime); //The pulsewidth limit is determined to be the duty cycle limit (Eg 85%) by the total time it takes to perform 1 revolution unsigned long pwLimit = percentage(configPage1.dutyLim, revolutionTime); //The pulsewidth limit is determined to be the duty cycle limit (Eg 85%) by the total time it takes to perform 1 revolution
if (CRANK_ANGLE_MAX_INJ == 720) { pwLimit = pwLimit * 2; } if (CRANK_ANGLE_MAX_INJ == 720) { pwLimit = pwLimit * 2; } //For sequential, the maximum pulse time is double (2 revolutions). Wouldn't work for 2 stroke...
if (currentStatus.PW1 > pwLimit) { currentStatus.PW1 = pwLimit; } if (currentStatus.PW1 > pwLimit) { currentStatus.PW1 = pwLimit; }
} }
@ -1122,11 +1124,9 @@ void loop()
//*********************************************************************************************** //***********************************************************************************************
//| BEGIN IGNITION CALCULATIONS //| BEGIN IGNITION CALCULATIONS
BIT_CLEAR(currentStatus.spark, BIT_SPARK_SFTLIM);
if (currentStatus.RPM > ((unsigned int)(configPage2.SoftRevLim) * 100) ) { currentStatus.advance = configPage2.SoftLimRetard; BIT_SET(currentStatus.spark, BIT_SPARK_SFTLIM); } //Softcut RPM limit (If we're above softcut limit, delay timing by configured number of degrees)
BIT_CLEAR(currentStatus.spark, BIT_SPARK_HRDLIM); BIT_CLEAR(currentStatus.spark, BIT_SPARK_HRDLIM);
if (currentStatus.RPM > ((unsigned int)(configPage2.HardRevLim) * 100) ) { BIT_SET(currentStatus.spark, BIT_SPARK_HRDLIM); } //Hardcut RPM limit if (currentStatus.RPM > ((unsigned int)(configPage2.HardRevLim) * 100) ) { BIT_SET(currentStatus.spark, BIT_SPARK_HRDLIM); } //Hardcut RPM limit
if (currentStatus.launchingSoft) { currentStatus.advance = configPage3.lnchRetard; } //SoftCut rev limit for 2-step launch control
//Set dwell //Set dwell
//Dwell is stored as ms * 10. ie Dwell of 4.3ms would be 43 in configPage2. This number therefore needs to be multiplied by 100 to get dwell in uS //Dwell is stored as ms * 10. ie Dwell of 4.3ms would be 43 in configPage2. This number therefore needs to be multiplied by 100 to get dwell in uS