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_BOOST_CONTROL,
LDS_LAUNCH_CONTROL,
LDS_HIGH_PRESSURE,
} 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;
}
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;

View File

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

View File

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

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

View File

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