Implement `Secondary injector flow compensation mode` and `Secondary injector reference pressure` settings #6972 (#7079)
This commit is contained in:
parent
8633bd92ef
commit
1e87f77a70
|
@ -49,6 +49,9 @@ Release template (copy/paste this for new release):
|
||||||
- fix detect cylinder for knock then wasted_spark #7062
|
- fix detect cylinder for knock then wasted_spark #7062
|
||||||
- Change BMW E46 CAN interval to 10 ms #6974
|
- Change BMW E46 CAN interval to 10 ms #6974
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
- Now secondary injectors use `Secondary injector flow compensation mode` and `Secondary injector reference pressure` instead of `Injector flow compensation mode` and `Injector reference pressure` Tuner Studio settings #6972
|
||||||
|
|
||||||
## August 2024 "Day 898"
|
## August 2024 "Day 898"
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
@ -44,6 +44,14 @@ InjectorNonlinearMode InjectorModelPrimary::getNonlinearMode() const {
|
||||||
return engineConfiguration->injectorNonlinearMode;
|
return engineConfiguration->injectorNonlinearMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
injector_compensation_mode_e InjectorModelPrimary::getInjectorCompensationMode() const {
|
||||||
|
return engineConfiguration->injectorCompensationMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
float InjectorModelPrimary::getFuelReferencePressure() const {
|
||||||
|
return engineConfiguration->fuelReferencePressure;
|
||||||
|
}
|
||||||
|
|
||||||
float InjectorModelSecondary::getSmallPulseFlowRate() const {
|
float InjectorModelSecondary::getSmallPulseFlowRate() const {
|
||||||
// not supported on second bank
|
// not supported on second bank
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -54,6 +62,14 @@ float InjectorModelSecondary::getSmallPulseBreakPoint() const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
injector_compensation_mode_e InjectorModelSecondary::getInjectorCompensationMode() const {
|
||||||
|
return engineConfiguration->secondaryInjectorCompensationMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
float InjectorModelSecondary::getFuelReferencePressure() const {
|
||||||
|
return engineConfiguration->secondaryInjectorFuelReferencePressure;
|
||||||
|
}
|
||||||
|
|
||||||
InjectorNonlinearMode InjectorModelSecondary::getNonlinearMode() const {
|
InjectorNonlinearMode InjectorModelSecondary::getNonlinearMode() const {
|
||||||
// nonlinear not supported on second bank
|
// nonlinear not supported on second bank
|
||||||
return InjectorNonlinearMode::INJ_None;
|
return InjectorNonlinearMode::INJ_None;
|
||||||
|
@ -68,11 +84,10 @@ expected<float> InjectorModelWithConfig::getFuelDifferentialPressure() const {
|
||||||
baroKpa = 101.325f;
|
baroKpa = 101.325f;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (engineConfiguration->injectorCompensationMode) {
|
switch (getInjectorCompensationMode()) {
|
||||||
case ICM_FixedRailPressure:
|
case ICM_FixedRailPressure:
|
||||||
// Add barometric pressure, as "fixed" really means "fixed pressure above atmosphere"
|
// Add barometric pressure, as "fixed" really means "fixed pressure above atmosphere"
|
||||||
return
|
return getFuelReferencePressure()
|
||||||
engineConfiguration->fuelReferencePressure
|
|
||||||
+ baroKpa
|
+ baroKpa
|
||||||
- map.value_or(101.325);
|
- map.value_or(101.325);
|
||||||
case ICM_SensedRailPressure: {
|
case ICM_SensedRailPressure: {
|
||||||
|
@ -112,11 +127,11 @@ expected<float> InjectorModelWithConfig::getFuelDifferentialPressure() const {
|
||||||
|
|
||||||
float InjectorModelWithConfig::getInjectorFlowRatio() {
|
float InjectorModelWithConfig::getInjectorFlowRatio() {
|
||||||
// Compensation disabled, use reference flow.
|
// Compensation disabled, use reference flow.
|
||||||
if (engineConfiguration->injectorCompensationMode == ICM_None) {
|
if (getInjectorCompensationMode() == ICM_None) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float referencePressure = engineConfiguration->fuelReferencePressure;
|
const float referencePressure = getFuelReferencePressure();
|
||||||
|
|
||||||
if (referencePressure < 50) {
|
if (referencePressure < 50) {
|
||||||
// impossibly low fuel ref pressure
|
// impossibly low fuel ref pressure
|
||||||
|
|
|
@ -54,12 +54,14 @@ public:
|
||||||
expected<float> getFuelDifferentialPressure() const override;
|
expected<float> getFuelDifferentialPressure() const override;
|
||||||
|
|
||||||
using interface_t = IInjectorModel; // Mock interface
|
using interface_t = IInjectorModel; // Mock interface
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
[[nodiscard]] virtual injector_compensation_mode_e getInjectorCompensationMode() const = 0;
|
||||||
|
[[nodiscard]] virtual float getFuelReferencePressure() const = 0;
|
||||||
|
|
||||||
const injector_s* const m_cfg;
|
const injector_s* const m_cfg;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InjectorModelPrimary : public InjectorModelWithConfig {
|
struct InjectorModelPrimary : InjectorModelWithConfig {
|
||||||
InjectorModelPrimary();
|
InjectorModelPrimary();
|
||||||
|
|
||||||
InjectorNonlinearMode getNonlinearMode() const override;
|
InjectorNonlinearMode getNonlinearMode() const override;
|
||||||
|
@ -67,9 +69,12 @@ struct InjectorModelPrimary : public InjectorModelWithConfig {
|
||||||
// Ford small pulse model
|
// Ford small pulse model
|
||||||
float getSmallPulseFlowRate() const override;
|
float getSmallPulseFlowRate() const override;
|
||||||
float getSmallPulseBreakPoint() const override;
|
float getSmallPulseBreakPoint() const override;
|
||||||
|
private:
|
||||||
|
[[nodiscard]] injector_compensation_mode_e getInjectorCompensationMode() const final;
|
||||||
|
[[nodiscard]] float getFuelReferencePressure() const final;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InjectorModelSecondary : public InjectorModelWithConfig {
|
struct InjectorModelSecondary : InjectorModelWithConfig {
|
||||||
InjectorModelSecondary();
|
InjectorModelSecondary();
|
||||||
|
|
||||||
InjectorNonlinearMode getNonlinearMode() const override;
|
InjectorNonlinearMode getNonlinearMode() const override;
|
||||||
|
@ -77,4 +82,7 @@ struct InjectorModelSecondary : public InjectorModelWithConfig {
|
||||||
// Ford small pulse model
|
// Ford small pulse model
|
||||||
float getSmallPulseFlowRate() const override;
|
float getSmallPulseFlowRate() const override;
|
||||||
float getSmallPulseBreakPoint() const override;
|
float getSmallPulseBreakPoint() const override;
|
||||||
|
private:
|
||||||
|
[[nodiscard]] injector_compensation_mode_e getInjectorCompensationMode() const final;
|
||||||
|
[[nodiscard]] float getFuelReferencePressure() const final;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1718,7 +1718,10 @@ uint8_t autoscale knockFuelTrim;Fuel trim when knock, max 30%;"%", 1, 0, 0, 30,
|
||||||
float knockSpectrumSensitivity;;"sense", 1, 0, 0, 1, 2
|
float knockSpectrumSensitivity;;"sense", 1, 0, 0, 1, 2
|
||||||
float knockFrequency;"Estimated knock frequency, ignore cylinderBore if this one > 0";"Hz", 1, 0, 0, 20000, 2
|
float knockFrequency;"Estimated knock frequency, ignore cylinderBore if this one > 0";"Hz", 1, 0, 0, 20000, 2
|
||||||
|
|
||||||
#define END_OF_CALIBRATION_PADDING 116
|
injector_compensation_mode_e secondaryInjectorCompensationMode;None = I have a MAP-referenced fuel pressure regulator\nFixed rail pressure = I have an atmosphere-referenced fuel pressure regulator (returnless, typically)\nSensed rail pressure = I have a fuel pressure sensor;
|
||||||
|
float secondaryInjectorFuelReferencePressure;This is the pressure at which your injector flow is known.\nFor example if your injectors flow 400cc/min at 3.5 bar, enter 350kpa here.;"kPa", 1, 0, 50, 700000, 0
|
||||||
|
|
||||||
|
#define END_OF_CALIBRATION_PADDING 111
|
||||||
uint8_t[END_OF_CALIBRATION_PADDING] unusedOftenChangesDuringFirmwareUpdate;;"units", 1, 0, 0, 1, 0
|
uint8_t[END_OF_CALIBRATION_PADDING] unusedOftenChangesDuringFirmwareUpdate;;"units", 1, 0, 0, 1, 0
|
||||||
|
|
||||||
! end of engine_configuration_s
|
! end of engine_configuration_s
|
||||||
|
|
|
@ -2762,7 +2762,9 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@@@ts_command_e_TS_
|
||||||
dialog = stagedInjection, "", yAxis
|
dialog = stagedInjection, "", yAxis
|
||||||
field = "Enable", enableStagedInjection, {isInjectionEnabled}
|
field = "Enable", enableStagedInjection, {isInjectionEnabled}
|
||||||
field = ""
|
field = ""
|
||||||
field = "Secondary injector flow", injectorSecondary_flow {isInjectionEnabled && enableStagedInjection}
|
field = "Secondary injector flow", injectorSecondary_flow, {isInjectionEnabled && enableStagedInjection}
|
||||||
|
field = "Secondary injector flow compensation mode", secondaryInjectorCompensationMode, { isInjectionEnabled && enableStagedInjection }
|
||||||
|
field = "Secondary injector reference pressure", secondaryInjectorFuelReferencePressure, { isInjectionEnabled && enableStagedInjection && secondaryInjectorCompensationMode != 0 }
|
||||||
field = ""
|
field = ""
|
||||||
panel = injectorsSecondaryDeadTime, {isInjectionEnabled && enableStagedInjection}
|
panel = injectorsSecondaryDeadTime, {isInjectionEnabled && enableStagedInjection}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue