diff --git a/firmware/config/engines/mazda_miata_vvt.cpp b/firmware/config/engines/mazda_miata_vvt.cpp index 18de48cf14..f4772d5f35 100644 --- a/firmware/config/engines/mazda_miata_vvt.cpp +++ b/firmware/config/engines/mazda_miata_vvt.cpp @@ -385,7 +385,17 @@ void setMazdaMiata2003EngineConfiguration(DECLARE_ENGINE_PARAMETER_SIGNATURE) { setFsio(1, GPIOE_6, COMBINED_WARNING_LIGHT PASS_ENGINE_PARAMETER_SUFFIX); + // enable auto_idle + // enable verbose_idle + engineConfiguration->isVerboseIAC = false; + // set idle_p 0.01 + // set idle_i 0 + // set idle_d 0 + // set debug_mode 3 + // set idle_rpm 1700 + //set idle_offset 30 + engineConfiguration->idleRpmPid.offset = 30; } void setMazdaMiata2003EngineConfigurationNewBoard(DECLARE_ENGINE_PARAMETER_SIGNATURE) { diff --git a/firmware/controllers/idle_thread.cpp b/firmware/controllers/idle_thread.cpp index 6b2df2dda4..5569d8d57a 100644 --- a/firmware/controllers/idle_thread.cpp +++ b/firmware/controllers/idle_thread.cpp @@ -50,6 +50,8 @@ static SimplePwm idleSolenoid; static StepperMotor iacMotor; +static int adjustedTargetRpm; + /** * that's the position with CLT and IAT corrections */ @@ -59,6 +61,17 @@ void idleDebug(const char *msg, percent_t value) { scheduleMsg(logger, "idle debug: %s%f", msg, value); } +static void showPidSettings(const char*msg, pid_s *pid) { + scheduleMsg(logger, "%s o=%f P=%.5f I=%.5f D=%.5f dT=%d", + msg, + pid->offset, + pid->pFactor, + pid->iFactor, + pid->dFactor, + engineConfiguration->idleDT); + +} + static void showIdleInfo(void) { const char * idleModeStr = getIdle_mode_e(engineConfiguration->idleMode); scheduleMsg(logger, "idleMode=%s position=%f isStepper=%s", idleModeStr, @@ -78,10 +91,7 @@ static void showIdleInfo(void) { if (engineConfiguration->idleMode == IM_AUTO) { - scheduleMsg(logger, "idle P=%f I=%f D=%f dT=%d", engineConfiguration->idleRpmPid.pFactor, - engineConfiguration->idleRpmPid.iFactor, - engineConfiguration->idleRpmPid.dFactor, - engineConfiguration->idleDT); + showPidSettings("idle", &engineConfiguration->idleRpmPid); } } @@ -160,9 +170,9 @@ percent_t getIdlePosition(void) { static float autoIdle(float cltCorrection) { - int targetRpm = engineConfiguration->targetIdleRpm * cltCorrection; + adjustedTargetRpm = engineConfiguration->targetIdleRpm * cltCorrection; - percent_t newValue = idlePid.getValue(targetRpm, getRpmE(engine)); + percent_t newValue = idlePid.getValue(adjustedTargetRpm, getRpmE(engine)); return newValue; } @@ -225,8 +235,13 @@ static msg_t ivThread(int param) { #endif } - if (engineConfiguration->isVerboseIAC) { - scheduleMsg(logger, "rpm=%d position=%f", getRpmE(engine), iacPosition); + if (engineConfiguration->isVerboseIAC && engineConfiguration->idleMode == IM_AUTO) { + showPidSettings("idle", &engineConfiguration->idleRpmPid); + scheduleMsg(logger, "rpm=%d/%d position=%f iTerm=%.5f dTerm=%.5f", + getRpmE(engine), + adjustedTargetRpm, + iacPosition, + idlePid.iTerm, idlePid.dTerm); } actualIdlePosition = iacPosition; @@ -241,10 +256,16 @@ static msg_t ivThread(int param) { void setTargetIdleRpm(int value) { engineConfiguration->targetIdleRpm = value; scheduleMsg(logger, "target idle RPM %d", value); + showIdleInfo(); } static void apply(void) { -// idleMath.updateFactors(engineConfiguration->idlePFactor, engineConfiguration->idleIFactor, engineConfiguration->idleDFactor, engineConfiguration->idleDT); + idlePid.updateFactors(engineConfiguration->idleRpmPid.pFactor, engineConfiguration->idleRpmPid.iFactor, engineConfiguration->idleRpmPid.dFactor); +} + +void setIdleOffset(float value) { + engineConfiguration->idleRpmPid.offset = value; + showIdleInfo(); } void setIdlePFactor(float value) { diff --git a/firmware/controllers/idle_thread.h b/firmware/controllers/idle_thread.h index e34a12fe30..e3d6063927 100644 --- a/firmware/controllers/idle_thread.h +++ b/firmware/controllers/idle_thread.h @@ -17,6 +17,7 @@ void startIdleThread(Logging*sharedLogger); void setDefaultIdleParameters(void); void startIdleBench(void); void setIdleDT(int value); +void setIdleOffset(float value); void setIdlePFactor(float value); void setIdleIFactor(float value); void setIdleDFactor(float value); diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index 6f4da0db84..24cb5deb19 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -862,7 +862,7 @@ static void enableOrDisable(const char *param, bool isEnabled) { boardConfiguration->enabledStep1Limiter = isEnabled; #if EFI_PROD_CODE || defined(__DOXYGEN__) } else if (strEqualCaseInsensitive(param, "auto_idle")) { - setIdleMode(isEnabled ? IM_AUTO : IM_MANUAL); + setIdleMode(isEnabled ? IM_MANUAL : IM_AUTO); #endif /* EFI_PROD_CODE */ } else if (strEqualCaseInsensitive(param, "serial")) { boardConfiguration->useSerialPort = isEnabled; @@ -1109,6 +1109,7 @@ command_f_s commandsF[] = {{"mock_iat_voltage", setIatVoltage}, {"engine_decel_multiplier", setDecelMult}, #if EFI_PROD_CODE || defined(__DOXYGEN__) {"mock_vehicle_speed", setMockVehicleSpeed}, + {"idle_offset", setIdleOffset}, {"idle_p", setIdlePFactor}, {"idle_i", setIdleIFactor}, {"idle_d", setIdleDFactor}, diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index df9f90ad81..07031a5212 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -631,7 +631,7 @@ custom idle_mode_e 4 bits, U32, @OFFSET@, [0:0], "false", "true" uint32_t engineChartSize;;"count", 1, 0, 0, 300, 0 - int targetIdleRpm;;"RPM", 1, 0, 0, 7000, 0 + int targetIdleRpm;set idle_rpm X;"RPM", 1, 0, 0, 7000, 0 adc_channel_e acSwitchAdc;A/C button input handled as analog input