From 97e0270b1c626efa64240d04708eb7542edde92f Mon Sep 17 00:00:00 2001 From: rusEfi Date: Sun, 22 Sep 2019 23:28:11 -0400 Subject: [PATCH] ETB is sticky around zero and does not want to close all the way #943 --- .../actuators/electronic_throttle.cpp | 20 +++++++++++++++++++ firmware/controllers/algo/obd_error_codes.h | 2 +- firmware/integration/rusefi_config.txt | 2 +- firmware/tunerstudio/rusefi.input | 1 + .../com/rusefi/config/generated/Fields.java | 8 ++++---- .../com/rusefi/ui/etb/EtbReturnToNeutral.java | 5 ++++- 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index ed4cf7fd41..e2f38df9aa 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -104,6 +104,10 @@ static pedal2tps_t pedal2tpsMap("Pedal2Tps", 1); EXTERN_ENGINE; +static bool startupPositionError = false; + +#define STARTUP_NEUTRAL_POSITION_ERROR_THRESHOLD 1 + class EtbControl { private: OutputPin m_pinEnable; @@ -193,6 +197,11 @@ static percent_t currentEtbDuty; #endif /* EFI_TUNER_STUDIO */ } + if (startupPositionError) { + etb1.dcMotor.Set(0); + return; + } + if (shouldResetPid) { etbPid.reset(); shouldResetPid = false; @@ -572,6 +581,17 @@ void initElectronicThrottle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { } autoTune.SetOutputStep(0.1); + percent_t startupThrottlePosition = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE); + if (absF(startupThrottlePosition - engineConfiguration->etbNeutralPosition) > STARTUP_NEUTRAL_POSITION_ERROR_THRESHOLD) { + /** + * Unexpected electronic throttle start-up position is worth a fatal error + */ + firmwareError(OBD_Throttle_Actuator_Control_Range_Performance_Bank_1, "startup ETB position %.2f not %d", + startupThrottlePosition, + engineConfiguration->etbNeutralPosition); + startupPositionError = true; + } + startETBPins(PASS_ENGINE_PARAMETER_SIGNATURE); tuneWorkingPidSettings.pFactor = 1; diff --git a/firmware/controllers/algo/obd_error_codes.h b/firmware/controllers/algo/obd_error_codes.h index 8451f87fa5..018ca1bf68 100644 --- a/firmware/controllers/algo/obd_error_codes.h +++ b/firmware/controllers/algo/obd_error_codes.h @@ -668,7 +668,7 @@ typedef enum { //P0635 Power Steering Control Circuit //P0636 Power Steering Control Circuit Low //P0637 Power Steering Control Circuit High - //P0638 Throttle Actuator Control Range/Performance (Bank 1) + OBD_Throttle_Actuator_Control_Range_Performance_Bank_1 = 638, //P0639 Throttle Actuator Control Range/Performance (Bank 2) //P0640 Intake Air Heater Control Circuit //P0641 Sensor Reference Voltage “A” Circuit/Open diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 696b6e03f6..7a752d6749 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -743,7 +743,7 @@ bit useFSIO13ForIdleMinValue; adc_channel_e hipOutputChannel; adc_channel_e acSwitchAdc;A/C button input handled as analogue input adc_channel_e vRefAdcChannel; -uint8_t[1] unusedh; + uint8_t etbNeutralPosition;+Expected neutral position;"%", 1, 0, 0, 100, 0 custom idle_mode_e 4 bits, U32, @OFFSET@, [0:0], "Automatic", "Manual" idle_mode_e idleMode;See also idleRpmPid; diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 6f8a30f266..fff96acac4 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -2467,6 +2467,7 @@ cmd_set_engine_type_default = "w\x00\x31\x00\x00" dialog = etbDialogRight field = "!https://rusefi.com/s/debugmode" + field = "Neutral Position", etbNeutralPosition field = "Debug mode", debugMode field = "use ETB for idle", useETBforIdleControl field = "ETB idle maximum angle", etbIdleRange diff --git a/java_console/models/src/com/rusefi/config/generated/Fields.java b/java_console/models/src/com/rusefi/config/generated/Fields.java index d326a46d30..88bebbcddd 100644 --- a/java_console/models/src/com/rusefi/config/generated/Fields.java +++ b/java_console/models/src/com/rusefi/config/generated/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Sat Sep 21 21:56:11 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Sun Sep 22 22:54:07 EDT 2019 // by class com.rusefi.output.FileJavaFieldsConsumer import com.rusefi.config.*; @@ -356,6 +356,7 @@ public class Fields { public static final int etbFreq_offset = 2514; public static final int etbIdleRange_offset = 972; public static final int etbIdleThrottleRange_offset = 4012; + public static final int etbNeutralPosition_offset = 1471; public static final int externalKnockSenseAdc_offset = 3103; public static final int extraInjectionOffset_offset = 432; public static final int fanOffTemperature_offset = 472; @@ -1232,7 +1233,6 @@ public class Fields { public static final int unusedErrorPin_offset = 2040; public static final int unusedFlexFuelSensor_offset = 3100; public static final int unusedFormerWarmupAfrPid_offset = 1756; - public static final int unusedh_offset = 1471; public static final int unusedMa2_offset = 711; public static final int unusedOldWarmupAfr_offset = 744; public static final int unusedSpiPadding2_offset = 806; @@ -1747,7 +1747,7 @@ public class Fields { public static final Field HIPOUTPUTCHANNEL = Field.create("HIPOUTPUTCHANNEL", 1468, FieldType.INT8, adc_channel_e); public static final Field ACSWITCHADC = Field.create("ACSWITCHADC", 1469, FieldType.INT8, adc_channel_e); public static final Field VREFADCCHANNEL = Field.create("VREFADCCHANNEL", 1470, FieldType.INT8, adc_channel_e); - public static final Field UNUSEDH = Field.create("UNUSEDH", 1471, FieldType.INT8); + public static final Field ETBNEUTRALPOSITION = Field.create("ETBNEUTRALPOSITION", 1471, FieldType.INT8); public static final Field IDLEMODE = Field.create("IDLEMODE", 1472, FieldType.INT); public static final Field ISINJECTIONENABLED = Field.create("ISINJECTIONENABLED", 1476, FieldType.BIT, 0); public static final Field ISIGNITIONENABLED = Field.create("ISIGNITIONENABLED", 1476, FieldType.BIT, 1); @@ -2527,7 +2527,7 @@ public class Fields { HIPOUTPUTCHANNEL, ACSWITCHADC, VREFADCCHANNEL, - UNUSEDH, + ETBNEUTRALPOSITION, IDLEMODE, ISINJECTIONENABLED, ISIGNITIONENABLED, diff --git a/java_console/ui/src/com/rusefi/ui/etb/EtbReturnToNeutral.java b/java_console/ui/src/com/rusefi/ui/etb/EtbReturnToNeutral.java index c023219a82..175919c4da 100644 --- a/java_console/ui/src/com/rusefi/ui/etb/EtbReturnToNeutral.java +++ b/java_console/ui/src/com/rusefi/ui/etb/EtbReturnToNeutral.java @@ -24,7 +24,8 @@ public class EtbReturnToNeutral { private JButton button = new JButton("ETB Spring Test"); - private final static float SHUT_CLOSED = -30; + private final static float SHUT_OPEN = 70; + private final static float SHUT_CLOSED = -70; public EtbReturnToNeutral() { button.addActionListener(new ActionListener() { @@ -65,6 +66,8 @@ public class EtbReturnToNeutral { if (isError) errorCount++; + CommandQueue.getInstance().write(CMD_ETB_DUTY + " " + SHUT_OPEN); + Thread.sleep((long) (0.5 * SECOND)); CommandQueue.getInstance().write(CMD_ETB_DUTY + " " + SHUT_CLOSED); Thread.sleep(SECOND);