void EngineState::periodicFastCallback(DECLARE_ENGINE_PARAMETER_F) { int rpm = ENGINE(rpmCalculator.rpmValue); sparkDwell = getSparkDwell(rpm PASS_ENGINE_PARAMETER); dwellAngle = sparkDwell / getOneDegreeTimeMs(rpm); iatFuelCorrection = getIatCorrection(iat PASS_ENGINE_PARAMETER); cltFuelCorrection = getCltCorrection(clt PASS_ENGINE_PARAMETER); engineNoiseHipLevel = interpolate2d(rpm, engineConfiguration->knockNoiseRpmBins, engineConfiguration->knockNoise, ENGINE_NOISE_CURVE_SIZE); baroCorrection = getBaroCorrection(PASS_ENGINE_PARAMETER_F); injectionOffset = getinjectionOffset(rpm PASS_ENGINE_PARAMETER); float engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_F); timingAdvance = getAdvance(rpm, engineLoad PASS_ENGINE_PARAMETER); if (engineConfiguration->algorithm == LM_SPEED_DENSITY) { float coolantC = ENGINE(engineState.clt); float intakeC = ENGINE(engineState.iat); float tps = getTPS(PASS_ENGINE_PARAMETER_F); tChargeK = convertCelsiusToKelvin(getTCharge(rpm, tps, coolantC, intakeC)); float map = getMap(); /** * *0.01 because of https://sourceforge.net/p/rusefi/tickets/153/ */ currentVE = baroCorrection * veMap.getValue(map, rpm) * 0.01; targerAFR = afrMap.getValue(map, rpm); } else { baseTableFuel = getBaseTableFuel(engineConfiguration, rpm, engineLoad); } }
void testFuelMap(void) { printf("*************************************************** testFuelMap\r\n"); EngineTestHelper eth(FORD_ASPIRE_1996); for (int k = 0; k < FUEL_LOAD_COUNT; k++) { for (int r = 0; r < FUEL_RPM_COUNT; r++) { eth.engine.engineConfiguration->fuelTable[k][r] = k * 200 + r; } } for (int i = 0; i < FUEL_LOAD_COUNT; i++) eth.engine.engineConfiguration->fuelLoadBins[i] = i; for (int i = 0; i < FUEL_RPM_COUNT; i++) eth.engine.engineConfiguration->fuelRpmBins[i] = i; assertEqualsM("base fuel table", 1005, getBaseTableFuel(eth.engine.engineConfiguration, 5, 5)); printf("*************************************************** initThermistors\r\n"); Engine *engine = ð.engine; engine_configuration_s *engineConfiguration = engine->engineConfiguration; initThermistors(engine); printf("*** getInjectorLag\r\n"); assertEquals(1.0, getInjectorLag(12 PASS_ENGINE_PARAMETER)); eth.engine.engineConfiguration->injectorLag = 0.5; for (int i = 0; i < VBAT_INJECTOR_CURVE_SIZE; i++) { eth.engine.engineConfiguration->battInjectorLagCorrBins[i] = i; eth.engine.engineConfiguration->battInjectorLagCorr[i] = 2 * i; } // because all the correction tables are zero printf("*************************************************** getRunningFuel 1\r\n"); float baseFuel = getBaseTableFuel(eth.engine.engineConfiguration, 5, getEngineLoadT(PASS_ENGINE_PARAMETER_F)); assertEqualsM("base fuel", 5.05, getRunningFuel(baseFuel, 5 PASS_ENGINE_PARAMETER)); printf("*************************************************** setting IAT table\r\n"); for (int i = 0; i < IAT_CURVE_SIZE; i++) { eth.engine.engineConfiguration->iatFuelCorrBins[i] = i; eth.engine.engineConfiguration->iatFuelCorr[i] = 2 * i; } eth.engine.engineConfiguration->iatFuelCorr[0] = 2; printf("*************************************************** setting CLT table\r\n"); for (int i = 0; i < CLT_CURVE_SIZE; i++) { eth.engine.engineConfiguration->cltFuelCorrBins[i] = i; eth.engine.engineConfiguration->cltFuelCorr[i] = 1; } eth.engine.engineConfiguration->injectorLag = 0; assertEquals(NAN, getIntakeAirTemperature(ð.engine)); float iatCorrection = getIatCorrection(-KELV PASS_ENGINE_PARAMETER); assertEqualsM("IAT", 2, iatCorrection); float cltCorrection = getCltCorrection(getCoolantTemperature(ð.engine) PASS_ENGINE_PARAMETER); assertEqualsM("CLT", 1, cltCorrection); float injectorLag = getInjectorLag(getVBatt(engineConfiguration) PASS_ENGINE_PARAMETER); assertEquals(0, injectorLag); testMafValue = 5; // 1005 * 2 for IAT correction printf("*************************************************** getRunningFuel 2\r\n"); baseFuel = getBaseTableFuel(eth.engine.engineConfiguration, 5, getEngineLoadT(PASS_ENGINE_PARAMETER_F)); assertEqualsM("v1", 30150, getRunningFuel(baseFuel, 5 PASS_ENGINE_PARAMETER)); testMafValue = 0; engineConfiguration->crankingSettings.baseCrankingFuel = 4; printf("*************************************************** getStartingFuel\r\n"); // NAN in case we have issues with the CLT sensor assertEqualsM("getStartingFuel nan", 4, getCrankingFuel3(engineConfiguration, NAN, 0)); assertEqualsM("getStartingFuel#1", 23.7333, getCrankingFuel3(engineConfiguration, 0, 4)); assertEqualsM("getStartingFuel#2", 18.0419, getCrankingFuel3(engineConfiguration, 8, 15)); assertEqualsM("getStartingFuel#3", 11.2000, getCrankingFuel3(engineConfiguration, 70, 0)); assertEqualsM("getStartingFuel#3", 5.6000, getCrankingFuel3(engineConfiguration, 70, 50)); }
void EngineState::periodicFastCallback(DECLARE_ENGINE_PARAMETER_F) { int rpm = ENGINE(rpmCalculator.rpmValue); efitick_t nowNt = getTimeNowNt(); if (isCrankingR(rpm)) { crankingTime = nowNt; } else { timeSinceCranking = nowNt - crankingTime; } sparkDwell = getSparkDwell(rpm PASS_ENGINE_PARAMETER); dwellAngle = sparkDwell / getOneDegreeTimeMs(rpm); // todo: move this into slow callback, no reason for IAT corr to be here iatFuelCorrection = getIatCorrection(iat PASS_ENGINE_PARAMETER); // todo: move this into slow callback, no reason for CLT corr to be here if (boardConfiguration->useWarmupPidAfr && clt < engineConfiguration->warmupAfrThreshold) { if (rpm < 200) { cltFuelCorrection = 1; warmupAfrPid.reset(); } else { cltFuelCorrection = warmupAfrPid.getValue(warmupTargetAfr, getAfr(PASS_ENGINE_PARAMETER_F), 1); } #if ! EFI_UNIT_TEST || defined(__DOXYGEN__) if (engineConfiguration->debugMode == WARMUP_ENRICH) { tsOutputChannels.debugFloatField1 = warmupTargetAfr; warmupAfrPid.postState(&tsOutputChannels); } #endif } else { cltFuelCorrection = getCltFuelCorrection(clt PASS_ENGINE_PARAMETER); } cltTimingCorrection = getCltTimingCorrection(clt PASS_ENGINE_PARAMETER); engineNoiseHipLevel = interpolate2d(rpm, engineConfiguration->knockNoiseRpmBins, engineConfiguration->knockNoise, ENGINE_NOISE_CURVE_SIZE); baroCorrection = getBaroCorrection(PASS_ENGINE_PARAMETER_F); injectionOffset = getinjectionOffset(rpm PASS_ENGINE_PARAMETER); float engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_F); timingAdvance = getAdvance(rpm, engineLoad PASS_ENGINE_PARAMETER); if (engineConfiguration->fuelAlgorithm == LM_SPEED_DENSITY) { float coolantC = ENGINE(engineState.clt); float intakeC = ENGINE(engineState.iat); float tps = getTPS(PASS_ENGINE_PARAMETER_F); tChargeK = convertCelsiusToKelvin(getTCharge(rpm, tps, coolantC, intakeC PASS_ENGINE_PARAMETER)); float map = getMap(); /** * *0.01 because of https://sourceforge.net/p/rusefi/tickets/153/ */ currentVE = baroCorrection * veMap.getValue(rpm, map) * 0.01; targetAFR = afrMap.getValue(rpm, map); } else { baseTableFuel = getBaseTableFuel(engineConfiguration, rpm, engineLoad); } }
void testFuelMap(void) { chDbgCheck(engineConfiguration!=NULL, "engineConfiguration"); printf("*************************************************** testFuelMap\r\n"); for (int k = 0; k < FUEL_LOAD_COUNT; k++) { for (int r = 0; r < FUEL_RPM_COUNT; r++) { engineConfiguration->fuelTable[k][r] = k * 200 + r; } } printf("*************************************************** initThermistors\r\n"); initThermistors(); printf("*** getInjectorLag\r\n"); assertEquals(0, getInjectorLag(12)); for (int i = 0; i < FUEL_LOAD_COUNT; i++) engineConfiguration->fuelLoadBins[i] = i; for (int i = 0; i < FUEL_RPM_COUNT; i++) engineConfiguration->fuelRpmBins[i] = i; printf("*************************************************** prepareFuelMap\r\n"); assertEquals(1005, getBaseTableFuel(5, 5)); engineConfiguration->injectorLag = 0.5; for (int i = 0; i < VBAT_INJECTOR_CURVE_SIZE; i++) { engineConfiguration->battInjectorLagCorrBins[i] = i; engineConfiguration->battInjectorLagCorr[i] = 2 * i; } EngineTestHelper eth(FORD_ASPIRE_1996); // because all the correction tables are zero printf("*************************************************** getRunningFuel\r\n"); float baseFuel = getBaseTableFuel(5, getEngineLoadT(ð.engine)); assertEqualsM("value", 0.5, getRunningFuel(baseFuel, ð.engine, 5)); printf("*************************************************** setting IAT table\r\n"); for (int i = 0; i < IAT_CURVE_SIZE; i++) { engineConfiguration->iatFuelCorrBins[i] = i; engineConfiguration->iatFuelCorr[i] = 2 * i; } engineConfiguration->iatFuelCorr[0] = 2; printf("*************************************************** setting CLT table\r\n"); for (int i = 0; i < CLT_CURVE_SIZE; i++) { engineConfiguration->cltFuelCorrBins[i] = i; engineConfiguration->cltFuelCorr[i] = 1; } engineConfiguration->injectorLag = 0; assertEquals(NAN, getIntakeAirTemperature()); float iatCorrection = getIatCorrection(-KELV); assertEqualsM("IAT", 2, iatCorrection); float cltCorrection = getCltCorrection(getCoolantTemperature()); assertEqualsM("CLT", 1, cltCorrection); float injectorLag = getInjectorLag(getVBatt()); assertEquals(0, injectorLag); testMafValue = 5; // 1005 * 2 for IAT correction printf("*************************************************** getRunningFuel\r\n"); baseFuel = getBaseTableFuel(5, getEngineLoadT(ð.engine)); assertEqualsM("v1", 30150, getRunningFuel(baseFuel, ð.engine, 5)); testMafValue = 0; engineConfiguration->crankingSettings.coolantTempMaxC = 65; // 8ms at 65C engineConfiguration->crankingSettings.fuelAtMaxTempMs = 8; engineConfiguration->crankingSettings.coolantTempMinC = 0; // 20ms at 0C engineConfiguration->crankingSettings.fuelAtMinTempMs = 20; printf("*************************************************** getStartingFuel\r\n"); // NAN in case we have issues with the CLT sensor // assertEquals(16, getStartingFuel(NAN)); assertEquals(20, getStartingFuel(0)); assertEquals(18.5231, getStartingFuel(8)); assertEquals(8, getStartingFuel(70)); }