Fix rolling limiter not working with coolant based RPM limit
This commit is contained in:
parent
572d1b274b
commit
856bcfb242
|
@ -18,7 +18,7 @@ byte checkEngineProtect(void)
|
|||
byte checkRevLimit(void)
|
||||
{
|
||||
//Hardcut RPM limit
|
||||
byte revLimiterActive = 0;
|
||||
byte currentLimitRPM = 255; //Default to no limit (In case PROTECT_CUT_OFF is selected)
|
||||
BIT_CLEAR(currentStatus.engineProtectStatus, ENGINE_PROTECT_BIT_RPM);
|
||||
BIT_CLEAR(currentStatus.spark, BIT_SPARK_HRDLIM);
|
||||
BIT_CLEAR(currentStatus.engineProtectStatus, ENGINE_PROTECT_BIT_COOLANT);
|
||||
|
@ -27,28 +27,27 @@ byte checkRevLimit(void)
|
|||
{
|
||||
if(configPage9.hardRevMode == HARD_REV_FIXED)
|
||||
{
|
||||
currentLimitRPM = configPage4.HardRevLim;
|
||||
if ( (currentStatus.RPMdiv100 >= configPage4.HardRevLim) || ((softLimitTime > configPage4.SoftLimMax) && (currentStatus.RPMdiv100 >= configPage4.SoftRevLim)) )
|
||||
{
|
||||
BIT_SET(currentStatus.spark, BIT_SPARK_HRDLIM); //Legacy and likely to be removed at some point
|
||||
BIT_SET(currentStatus.engineProtectStatus, ENGINE_PROTECT_BIT_RPM);
|
||||
revLimiterActive = 1;
|
||||
}
|
||||
else { BIT_CLEAR(currentStatus.spark, BIT_SPARK_HRDLIM); }
|
||||
}
|
||||
else if(configPage9.hardRevMode == HARD_REV_COOLANT )
|
||||
{
|
||||
int8_t coolantLimit = (int16_t)(table2D_getValue(&coolantProtectTable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET));
|
||||
if(currentStatus.RPMdiv100 > coolantLimit)
|
||||
currentLimitRPM = (int16_t)(table2D_getValue(&coolantProtectTable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET));
|
||||
if(currentStatus.RPMdiv100 > currentLimitRPM)
|
||||
{
|
||||
BIT_SET(currentStatus.engineProtectStatus, ENGINE_PROTECT_BIT_COOLANT);
|
||||
BIT_SET(currentStatus.spark, BIT_SPARK_HRDLIM); //Legacy and likely to be removed at some point
|
||||
BIT_SET(currentStatus.engineProtectStatus, ENGINE_PROTECT_BIT_RPM);
|
||||
revLimiterActive = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return revLimiterActive;
|
||||
return currentLimitRPM;
|
||||
}
|
||||
|
||||
byte checkBoostLimit(void)
|
||||
|
|
|
@ -54,9 +54,6 @@ uint16_t inj_opentime_uS = 0;
|
|||
|
||||
uint8_t ignitionChannelsOn; /**< The current state of the ignition system (on or off) */
|
||||
uint8_t fuelChannelsOn; /**< The current state of the fuel system (on or off) */
|
||||
|
||||
//byte curRollingCut = 0; /**< Rolling rev limiter, current ignition channel being cut */
|
||||
//byte rollingCutCounter = 0; /**< how many times (revolutions) the ignition has been cut in a row */
|
||||
uint32_t rollingCutLastRev = 0; /**< Tracks whether we're on the same or a different rev for the rolling cut */
|
||||
|
||||
uint16_t staged_req_fuel_mult_pri = 0;
|
||||
|
@ -793,9 +790,8 @@ void loop(void)
|
|||
// }
|
||||
|
||||
//Check for any of the engine protections or rev limiters being turned on
|
||||
int16_t maxAllowedRPM = configPage4.HardRevLim; //The maximum RPM allowed by all the potential limiters (Engine protection, 2-step, flat shift etc). Divided by 100. Use RPM hard limit as the default as it's the highest that is ever permitted
|
||||
uint16_t maxAllowedRPM = checkRevLimit(); //The maximum RPM allowed by all the potential limiters (Engine protection, 2-step, flat shift etc). Divided by 100. `checkRevLimit()` returns the current maximum RPM allow (divided by 100) based on either the fixed hard limit or the current coolant temp
|
||||
//Check each of the functions that has an RPM limit. Update the max allowed RPM if the function is active and has a lower RPM than already set
|
||||
checkRevLimit();
|
||||
if( checkEngineProtect() && (configPage4.engineProtectMaxRPM < maxAllowedRPM)) { maxAllowedRPM = configPage4.engineProtectMaxRPM; }
|
||||
if ( (currentStatus.launchingHard == true) && (configPage6.lnchHardLim < maxAllowedRPM) ) { maxAllowedRPM = configPage6.lnchHardLim; }
|
||||
if ( (currentStatus.flatShiftingHard == true) && (configPage6.flatSArm < maxAllowedRPM) ) { maxAllowedRPM = configPage6.flatSArm; }
|
||||
|
@ -835,15 +831,14 @@ void loop(void)
|
|||
//if( (configPage4.sparkMode != IGN_MODE_SEQUENTIAL) || (configPage2.injLayout != INJ_SEQUENTIAL) ) { revolutionsToCut *= 2; } //4 stroke and non-sequential will cut for 4 revolutions minimum. This is to ensure no half fuel ignition cycles take place
|
||||
|
||||
if(rollingCutLastRev == 0) { rollingCutLastRev = currentStatus.startRevolutions; } //First time check
|
||||
if (currentStatus.startRevolutions > (rollingCutLastRev + revolutionsToCut) )
|
||||
if (currentStatus.startRevolutions >= (rollingCutLastRev + revolutionsToCut) )
|
||||
{
|
||||
uint8_t cutPercent = 0;
|
||||
int16_t rpmDelta = currentStatus.RPM - maxAllowedRPM;
|
||||
if(rpmDelta >= 0) { cutPercent = 100; } //If the current RPM is over the max allowed RPM then cut is full (100%)
|
||||
else { cutPercent = table2D_getValue(&rollingCutTable, (rpmDelta / 10) ); } //
|
||||
|
||||
//max(maxIgnOutputs, maxInjOutputs)
|
||||
for(uint8_t x=0; x<8; x++)
|
||||
for(uint8_t x=0; x<max(maxIgnOutputs, maxInjOutputs); x++)
|
||||
{
|
||||
if( (configPage6.engineProtectType != PROTECT_CUT_OFF) && ( (cutPercent == 100) || (random1to100() < cutPercent) ) )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue