From d35ea81080fcd7fc62d9707ba5b946d817d4a74e Mon Sep 17 00:00:00 2001 From: Yurii Date: Thu, 18 Apr 2024 00:04:23 +0300 Subject: [PATCH] fix: PID optimization, correction of default PID settings --- src/HaHelper.h | 2 +- src/RegulatorTask.h | 29 ++++++++++++++++++++++++----- src/Settings.h | 6 +++--- src/utils.h | 4 ++-- src_data/settings.html | 2 +- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/HaHelper.h b/src/HaHelper.h index d4bebb8..a9928b4 100644 --- a/src/HaHelper.h +++ b/src/HaHelper.h @@ -623,7 +623,7 @@ public: doc[FPSTR(HA_NAME)] = F("PID factor I"); doc[FPSTR(HA_ICON)] = F("mdi:alpha-i-circle-outline"); doc[FPSTR(HA_STATE_TOPIC)] = this->getDeviceTopic(F("settings")); - doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.i_factor|float(0)|round(3) }}"); + doc[FPSTR(HA_VALUE_TEMPLATE)] = F("{{ value_json.pid.i_factor|float(0)|round(4) }}"); doc[FPSTR(HA_COMMAND_TOPIC)] = this->getDeviceTopic(F("settings/set")); doc[FPSTR(HA_COMMAND_TEMPLATE)] = F("{\"pid\": {\"i_factor\" : {{ value }}}}"); doc[FPSTR(HA_MIN)] = 0; diff --git a/src/RegulatorTask.h b/src/RegulatorTask.h index b6d9c84..0309aae 100644 --- a/src/RegulatorTask.h +++ b/src/RegulatorTask.h @@ -133,7 +133,7 @@ protected: prevHeatingTarget = settings.heating.target; Log.sinfoln(FPSTR(L_REGULATOR), F("New target: %.2f"), settings.heating.target); - if (settings.equitherm.enable && settings.pid.enable) { + if (/*settings.equitherm.enable && */settings.pid.enable) { pidRegulator.integral = 0; Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); } @@ -167,6 +167,7 @@ protected: newTemp += pidResult; Log.sinfoln(FPSTR(L_REGULATOR_PID), F("New result: %hhd (%.2f)"), (int8_t) round(pidResult), pidResult); + Log.straceln(FPSTR(L_REGULATOR_PID), F("Integral: %.2f"), pidRegulator.integral); } else { newTemp += prevPidResult; @@ -174,6 +175,10 @@ protected: } else { newTemp += prevPidResult; } + + } else if (pidRegulator.integral != 0) { + pidRegulator.integral = 0; + Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); } // default temp, manual mode @@ -327,9 +332,23 @@ protected: } float getPidTemp(int minTemp, int maxTemp) { - pidRegulator.Kp = settings.pid.p_factor; - pidRegulator.Ki = settings.pid.i_factor; - pidRegulator.Kd = settings.pid.d_factor; + if (fabs(pidRegulator.Kp - settings.pid.p_factor) >= 0.0001f) { + pidRegulator.Kp = settings.pid.p_factor; + pidRegulator.integral = 0; + Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); + } + + if (fabs(pidRegulator.Ki - settings.pid.i_factor) >= 0.0001f) { + pidRegulator.Ki = settings.pid.i_factor; + pidRegulator.integral = 0; + Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); + } + + if (fabs(pidRegulator.Kd - settings.pid.d_factor) >= 0.0001f) { + pidRegulator.Kd = settings.pid.d_factor; + pidRegulator.integral = 0; + Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); + } pidRegulator.setLimits(minTemp, maxTemp); pidRegulator.setDt(settings.pid.dt * 1000u); @@ -342,7 +361,7 @@ protected: float tuneEquithermN(float ratio, float currentTemp, float setTemp, unsigned int dirtyInterval = 60, unsigned int accurateInterval = 1800, float accurateStep = 0.01, float accurateStepAfter = 1) { static uint32_t _prevIteration = millis(); - if (abs(currentTemp - setTemp) < accurateStepAfter) { + if (fabs(currentTemp - setTemp) < accurateStepAfter) { if (millis() - _prevIteration < (accurateInterval * 1000)) { return ratio; } diff --git a/src/Settings.h b/src/Settings.h index ec5dcf3..ff54095 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -101,9 +101,9 @@ struct Settings { struct { bool enable = false; - float p_factor = 50; - float i_factor = 0.006f; - float d_factor = 10000; + float p_factor = 2; + float i_factor = 0.0055f; + float d_factor = 0; unsigned short dt = 180; byte minTemp = 0; byte maxTemp = DEFAULT_HEATING_MAX_TEMP; diff --git a/src/utils.h b/src/utils.h index 2a773b9..7c5b4ee 100644 --- a/src/utils.h +++ b/src/utils.h @@ -384,7 +384,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) { dst["pid"]["enable"] = src.pid.enable; dst["pid"]["p_factor"] = roundd(src.pid.p_factor, 3); - dst["pid"]["i_factor"] = roundd(src.pid.i_factor, 3); + dst["pid"]["i_factor"] = roundd(src.pid.i_factor, 4); dst["pid"]["d_factor"] = roundd(src.pid.d_factor, 1); dst["pid"]["dt"] = src.pid.dt; dst["pid"]["minTemp"] = src.pid.minTemp; @@ -836,7 +836,7 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false double value = src["pid"]["i_factor"].as(); if (value >= 0 && value <= 100) { - dst.pid.i_factor = roundd(value, 3); + dst.pid.i_factor = roundd(value, 4); changed = true; } } diff --git a/src_data/settings.html b/src_data/settings.html index d62c852..5c11336 100644 --- a/src_data/settings.html +++ b/src_data/settings.html @@ -315,7 +315,7 @@