Skocz do zawartości

ESP32 + PID


Pomocna odpowiedź

Napisano

Cześć, mam problem i potrzebuję pomocy.

ESP32 + ds18b20 + SSR i grzałka.

Dlaczego przy ustawieniu setPoint = 35 regulator ciągnie do prawie 45 stopni?

Oczekuję: wyłączenia przy temperaturze z setpoint i załączeniu gdy spadnie o 0,5 stopnia.

Kod poniżej.

 

/****************************************************************************
  PID Relay Output Example
  https://github.com/Dlloydev/QuickPID/tree/master/examples/PID_RelayOutput

  Similar to basic example, except the output is a digital pin controlling
  a mechanical relay, SSR, MOSFET or other device. To interface the PID output
  to a digital pin, we use "time proportioning control" (software PWM).
  First we decide on a window size (5000mS for example). We then set the pid
  to adjust its output between 0 and that window size and finally we set the
  PID sample time to that same window size.

  The digital output has the following features:
  • The PID compute rate controls the rate of updating the digital output
  • All transitions are debounced (rising and falling)
  • Full control range (0 to windowSize) isn't limited by debounce
  • Only one call to digitalWrite() per transition
  *****************************************************************************/

#include <QuickPID.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// pins
const byte inputPin = 0;
const byte relayPin = 5;
const int oneWireBus = 4;
// user settings
const unsigned long windowSize = 5000;
const byte debounce = 50;
float Input, Output, Setpoint = 35, Kp = 2, Ki = 5, Kd = 1;

OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
// status
unsigned long windowStartTime, nextSwitchTime;
boolean relayStatus = false;

QuickPID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd,
               myPID.pMode::pOnError,
               myPID.dMode::dOnMeas,
               myPID.iAwMode::iAwClamp,
               myPID.Action::direct);

void setup() {
  pinMode(relayPin, OUTPUT);
  Serial.begin(115200);
  sensors.begin();

  myPID.SetOutputLimits(0, windowSize);
  myPID.SetSampleTimeUs(windowSize * 1000);
  myPID.SetMode(myPID.Control::automatic);
}

void loop() {
  unsigned long msNow = millis();
  sensors.requestTemperatures();
  Input = sensors.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.println(Input);
  if (myPID.Compute()) windowStartTime = msNow;

  if (!relayStatus && Output > (msNow - windowStartTime)) {
    if (msNow > nextSwitchTime) {
      nextSwitchTime = msNow + debounce;
      relayStatus = true;
      digitalWrite(relayPin, HIGH);
    }
  } else if (relayStatus && Output < (msNow - windowStartTime)) {
    if (msNow > nextSwitchTime) {
      nextSwitchTime = msNow + debounce;
      relayStatus = false;
      digitalWrite(relayPin, LOW);
    }
  }
}

 

(edytowany)
57 minut temu, H1M4W4R1 napisał:

To jest tzw. overshoot. Oznacza, że masz źle dobrane parametry 😉

Zajrzyj tutaj: https://tlk-energy.de/blog-en/practical-pid-tuning-guide

 

Czyli muszę dopracować D, tak na szybko wyłapałem z artykułu.

Na szybko bo robię 3 rzeczy na raz.

Tak przy okazji - dobrą drogą jest sterowanie ogrzewaniem terrarium poprzez PID? ...

EDIT:

No dobra, udało się dobrać parametry dla 35 stopni, grzeje do 35.5 stopnia i załacza się przy 34,7.

Ale zmieniłem nastawę temperatury na 29 stopnie i.......kupa! Grzeje do 33! Dla różnych temperatur trzeba będzie zmieniać za każdym razem parametry?

Edytowano przez roz

A możesz zrobić log z danymi input, output i wrzucić na forum??

Dodatkowo zmieniłbym w programie:

if (!relayStatus && Output > (msNow - windowStartTime))

na

if ((!relayStatus) && (Output > (msNow - windowStartTime)))

Osobiście do regulacji temperatury w terrarium zastosowałbym regulator PI (wartość Kd możesz ustawić na 0).


Pozdrawiam!

  • Lubię! 2
34 minuty temu, MR1979 napisał:

A możesz zrobić log z danymi input, output i wrzucić na forum??

Dodatkowo zmieniłbym w programie:

if (!relayStatus && Output > (msNow - windowStartTime))

na

if ((!relayStatus) && (Output > (msNow - windowStartTime)))

Osobiście do regulacji temperatury w terrarium zastosowałbym regulator PI (wartość Kd możesz ustawić na 0).


Pozdrawiam!

kp = 1.3; ki = 4; kd = 0;

Setpoint = 35;

LOG:

20:11:02.016 -> INPUT OUTPUT 34.94 587.66

20:11:02.701 -> INPUT OUTPUT 34.94 588.83

20:11:03.371 -> INPUT OUTPUT 34.94 588.83

20:11:04.031 -> INPUT OUTPUT 35.00 588.83

20:11:04.721 -> INPUT OUTPUT 35.00 588.83

20:11:05.408 -> INPUT OUTPUT 35.00 588.83

20:11:06.075 -> INPUT OUTPUT 35.00 588.83

20:11:06.736 -> INPUT OUTPUT 35.00 588.83

20:11:07.434 -> INPUT OUTPUT 35.06 588.83

20:11:08.108 -> INPUT OUTPUT 35.06 587.42

20:11:08.778 -> INPUT OUTPUT 35.06 587.42

20:11:09.465 -> INPUT OUTPUT 35.06 587.42

20:11:10.120 -> INPUT OUTPUT 35.06 587.42

20:11:10.805 -> INPUT OUTPUT 35.13 587.42

20:11:11.464 -> INPUT OUTPUT 35.13 587.42

20:11:12.164 -> INPUT OUTPUT 35.13 587.42

20:11:12.818 -> INPUT OUTPUT 35.13 587.42

20:11:13.506 -> INPUT OUTPUT 35.19 583.51

20:11:14.188 -> INPUT OUTPUT 35.19 583.51

20:11:14.858 -> INPUT OUTPUT 35.19 583.51

20:11:15.528 -> INPUT OUTPUT 35.19 583.51

20:11:16.203 -> INPUT OUTPUT 35.19 583.51

20:11:16.892 -> INPUT OUTPUT 35.19 583.51

20:11:17.567 -> INPUT OUTPUT 35.25 583.51

20:11:18.241 -> INPUT OUTPUT 35.25 583.51

20:11:18.915 -> INPUT OUTPUT 35.25 578.42

20:11:19.571 -> INPUT OUTPUT 35.25 578.42

<<<<FRAGMENT WYCIĘTY bo za długie by było

20:12:58.873 -> INPUT OUTPUT 36.69 215.39

20:12:59.547 -> INPUT OUTPUT 36.69 215.39

20:13:00.199 -> INPUT OUTPUT 36.69 215.39

20:13:00.870 -> INPUT OUTPUT 36.75 215.39

20:13:01.569 -> INPUT OUTPUT 36.75 180.23

20:13:02.242 -> INPUT OUTPUT 36.75 180.23

20:13:02.911 -> INPUT OUTPUT 36.75 180.23

20:13:03.597 -> INPUT OUTPUT 36.75 180.23

20:13:04.257 -> INPUT OUTPUT 36.75 180.23

20:13:04.914 -> INPUT OUTPUT 36.81 180.23

20:13:05.600 -> INPUT OUTPUT 36.81 180.23

20:13:06.302 -> INPUT OUTPUT 36.81 180.23

20:13:06.972 -> INPUT OUTPUT 36.81 143.89

20:13:07.611 -> INPUT OUTPUT 36.81 143.89

20:13:08.310 -> INPUT OUTPUT 36.81 143.89

20:13:09.002 -> INPUT OUTPUT 36.81 143.89

20:13:09.677 -> INPUT OUTPUT 36.88 143.89

20:13:10.317 -> INPUT OUTPUT 36.88 143.89

20:13:11.028 -> INPUT OUTPUT 36.88 143.89

20:13:11.684 -> INPUT OUTPUT 36.88 143.89

20:13:12.381 -> INPUT OUTPUT 36.88 106.31

20:13:13.022 -> INPUT OUTPUT 36.94 106.31

20:13:13.723 -> INPUT OUTPUT 36.94 106.31

20:13:14.406 -> INPUT OUTPUT 36.94 106.31

20:13:15.080 -> INPUT OUTPUT 36.94 106.31

20:13:15.737 -> INPUT OUTPUT 36.94 106.31

20:13:16.408 -> INPUT OUTPUT 37.00 106.31

20:13:17.090 -> INPUT OUTPUT 36.94 106.31

20:13:17.747 -> INPUT OUTPUT 37.00 66.15

20:13:18.446 -> INPUT OUTPUT 37.00 66.15

20:13:19.114 -> INPUT OUTPUT 37.00 66.15

20:13:19.800 -> INPUT OUTPUT 37.00 66.15

20:13:20.455 -> INPUT OUTPUT 37.00 66.15

20:13:21.142 -> INPUT OUTPUT 37.00 66.15

20:13:21.824 -> INPUT OUTPUT 37.06 66.15

20:13:22.497 -> INPUT OUTPUT 37.06 66.15

20:13:23.181 -> INPUT OUTPUT 37.06 24.82

20:13:23.865 -> INPUT OUTPUT 37.06 24.82

20:13:24.532 -> INPUT OUTPUT 37.06 24.82

20:13:25.190 -> INPUT OUTPUT 37.06 24.82

20:13:25.882 -> INPUT OUTPUT 37.06 24.82

20:13:26.559 -> INPUT OUTPUT 37.06 24.82

20:13:27.220 -> INPUT OUTPUT 37.00 24.82

20:13:27.882 -> INPUT OUTPUT 37.00 24.82

20:13:28.584 -> INPUT OUTPUT 37.00 0.00

20:13:29.254 -> INPUT OUTPUT 37.00 0.00

Log wygląda dobrze. Teraz jak output będzie 0 lub ujemny to wyłącz grzałkę.

Poeksperymentuj z Ki. Ja bym zmniejszył do 2.

A overshoot jest najczęściej powodowany przez zbyt dużą wartość Kp.

16 minut temu, SOYER napisał:

PID do prostej grzałeczki?? Po co?

Umiejętność korzystania z PID zawsze się przyda 🙂

 

  • Lubię! 1
36 minut temu, MR1979 napisał:

miejętność korzystania z PID zawsze się przyda 🙂

Jak tak, to pełna zgoda. Nowych doświadczeń nigdy dość 👍.

Jak chcesz płynnie dobrać moc by grzałka średnio miała mniejszą temperaturę to PID ma sens, ale jak działa Ci to tak, że 

Dnia 3.11.2023 o 18:41, roz napisał:

parametry dla 35 stopni, grzeje do 35.5 stopnia i załacza się przy 34,7.

to znaczy, że nie działa PID tylko zrobiłeś termostat ON/OFF, a to już lepiej zrobić jako faktycznie termostat, ustawić histerezę 0.25oC i nie ma obawy, że będziesz coś eksperymentował ze współczynnikami i ugotujesz zwierzaki. Poza tym lepiej mieć jakiś drugi mechaniczny termostat, który odłączy zasilanie całkowicie jak temperatura wzrośnie powyżej zadanej o np. 2oC, szczególnie gdy używasz DS18B20.

Do PID lepszy byłby po prostu układ bez kontroli załączania w zero, SSR raczej nie działają tak płynnie. Ten jest OK do paru A:

image.thumb.png.72808f3eb4de50f2ea5810020d13f2ba.png

Testowałem taki układ z pisklakami i dożyły wypuszczenia do ogrodu, żarówka miała 75W więc miałem spory zapas mocy w takim układzie.

Zwykły termostat mechaniczny buja temperaturą +/- (2 - 3) oC, więc może nie pasować zwierzakom, ale jako wyłącznik awaryjny jest OK.

 

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...