Skocz do zawartości

ESP32 + PID


roz

Pomocna odpowiedź

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);
    }
  }
}

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.