From f715210b39d57fcdf600edc3bb5c862334e07295 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Fri, 31 Dec 2021 15:28:24 -0500 Subject: [PATCH] GDI Epic #1448 live view --- firmware/controllers/algo/live_data_ids.h | 1 + .../engine_cycle/high_pressure_fuel_pump.cpp | 12 +++++++----- .../engine_cycle/high_pressure_fuel_pump.h | 8 +++++--- .../engine_cycle/high_pressure_fuel_pump.txt | 2 +- .../engine_cycle/high_pressure_fuel_pump_generated.h | 5 +++-- unit_tests/tests/test_hpfp.cpp | 8 +++++--- 6 files changed, 22 insertions(+), 14 deletions(-) diff --git a/firmware/controllers/algo/live_data_ids.h b/firmware/controllers/algo/live_data_ids.h index ee551d96a0..3e53465dc7 100644 --- a/firmware/controllers/algo/live_data_ids.h +++ b/firmware/controllers/algo/live_data_ids.h @@ -25,4 +25,5 @@ LDS_TPS_ACCEL, LDS_MAIN_RELAY, LDS_BOOST_CONTROL, LDS_LAUNCH_CONTROL, +LDS_HIGH_PRESSURE, } live_data_e; diff --git a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp index 291c9421c3..5e98f070f0 100644 --- a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp +++ b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp @@ -106,15 +106,17 @@ float HpfpQuantity::calcPI(int rpm, float calc_fuel_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 - 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 - fuel_requested_percent += calcPI(rpm, fuel_requested_percent); + float fuel_requested_percentTotal = model->fuel_requested_percent + model->fuel_requested_percent_pi; + // Convert to degrees - return interpolate2d(fuel_requested_percent, + return interpolate2d(fuel_requested_percentTotal, engineConfiguration->hpfpLobeProfileQuantityBins, 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 // 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) { m_running = true; diff --git a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.h b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.h index 2d9a0427f0..6e01625b6c 100644 --- a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.h +++ b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.h @@ -22,6 +22,7 @@ */ #pragma once +#include "high_pressure_fuel_pump_generated.h" class HpfpLobe { public: @@ -30,6 +31,8 @@ public: angle_t findNextLobe(); ///< Calculate the angle (after crank TDC) for the top of the next lobe }; +class HpfpController; + class HpfpQuantity { public: float m_I_sum_percent = 0; @@ -38,7 +41,7 @@ public: /** * 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 @@ -73,7 +76,7 @@ public: } }; -class HpfpController : public EngineModule { +class HpfpController : public EngineModule, public high_pressure_fuel_pump_s { public: void onFastCallback() final; @@ -86,7 +89,6 @@ private: HpfpLobe m_lobe; 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 void scheduleNextCycle(); diff --git a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.txt b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.txt index 1e5b1fb907..0b310c774e 100644 --- a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.txt +++ b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.txt @@ -1,6 +1,6 @@ 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_pi diff --git a/firmware/controllers/engine_cycle/high_pressure_fuel_pump_generated.h b/firmware/controllers/engine_cycle/high_pressure_fuel_pump_generated.h index 3cd799a0ef..df412f8812 100644 --- a/firmware/controllers/engine_cycle/high_pressure_fuel_pump_generated.h +++ b/firmware/controllers/engine_cycle/high_pressure_fuel_pump_generated.h @@ -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 // begin #pragma once @@ -6,6 +6,7 @@ // start of high_pressure_fuel_pump_s struct high_pressure_fuel_pump_s { /** + * Computed requested pump duration in degrees (not including deadtime) * offset 0 */ angle_t m_requested_pump = (angle_t)0; @@ -21,4 +22,4 @@ struct high_pressure_fuel_pump_s { }; // 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 diff --git a/unit_tests/tests/test_hpfp.cpp b/unit_tests/tests/test_hpfp.cpp index 6fcc9d3b85..fe067d37d7 100755 --- a/unit_tests/tests/test_hpfp.cpp +++ b/unit_tests/tests/test_hpfp.cpp @@ -188,20 +188,22 @@ TEST(HPFP, Angle) { 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.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; EXPECT_FLOAT_EQ(math.calcFuelPercent(1000), 40); // Double check baseline 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; Sensor::setMockValue(SensorType::Map, 40); Sensor::setMockValue(SensorType::FuelPressureHigh, 1000); 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) {