parent
bb3f8cb76f
commit
f715210b39
|
@ -25,4 +25,5 @@ LDS_TPS_ACCEL,
|
||||||
LDS_MAIN_RELAY,
|
LDS_MAIN_RELAY,
|
||||||
LDS_BOOST_CONTROL,
|
LDS_BOOST_CONTROL,
|
||||||
LDS_LAUNCH_CONTROL,
|
LDS_LAUNCH_CONTROL,
|
||||||
|
LDS_HIGH_PRESSURE,
|
||||||
} live_data_e;
|
} live_data_e;
|
||||||
|
|
|
@ -106,15 +106,17 @@ float HpfpQuantity::calcPI(int rpm, float calc_fuel_percent) {
|
||||||
return p_control_percent + i_control_percent;
|
return p_control_percent + i_control_percent;
|
||||||
}
|
}
|
||||||
|
|
||||||
angle_t HpfpQuantity::pumpAngleFuel(int rpm) {
|
angle_t HpfpQuantity::pumpAngleFuel(int rpm, HpfpController *model) {
|
||||||
// Math based on fuel requested
|
// Math based on fuel requested
|
||||||
float fuel_requested_percent = calcFuelPercent(rpm);
|
model->fuel_requested_percent = calcFuelPercent(rpm);
|
||||||
|
|
||||||
|
model->fuel_requested_percent_pi = calcPI(rpm, model->fuel_requested_percent);
|
||||||
// Apply PI control
|
// Apply PI control
|
||||||
fuel_requested_percent += calcPI(rpm, fuel_requested_percent);
|
float fuel_requested_percentTotal = model->fuel_requested_percent + model->fuel_requested_percent_pi;
|
||||||
|
|
||||||
|
|
||||||
// Convert to degrees
|
// Convert to degrees
|
||||||
return interpolate2d(fuel_requested_percent,
|
return interpolate2d(fuel_requested_percentTotal,
|
||||||
engineConfiguration->hpfpLobeProfileQuantityBins,
|
engineConfiguration->hpfpLobeProfileQuantityBins,
|
||||||
engineConfiguration->hpfpLobeProfileAngle);
|
engineConfiguration->hpfpLobeProfileAngle);
|
||||||
}
|
}
|
||||||
|
@ -141,7 +143,7 @@ void HpfpController::onFastCallback() {
|
||||||
|
|
||||||
// We set deadtime first, then pump, in case pump used to be 0. Pump is what
|
// We set deadtime first, then pump, in case pump used to be 0. Pump is what
|
||||||
// determines whether we do anything or not.
|
// determines whether we do anything or not.
|
||||||
m_requested_pump = m_quantity.pumpAngleFuel(rpm);
|
m_requested_pump = m_quantity.pumpAngleFuel(rpm, this);
|
||||||
|
|
||||||
if (!m_running) {
|
if (!m_running) {
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "high_pressure_fuel_pump_generated.h"
|
||||||
|
|
||||||
class HpfpLobe {
|
class HpfpLobe {
|
||||||
public:
|
public:
|
||||||
|
@ -30,6 +31,8 @@ public:
|
||||||
angle_t findNextLobe(); ///< Calculate the angle (after crank TDC) for the top of the next lobe
|
angle_t findNextLobe(); ///< Calculate the angle (after crank TDC) for the top of the next lobe
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class HpfpController;
|
||||||
|
|
||||||
class HpfpQuantity {
|
class HpfpQuantity {
|
||||||
public:
|
public:
|
||||||
float m_I_sum_percent = 0;
|
float m_I_sum_percent = 0;
|
||||||
|
@ -38,7 +41,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Calculate where the pump should become active, in degrees before pump lobe TDC
|
* Calculate where the pump should become active, in degrees before pump lobe TDC
|
||||||
*/
|
*/
|
||||||
angle_t pumpAngleFuel(int rpm);
|
angle_t pumpAngleFuel(int rpm, HpfpController *model);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the percent of the pump stroke needed to replace the fuel injected. Also
|
* Calculate the percent of the pump stroke needed to replace the fuel injected. Also
|
||||||
|
@ -73,7 +76,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class HpfpController : public EngineModule {
|
class HpfpController : public EngineModule, public high_pressure_fuel_pump_s {
|
||||||
public:
|
public:
|
||||||
void onFastCallback() final;
|
void onFastCallback() final;
|
||||||
|
|
||||||
|
@ -86,7 +89,6 @@ private:
|
||||||
HpfpLobe m_lobe;
|
HpfpLobe m_lobe;
|
||||||
|
|
||||||
volatile bool m_running = false; ///< Whether events are being scheduled or not
|
volatile bool m_running = false; ///< Whether events are being scheduled or not
|
||||||
volatile angle_t m_requested_pump = 0; ///< Computed requested pump duration in degrees (not including deadtime)
|
|
||||||
volatile angle_t m_deadtime = 0; ///< Computed solenoid deadtime in degrees
|
volatile angle_t m_deadtime = 0; ///< Computed solenoid deadtime in degrees
|
||||||
|
|
||||||
void scheduleNextCycle();
|
void scheduleNextCycle();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
struct_no_prefix high_pressure_fuel_pump_s
|
struct_no_prefix high_pressure_fuel_pump_s
|
||||||
|
|
||||||
angle_t m_requested_pump
|
angle_t m_requested_pump;Computed requested pump duration in degrees (not including deadtime)
|
||||||
float fuel_requested_percent
|
float fuel_requested_percent
|
||||||
float fuel_requested_percent_pi
|
float fuel_requested_percent_pi
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) controllers/engine_cycle/high_pressure_fuel_pump.txt Fri Dec 31 03:07:40 EST 2021
|
// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) controllers/engine_cycle/high_pressure_fuel_pump.txt Fri Dec 31 15:12:40 EST 2021
|
||||||
// by class com.rusefi.output.CHeaderConsumer
|
// by class com.rusefi.output.CHeaderConsumer
|
||||||
// begin
|
// begin
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@ -6,6 +6,7 @@
|
||||||
// start of high_pressure_fuel_pump_s
|
// start of high_pressure_fuel_pump_s
|
||||||
struct high_pressure_fuel_pump_s {
|
struct high_pressure_fuel_pump_s {
|
||||||
/**
|
/**
|
||||||
|
* Computed requested pump duration in degrees (not including deadtime)
|
||||||
* offset 0
|
* offset 0
|
||||||
*/
|
*/
|
||||||
angle_t m_requested_pump = (angle_t)0;
|
angle_t m_requested_pump = (angle_t)0;
|
||||||
|
@ -21,4 +22,4 @@ struct high_pressure_fuel_pump_s {
|
||||||
};
|
};
|
||||||
|
|
||||||
// end
|
// end
|
||||||
// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) controllers/engine_cycle/high_pressure_fuel_pump.txt Fri Dec 31 03:07:40 EST 2021
|
// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) controllers/engine_cycle/high_pressure_fuel_pump.txt Fri Dec 31 15:12:40 EST 2021
|
||||||
|
|
|
@ -188,20 +188,22 @@ TEST(HPFP, Angle) {
|
||||||
engineConfiguration->hpfpLobeProfileAngle[i] = 150. * i / (HPFP_LOBE_PROFILE_SIZE - 1);
|
engineConfiguration->hpfpLobeProfileAngle[i] = 150. * i / (HPFP_LOBE_PROFILE_SIZE - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HpfpController model;
|
||||||
|
|
||||||
EXPECT_FLOAT_EQ(math.calcFuelPercent(1000), 25); // Double check baseline
|
EXPECT_FLOAT_EQ(math.calcFuelPercent(1000), 25); // Double check baseline
|
||||||
EXPECT_FLOAT_EQ(math.calcPI(1000, 10), 0); // Validate no PI
|
EXPECT_FLOAT_EQ(math.calcPI(1000, 10), 0); // Validate no PI
|
||||||
EXPECT_NEAR(math.pumpAngleFuel(1000), 37.5, 0.4); // Given the profile, should be 50% higher
|
EXPECT_NEAR(math.pumpAngleFuel(1000, &model), 37.5, 0.4); // Given the profile, should be 50% higher
|
||||||
|
|
||||||
engine->injectionMass[0] = 0.08 /* cc/cyl */ * fuelDensity;
|
engine->injectionMass[0] = 0.08 /* cc/cyl */ * fuelDensity;
|
||||||
EXPECT_FLOAT_EQ(math.calcFuelPercent(1000), 40); // Double check baseline
|
EXPECT_FLOAT_EQ(math.calcFuelPercent(1000), 40); // Double check baseline
|
||||||
EXPECT_FLOAT_EQ(math.calcPI(1000, 10), 0); // Validate no PI
|
EXPECT_FLOAT_EQ(math.calcPI(1000, 10), 0); // Validate no PI
|
||||||
EXPECT_NEAR(math.pumpAngleFuel(1000), 60, 0.4); // Given the profile, should be 50% higher
|
EXPECT_NEAR(math.pumpAngleFuel(1000, &model), 60, 0.4); // Given the profile, should be 50% higher
|
||||||
|
|
||||||
engineConfiguration->hpfpPidP = 0.01;
|
engineConfiguration->hpfpPidP = 0.01;
|
||||||
Sensor::setMockValue(SensorType::Map, 40);
|
Sensor::setMockValue(SensorType::Map, 40);
|
||||||
Sensor::setMockValue(SensorType::FuelPressureHigh, 1000);
|
Sensor::setMockValue(SensorType::FuelPressureHigh, 1000);
|
||||||
EXPECT_FLOAT_EQ(math.calcPI(1000, 10), 10.1);
|
EXPECT_FLOAT_EQ(math.calcPI(1000, 10), 10.1);
|
||||||
EXPECT_NEAR(math.pumpAngleFuel(1000), 50.1 * 1.5, 0.4); // Given the profile, should be 50% higher
|
EXPECT_NEAR(math.pumpAngleFuel(1000, &model), 50.1 * 1.5, 0.4); // Given the profile, should be 50% higher
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(HPFP, Schedule) {
|
TEST(HPFP, Schedule) {
|
||||||
|
|
Loading…
Reference in New Issue