[DRAFT] Fix cranking->idling taper phase for useSeparate*ForIdle tables (#3168)

* Rename Phase::CrankToRunTaper -> CrankToIdleTaper

* Change isIdling() to isIdlingOrTaper()

* test_idle_controller.cpp

* useSeparateIdleTablesForCrankingTaper setting

Co-authored-by: Andrei <andreikagit@users.noreply.github.com>
This commit is contained in:
Andreika 2021-10-06 19:05:20 +03:00 committed by GitHub
parent a8f0187b5a
commit d917cc8cc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 16 additions and 15 deletions

View File

@ -187,7 +187,7 @@ IIdleController::Phase IdleController::determinePhase(int rpm, int targetRpm, Se
// If still in the cranking taper, disable closed loop idle
if (crankingTaperFraction < 1) {
return Phase::CrankToRunTaper;
return Phase::CrankToIdleTaper;
}
// No other conditions met, we are idling!
@ -506,8 +506,8 @@ float getIdleTimingAdjustment(int rpm) {
return idleControllerInstance.getIdleTimingAdjustment(rpm);
}
bool isIdling() {
return idleControllerInstance.isIdling();
bool isIdlingOrTaper() {
return idleControllerInstance.isIdlingOrTaper();
}
static void applyPidSettings(DECLARE_ENGINE_PARAMETER_SIGNATURE) {

View File

@ -18,7 +18,7 @@ struct IIdleController {
Cranking, // Below cranking threshold
Idling, // Below idle RPM, off throttle
Coasting, // Off throttle but above idle RPM
CrankToRunTaper, // Taper between cranking and running
CrankToIdleTaper, // Taper between cranking and idling
Running, // On throttle
};
@ -59,8 +59,8 @@ public:
float getClosedLoop(IIdleController::Phase phase, float tpsPos, int rpm, int targetRpm) override;
// Allow querying state from outside
bool isIdling() {
return m_lastPhase == Phase::Idling;
bool isIdlingOrTaper() {
return m_lastPhase == Phase::Idling || (CONFIG(useSeparateIdleTablesForCrankingTaper) && m_lastPhase == Phase::CrankToIdleTaper);
}
private:
@ -79,7 +79,7 @@ percent_t getIdlePosition();
float getIdleTimingAdjustment(int rpm);
bool isIdling();
bool isIdlingOrTaper();
void applyIACposition(percent_t position DECLARE_ENGINE_PARAMETER_SUFFIX);
void setManualIdleValvePosition(int positionPercent);

View File

@ -50,7 +50,7 @@ static angle_t getRunningAdvance(int rpm, float engineLoad DECLARE_ENGINE_PARAME
float advanceAngle = advanceMap.getValue((float) rpm, engineLoad);
// get advance from the separate table for Idle
if (CONFIG(useSeparateAdvanceForIdle) && isIdling()) {
if (CONFIG(useSeparateAdvanceForIdle) && isIdlingOrTaper()) {
float idleAdvance = interpolate2d(rpm, config->idleAdvanceBins, config->idleAdvance);
auto [valid, tps] = Sensor::get(SensorType::DriverThrottleIntent);

View File

@ -24,7 +24,7 @@ float AirmassVeModelBase::getVe(int rpm, float load) const {
auto tps = Sensor::get(SensorType::Tps1);
// get VE from the separate table for Idle if idling
if (isIdling() && tps && CONFIG(useSeparateVeForIdle)) {
if (isIdlingOrTaper() && tps && CONFIG(useSeparateVeForIdle)) {
float idleVe = interpolate2d(rpm, config->idleVeBins, config->idleVe);
// interpolate between idle table and normal (running) table using TPS threshold
ve = interpolateClamped(0.0f, idleVe, CONFIG(idlePidDeactivationTpsThreshold), ve, tps.Value);

View File

@ -587,7 +587,7 @@ bit cj125isUrDivided;+Is your UR CJ125 output wired to MCU via resistor divider?
bit useCicPidForIdle;+Switch between Industrial and Cic PID implementation
bit useTLE8888_cranking_hack;
bit useInstantRpmForIdle;
bit unused76b19;
bit useSeparateIdleTablesForCrankingTaper;+This uses separate ignition timing and VE tables not only for idle conditions, also during the postcranking-to-idle taper transition (See also afterCrankingIACtaperDuration).
bit launchControlEnabled;
bit rollingLaunchEnabled;
bit antiLagEnabled;

View File

@ -2708,6 +2708,7 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00"
dialog = idleExtra, "Extra Idle Features"
field = "Use idle ignition table", useSeparateAdvanceForIdle
field = "Use idle VE table", useSeparateVeForIdle
field = "Use idle tables for cranking taper", useSeparateIdleTablesForCrankingTaper
field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0}
field = useInstantRpmForIdle, useInstantRpmForIdle
field = "Detailed status in console", isVerboseIAC

View File

@ -98,7 +98,7 @@ TEST(idle_v2, testDeterminePhase) {
EXPECT_EQ(ICP::Running, dut.determinePhase(1000, 1000, 0, 25, 10));
// Check that shortly after cranking, the cranking taper inhibits closed loop idle
EXPECT_EQ(ICP::CrankToRunTaper, dut.determinePhase(1000, 1000, 0, 0, 0.5f));
EXPECT_EQ(ICP::CrankToIdleTaper, dut.determinePhase(1000, 1000, 0, 0, 0.5f));
// Above TPS threshold should be outside the zone
EXPECT_EQ(ICP::Running, dut.determinePhase(1000, 1000, 10, 0, 10));
@ -246,19 +246,19 @@ TEST(idle_v2, openLoopRunningTaper) {
// 0 cycles - no taper yet, pure cranking value
EXPECT_FLOAT_EQ(75, dut.getOpenLoop(ICP::Running, 30, 0, 0));
EXPECT_FLOAT_EQ(75, dut.getOpenLoop(ICP::CrankToRunTaper, 30, 0, 0));
EXPECT_FLOAT_EQ(75, dut.getOpenLoop(ICP::CrankToIdleTaper, 30, 0, 0));
// 1/2 taper - half way, 50% each value -> outputs 50
EXPECT_FLOAT_EQ(50, dut.getOpenLoop(ICP::Running, 30, 0, 0.5f));
EXPECT_FLOAT_EQ(50, dut.getOpenLoop(ICP::CrankToRunTaper, 30, 0, 0.5f));
EXPECT_FLOAT_EQ(50, dut.getOpenLoop(ICP::CrankToIdleTaper, 30, 0, 0.5f));
// 1x taper - fully tapered, should be running value
EXPECT_FLOAT_EQ(25, dut.getOpenLoop(ICP::Running, 30, 0, 1.0f));
EXPECT_FLOAT_EQ(25, dut.getOpenLoop(ICP::CrankToRunTaper, 30, 0, 1.0f));
EXPECT_FLOAT_EQ(25, dut.getOpenLoop(ICP::CrankToIdleTaper, 30, 0, 1.0f));
// 2x taper - still fully tapered, should be running value
EXPECT_FLOAT_EQ(25, dut.getOpenLoop(ICP::Running, 30, 0, 2.0f));
EXPECT_FLOAT_EQ(25, dut.getOpenLoop(ICP::CrankToRunTaper, 30, 0, 2.0f));
EXPECT_FLOAT_EQ(25, dut.getOpenLoop(ICP::CrankToIdleTaper, 30, 0, 2.0f));
}
TEST(idle_v2, getCrankingTaperFraction) {