diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index a34a07e829..5d0c0a41ca 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -61,21 +61,23 @@ float getCrankingFuel3( * Cranking fuel is different depending on engine coolant temperature * If the sensor is failed, use 20 deg C */ - auto clt = Sensor::get(SensorType::Clt); - engine->engineState.cranking.coolantTemperatureCoefficient = - interpolate2d(clt.value_or(20), config->crankingFuelBins, config->crankingFuelCoef); + auto clt = Sensor::get(SensorType::Clt).value_or(20); + auto e0Mult = interpolate2d(clt, config->crankingFuelBins, config->crankingFuelCoef); + + if (Sensor::hasSensor(SensorType::FuelEthanolPercent)) { + auto e100 = interpolate2d(clt, config->crankingFuelBins, config->crankingFuelCoefE100); + + auto flex = Sensor::get(SensorType::FuelEthanolPercent); + engine->engineState.cranking.coolantTemperatureCoefficient = priv::linterp(e0Mult, e100, flex.value_or(50)); + } else { + engine->engineState.cranking.coolantTemperatureCoefficient = e0Mult; + } auto tps = Sensor::get(SensorType::DriverThrottleIntent); - - engine->engineState.cranking.tpsCoefficient = tps.Valid ? 1 : interpolate2d(tps.Value, engineConfiguration->crankingTpsBins, - engineConfiguration->crankingTpsCoef); - - - /* engine->engineState.cranking.tpsCoefficient = - tps.Valid + tps.Valid ? interpolate2d(tps.Value, engineConfiguration->crankingTpsBins, engineConfiguration->crankingTpsCoef) - : 1; // in case of failed TPS, don't correct.*/ + : 1; // in case of failed TPS, don't correct. floatms_t crankingFuel = baseCrankingFuel * engine->engineState.cranking.durationCoefficient diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index e7ed85ad89..77960c6815 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -1558,7 +1558,7 @@ float[CLT_CURVE_SIZE] cltFuelCorr;;"ratio", 1, 0, 0, 5, 2 float[IAT_CURVE_SIZE] iatFuelCorrBins;;"C", 1, 0, -100, 250, 2 float[IAT_CURVE_SIZE] iatFuelCorr;;"ratio", 1, 0, 0, 5, 2 - float[CRANKING_CURVE_SIZE] crankingFuelCoef;;"ratio", 1, 0, 0.1, 50, 2 + float[CRANKING_CURVE_SIZE] crankingFuelCoef;;"ratio", 1, 0, 0, 50, 2 float[CRANKING_CURVE_SIZE] crankingFuelBins;;"C", 1, 0, -80, 170, 2 float[CRANKING_CURVE_SIZE] crankingCycleCoef;;"ratio", 1, 0, 0, 5, 2 @@ -1651,6 +1651,8 @@ cyl_trim_s[12 iterate] ignTrims uint16_t[TRIM_SIZE] fuelTrimLoadBins;;"", 1, 0, 0, 400, 0 uint16_t[TRIM_SIZE] fuelTrimRpmBins;;"rpm", 1, 0, 0, 20000, 0 cyl_trim_s[12 iterate] fuelTrims + +uint16_t[CRANKING_CURVE_SIZE] crankingFuelCoefE100;;"ratio", 0.01, 0, 0, 50, 2 end_struct #define MOCK_MAP_COMMAND "mock_map_voltage" diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 1299d58d64..e24c898af1 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -496,6 +496,14 @@ enable2ndByteCanID = false yAxis = 0, 3, 10 xBins = crankingFuelBins, coolant yBins = crankingFuelCoef + gauge = CLTGauge + + curve = crankingCltCurveE100, "Cranking Coolant Temperature Multiplier (Flex Fuel E100)" + columnLabel = "Coolant", "Multiplier" + xAxis = -40, 120, 9 + yAxis = 0, 3, 10 + xBins = crankingFuelBins, coolant + yBins = crankingFuelCoefE100 gauge = CLTGauge curve = etbTpsBiasCurve, "Electronic TB Bias Curve" @@ -1427,6 +1435,7 @@ menuDialog = main subMenu = std_separator subMenu = crankingCltCurve, "Fuel CLT multiplier" + subMenu = crankingCltCurveE100, "Fuel CLT multiplier (Flex Fuel E100)", 0, { flexSensorPin != @@ADC_CHANNEL_NONE@@ } subMenu = crankingDurationCurve, "Fuel duration multiplier" subMenu = crankingTpsCurve, "Fuel TPS multiplier" subMenu = std_separator