• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Dobre zasady programowania w Arduino...
#31
Ja pół dnia straciłem szukając powodu dlaczego PID mi wpada w dziwne stany.
Dopiero gdy nawstawiałem serial.printow ile sie da i sprawdzalem zmienne okazalo
sie, ze co kilka sekund pojawiaja sie nany i wszystko sie wali...

Na szczescie udalo mi sie to obejsc zmieniajac troche obliczenia, ale zebym
wiedzial dlaczego tak sie dzialo to co to to nie Wink

PWL
 
Odpowiedź
#32
(16-05-2019, 10:58)PierwszyWolnyLogin napisał(a): Podziel się tym algorytmem na intach jeśli możesz...
Jest mały problemik. Cały sterownik jest urządzeniem komercyjnym i raczej nie jestem w stanie udostępnić źródeł.

Ale mam taki pomysł. Pokaż swoją funkcję PID oraz sposób sterowania, a postaram się pomóc.
Drugi pomysł jest taki, że dziś napiszę do mojego zleceniodawcy, aby zapłacił resztę kasy za program i jak się nie odezwie, co ma w swoim zwyczaju, to udostępnię cały kod (lub jego większość). 

(16-05-2019, 14:02)PierwszyWolnyLogin napisał(a): co kilka sekund pojawiaja sie nany i wszystko sie wali...

Można sprawdzać co jest zwracane.
Jest taka funkcja isnan().
Jeśli chcesz sprawdzić czy zmienna jest liczbą, piszesz na przykład:

Kod:
if(!isnan(zmienna)) cośtamcośtam;
I wszystkie NAN'y będą ignorowanie.
W Arduino chyba trzeba dołączyć bibliotekę math.h, nie wiem , nie sprawdzałem.


(16-05-2019, 14:02)PierwszyWolnyLogin napisał(a): ale zebym
wiedzial dlaczego tak sie dzialo to co to to nie Wink
Pewnie pierwiastek z liczby ujemnej. No ale PID na pierwiastkach?
Zapodaj trochę kodu, chyba że Twój projekt też jest komercyjny.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#33
Zaraz tam komercyjny, żadne takie Smile

Przykład który wyłapałem to: 0.00x-40.81=nan Smile A powinno chyba zero Wink

Tak, isnan() jest, ale to leczenie wysypki pudrem Wink
Wykombinowałem, że jak trochę zmienię kolejność operacji (efekt ten sam) to nany
już się nie pojawiają... Narazie tyle wystarczy.

"Ale mam taki pomysł. Pokaż swoją funkcję PID oraz sposób sterowania, a postaram się pomóc.
Drugi pomysł jest taki, że dziś napiszę do mojego zleceniodawcy, aby zapłacił resztę kasy za program
i jak się nie odezwie, co ma w swoim zwyczaju, to udostępnię cały kod (lub jego większość). "

hehe

W niedzielę wydłubię PIDa i zamieszczę. Żadne cudo - kod który znalazłem w sieci.

Ps. Chętnie pogadam o wersji PIDa do stabilizacji temperatury w układach z TAKIM LAGIEM Smile
Typu ciężka grzałka i woda. Wyłączasz grzałkę, a temperatura rośnie jeszcze kilka minut Wink

PWL

PWL
 
Odpowiedź
#34
(16-05-2019, 19:57)PierwszyWolnyLogin napisał(a): Przykład który wyłapałem to: 0.00x-40.81=nan Smile A powinno chyba zero Wink

U mnie wychodzi 0.00 .

(16-05-2019, 19:57)PierwszyWolnyLogin napisał(a): Chętnie pogadam o wersji PIDa do stabilizacji temperatury w układach z TAKIM LAGIEM Smile
Typu ciężka grzałka i woda. Wyłączasz grzałkę, a temperatura rośnie jeszcze kilka minut Wink

No regulatory PID właśnie po to stworzono.
Człon różniczkujący przewiduje przyszłą wartość i wpływa na człon proporcjonalny w taki sposób, aby nie przeskoczyć zadanej wartości.

Niedobrane parametry mogą dać nam coś takiego:

[Obrazek: 9nZE7hn.png]


Przy odpowiednio dobranych parametrach będzie tak:

[Obrazek: Xbii7v8.png]
Pierwszy wykres jest dla regulacji PI (wyłączone D), drugi dla PID.
To są rzeczywiste wyniki pomiarów z mojego sterownika. Ta czerwona linia, to sygnał sterujący zwracany z funkcji PID, niebieska to zmierzona wartość (sterowana).
Regulator PID jest idealny do sterowania temperaturą cieczy, ponieważ likwiduje oscylacje i nie pozwala przekroczyć zadanej temperatury, czyli nie zagotuje oraz nie zamrozi obwodu.
Wszystko zależy od doboru nastaw. Przy idealnie dobranym członie różniczkującym, możesz się naprawdę zdziwić, że to tak pięknie pracuje. Jest kilka metod strojenia regulatorów PID. Proponuję poczytać o eksperymencie Zieglera-Nicholsa oraz o implementacji programowej. Tak, są programy do dobierania parametrów PID.
Można też zaimplementować algorytm autotuningu, ale to już na dłuższą pogadankę przy piwku w weekend, bo jest sporo teorii do opanowania.
Z chęcią pogadam, bo jest to temat iście fascynujący.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#35
Tak, podobne wykresy mam u siebie. Problem z ustawieniem poprawnych PIDow jest taki, ze przy sporym
zbiorniku wody pierwsze zagrzanie do okolic temp. docelowej trwa dluuuugo. Mozna sie zniecierpliwic Wink

Autotuningu próbowałem - znalazłem jakieś biblioteki w sieci. Nawet działały.

Masz przemyślenia co do algorytmu autotuningu?

Na moje oko wstępnie mogłoby to tak wyglądać:

P=I=D=0
- Zwiększam powoli P obserwując temperaturę, aż do momentu gdy temp dochodzi ciut poniżej
temp. docelowej.
- Teraz ten sam manewr z I - zwiększam powoli, aż temperatura dojdzie do docelowej,
- Parametr D zwiekszamy aż znikną oscylacje. Z tym, że tu trzebaby grzać od niższej temperatury,
żeby układ mógł się rozpędzić.

PWL
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości