live view
This commit is contained in:
rusefillc 2021-12-31 15:28:24 -05:00
parent bb3f8cb76f
commit f715210b39
6 changed files with 22 additions and 14 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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) {