/** * @return value in seconds */ float sdMath(engine_configuration_s *engineConfiguration, float VE, float MAP, float AFR, float temp) { if (MAP < 0.001 || cisnan(MAP)) { warning(OBD_PCM_Processor_Fault, "invalid MAP value"); return 0; } float injectorFlowRate = cc_minute_to_gramm_second(engineConfiguration->injectorFlow); float Vol = engineConfiguration->displacement / engineConfiguration->cylindersCount; return (Vol * VE * MAP) / (AFR * injectorFlowRate * GAS_R * temp); }
/** * @return per cylinder injection time, in seconds */ float sdMath(float airMass, float AFR DECLARE_GLOBAL_SUFFIX) { /** * todo: pre-calculate gramm/second injector flow to save one multiplication * open question if that's needed since that's just a multiplication */ float injectorFlowRate = cc_minute_to_gramm_second(get_injector_flow); /** * injection_pulse_duration = fuel_mass / injector_flow * fuel_mass = air_mass / target_afr * * injection_pulse_duration = (air_mass / target_afr) / injector_flow */ return airMass / (AFR * injectorFlowRate); }
/** * @return total duration of fuel injection per engine cycle, in milliseconds */ float getRealMafFuel(float airSpeed, int rpm DECLARE_ENGINE_PARAMETER_S) { if (rpm == 0) return 0; // duration of engine cycle, in hours float engineCycleDurationHr = 1.0 / 60 / rpm; float airMassKg = airSpeed * engineCycleDurationHr; /** * todo: pre-calculate gramm/second injector flow to save one multiplication * open question if that's needed since that's just a multiplication */ float injectorFlowRate = cc_minute_to_gramm_second(engineConfiguration->injector.flow); float afr = afrMap.getValue(airSpeed, rpm); float fuelMassGramm = airMassKg / afr * 1000; return 1000 * fuelMassGramm / injectorFlowRate; }
/** * @return per cylinder injection time, in seconds */ float sdMath(engine_configuration_s *engineConfiguration, float VE, float MAP, float AFR, float tempK) { if (MAP < 0.001 || cisnan(MAP)) { warning(OBD_PCM_Processor_Fault, "invalid MAP value"); return 0; } /** * todo: pre-calculate gramm/second injector flow to save one multiplication * open question if that's needed since that's just a multiplication */ float injectorFlowRate = cc_minute_to_gramm_second(engineConfiguration->injector.flow); // todo: pre-calculate cylinder displacement to save one division float cylinderDisplacement = engineConfiguration->specs.displacement / engineConfiguration->specs.cylindersCount; float airMass = (cylinderDisplacement * VE * MAP) / (GAS_R * tempK); /** * injection_pulse_duration = fuel_mass / injector_flow * fuel_mass = air_mass / target_afr * * injection_pulse_duration = (air_mass / target_afr) / injector_flow */ return airMass / (AFR * injectorFlowRate); }