mirror of https://github.com/rusefi/rusefi-1.git
idle fan/AC open loop bump (#2785)
* idle open loop ui section * idle bump logic * test fan/ac bump
This commit is contained in:
parent
39e4f70405
commit
f3c5ff6d54
|
@ -246,8 +246,10 @@ float IdleController::getRunningOpenLoop(float clt, SensorResult tps) const {
|
||||||
|
|
||||||
// Now we bump it by the AC/fan amount if necessary
|
// Now we bump it by the AC/fan amount if necessary
|
||||||
running += engine->acSwitchState ? CONFIG(acIdleExtraOffset) : 0;
|
running += engine->acSwitchState ? CONFIG(acIdleExtraOffset) : 0;
|
||||||
// TODO: fan idle bump needs its own config field
|
running += enginePins.fanRelay.getLogicValue() ? CONFIG(fan1ExtraIdle) : 0;
|
||||||
running += enginePins.fanRelay.getLogicValue() ? CONFIG(acIdleExtraOffset) : 0;
|
|
||||||
|
// TODO: once we have dual fans, enable
|
||||||
|
//running += enginePins.fanRelay2.getLogicValue() ? CONFIG(fan2ExtraIdle) : 0;
|
||||||
|
|
||||||
// Now bump it by the specified amount when the throttle is opened (if configured)
|
// Now bump it by the specified amount when the throttle is opened (if configured)
|
||||||
// nb: invalid tps will make no change, no explicit check required
|
// nb: invalid tps will make no change, no explicit check required
|
||||||
|
|
|
@ -808,7 +808,7 @@ custom adc_channel_mode_e 4 bits, U32, @OFFSET@, [0:1], "Off", "Slow", "Fas
|
||||||
brain_pin_e canRxPin;set_can_rx_pin X
|
brain_pin_e canRxPin;set_can_rx_pin X
|
||||||
|
|
||||||
pin_input_mode_e throttlePedalUpPinMode;
|
pin_input_mode_e throttlePedalUpPinMode;
|
||||||
uint8_t fsio_visible acIdleExtraOffset;+Additional idle PID offset while A/C is active;"Percent", 1, 0, 0, 255, 0
|
uint8_t fsio_visible acIdleExtraOffset;+Additional idle % while A/C is active;"%", 1, 0, 0, 100, 0
|
||||||
|
|
||||||
int can2SleepPeriodMs;+CANbus thread period, ms;"ms", 1, 0, 0, 1000.0, 2
|
int can2SleepPeriodMs;+CANbus thread period, ms;"ms", 1, 0, 0, 1000.0, 2
|
||||||
uint16_t wastegatePositionMin;+Voltage when the wastegate is closed.\nYou probably don't have one of these!;"mv", 1, 0, 0, 5000, 0
|
uint16_t wastegatePositionMin;+Voltage when the wastegate is closed.\nYou probably don't have one of these!;"mv", 1, 0, 0, 5000, 0
|
||||||
|
@ -1322,7 +1322,7 @@ float[MAP_ACCEL_TAPER] mapAccelTaperMult;;"mult", 1, 0, 0.0, 300,
|
||||||
float tChargeMaxRpmMaxTps;;"mult", 1, 0, 0, 3, 4
|
float tChargeMaxRpmMaxTps;;"mult", 1, 0, 0, 3, 4
|
||||||
|
|
||||||
fsio_pwm_freq_t[CAMS_PER_BANK iterate] auxPidFrequency;
|
fsio_pwm_freq_t[CAMS_PER_BANK iterate] auxPidFrequency;
|
||||||
uint8_t unused1301;;"units", 1, 0, -20, 100, 0
|
uint8_t fan1ExtraIdle;+Additional idle % when fan #1 is active;"%", 1, 0, 0, 100, 0
|
||||||
int alternatorPwmFrequency;;"Hz", 1, 0, 0, 3000.0, 0
|
int alternatorPwmFrequency;;"Hz", 1, 0, 0, 3000.0, 0
|
||||||
int unused2260;;"units", 1, 0, -20, 100, 0
|
int unused2260;;"units", 1, 0, -20, 100, 0
|
||||||
|
|
||||||
|
@ -1330,7 +1330,8 @@ float[MAP_ACCEL_TAPER] mapAccelTaperMult;;"mult", 1, 0, 0.0, 300,
|
||||||
float[NARROW_BAND_WIDE_BAND_CONVERSION_SIZE] narrowToWideOxygen;;"ratio", 1, 0, -40.0, 40.0, 2
|
float[NARROW_BAND_WIDE_BAND_CONVERSION_SIZE] narrowToWideOxygen;;"ratio", 1, 0, -40.0, 40.0, 2
|
||||||
vvt_mode_e[CAMS_PER_BANK iterate] vvtMode;set vvt_mode X
|
vvt_mode_e[CAMS_PER_BANK iterate] vvtMode;set vvt_mode X
|
||||||
uint8_t[CAMS_PER_BANK_padding] vvtModePadding;;
|
uint8_t[CAMS_PER_BANK_padding] vvtModePadding;;
|
||||||
uint8_t[22] unusedOldBiquad;;"units", 1, 0, -20, 100, 0
|
uint8_t fan2ExtraIdle;+Additional idle % when fan #2 is active;"%", 1, 0, 0, 100, 0
|
||||||
|
uint8_t[21] unusedOldBiquad;;"units", 1, 0, -20, 100, 0
|
||||||
float[CLT_TIMING_CURVE_SIZE] cltTimingBins;CLT-based timing correction;"C", 1, 0, -100.0, 250.0, 1
|
float[CLT_TIMING_CURVE_SIZE] cltTimingBins;CLT-based timing correction;"C", 1, 0, -100.0, 250.0, 1
|
||||||
float[CLT_TIMING_CURVE_SIZE] cltTimingExtra;;"degree", 1, 0, -400.0, 400.0, 0
|
float[CLT_TIMING_CURVE_SIZE] cltTimingExtra;;"degree", 1, 0, -400.0, 400.0, 0
|
||||||
custom tle8888_mode_e 1 bits, U08, @OFFSET@, [0:1], "Auto", "SemiAuto", "Manual", "Hall"
|
custom tle8888_mode_e 1 bits, U08, @OFFSET@, [0:1], "Auto", "SemiAuto", "Manual", "Hall"
|
||||||
|
|
|
@ -2624,13 +2624,19 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00"
|
||||||
field = "use Cic Pid", useCicPidForIdle
|
field = "use Cic Pid", useCicPidForIdle
|
||||||
field = "Use IAC PID Multiplier Table", useIacPidMultTable
|
field = "Use IAC PID Multiplier Table", useIacPidMultTable
|
||||||
|
|
||||||
|
dialog = idleOpenLoop, "Open Loop Idle"
|
||||||
|
slider = "Open loop base position", manIdlePosition, horizontal
|
||||||
|
field = "A/C adder", acIdleExtraOffset
|
||||||
|
field = "Fan #1 adder", fan1ExtraIdle
|
||||||
|
;field = "Fan #2 adder", fan2ExtraIdle
|
||||||
|
field = "Extra idle air if throttle pressed", iacByTpsTaper
|
||||||
|
|
||||||
dialog = idleGating, "Idle Detection Thresholds"
|
dialog = idleGating, "Idle Detection Thresholds"
|
||||||
field = "TPS threshold", idlePidDeactivationTpsThreshold
|
field = "TPS threshold", idlePidDeactivationTpsThreshold
|
||||||
field = "RPM upper limit", idlePidRpmUpperLimit
|
field = "RPM upper limit", idlePidRpmUpperLimit
|
||||||
field = "RPM deadzone", idlePidRpmDeadZone
|
field = "RPM deadzone", idlePidRpmDeadZone
|
||||||
|
|
||||||
dialog = idleExtra, "Extra Idle Features"
|
dialog = idleExtra, "Extra Idle Features"
|
||||||
field = "Extra idle air if throttle pressed", iacByTpsTaper
|
|
||||||
field = "Use idle ignition table", useSeparateAdvanceForIdle
|
field = "Use idle ignition table", useSeparateAdvanceForIdle
|
||||||
field = "Use idle VE table", useSeparateVeForIdle
|
field = "Use idle VE table", useSeparateVeForIdle
|
||||||
field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0}
|
field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0}
|
||||||
|
@ -2641,10 +2647,9 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00"
|
||||||
field = "Idle control mode", idleMode
|
field = "Idle control mode", idleMode
|
||||||
|
|
||||||
field = "! Solenoid idle control is disabled at zero RPM"
|
field = "! Solenoid idle control is disabled at zero RPM"
|
||||||
slider = "Open loop idle position", manIdlePosition, horizontal
|
|
||||||
field = ""
|
|
||||||
|
|
||||||
panel = idleGating
|
panel = idleGating
|
||||||
|
panel = idleOpenLoop
|
||||||
panel = idlePidSettings, { idleMode == 0}
|
panel = idlePidSettings, { idleMode == 0}
|
||||||
panel = idleExtra
|
panel = idleExtra
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,44 @@ TEST(idle_v2, runningOpenLoopBasic) {
|
||||||
EXPECT_FLOAT_EQ(25, dut.getRunningOpenLoop(50, 0));
|
EXPECT_FLOAT_EQ(25, dut.getRunningOpenLoop(50, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: test AC/fan open loop compensation
|
TEST(idle_v2, runningFanAcBump) {
|
||||||
|
WITH_ENGINE_TEST_HELPER(TEST_ENGINE);
|
||||||
|
IdleController dut;
|
||||||
|
INJECT_ENGINE_REFERENCE(&dut);
|
||||||
|
|
||||||
|
engineConfiguration->manIdlePosition = 50;
|
||||||
|
engineConfiguration->acIdleExtraOffset = 9;
|
||||||
|
engineConfiguration->fan1ExtraIdle = 7;
|
||||||
|
engineConfiguration->fan2ExtraIdle = 3;
|
||||||
|
|
||||||
|
setArrayValues(config->cltIdleCorr, 1.0f);
|
||||||
|
|
||||||
|
// Start with fan off
|
||||||
|
enginePins.fanRelay.setValue(0);
|
||||||
|
|
||||||
|
// Should be base position
|
||||||
|
EXPECT_FLOAT_EQ(50, dut.getRunningOpenLoop(10, 0));
|
||||||
|
|
||||||
|
// Turn on AC!
|
||||||
|
engine->acSwitchState = true;
|
||||||
|
EXPECT_FLOAT_EQ(50 + 9, dut.getRunningOpenLoop(10, 0));
|
||||||
|
engine->acSwitchState = false;
|
||||||
|
|
||||||
|
// Turn the fan on!
|
||||||
|
enginePins.fanRelay.setValue(1);
|
||||||
|
EXPECT_FLOAT_EQ(50 + 7, dut.getRunningOpenLoop(10, 0));
|
||||||
|
enginePins.fanRelay.setValue(0);
|
||||||
|
|
||||||
|
// Turn on the other fan!
|
||||||
|
//enginePins.fanRelay2.setValue(1);
|
||||||
|
//EXPECT_FLOAT_EQ(50 + 3, dut.getRunningOpenLoop(10, 0));
|
||||||
|
|
||||||
|
// Turn on everything!
|
||||||
|
engine->acSwitchState = true;
|
||||||
|
enginePins.fanRelay.setValue(1);
|
||||||
|
///nginePins.fanRelay2.setValue(1);
|
||||||
|
EXPECT_FLOAT_EQ(50 + 9 + 7 /* + 3 */, dut.getRunningOpenLoop(10, 0));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(idle_v2, runningOpenLoopTpsTaper) {
|
TEST(idle_v2, runningOpenLoopTpsTaper) {
|
||||||
WITH_ENGINE_TEST_HELPER(TEST_ENGINE);
|
WITH_ENGINE_TEST_HELPER(TEST_ENGINE);
|
||||||
|
|
Loading…
Reference in New Issue