Witam!
Ostatnimi czasy walczę z regulatorem PID opartego na ATmega16 do pieca oporowego. Chcąc zastosować często polecaną bibliotekę PID Atmela natknąłem się na problemy. Po pierwsze czy mogę testować działanie (mam namyśli czy algorytm jest dobry) za pomocą potencjometru którym sobie reguluję zmienną Temp w zakresie 0 - 1800 i obserwując wartość wyjściowa regulatora w zakresie 0 - 255? Drugi problem to nastawy dla tego regulatora. Zależy mi aby regulator na wyjściu dawał wartość 0 -255. Ustawiając nastawy Kp = 1, Ki = 0, Kd = 0, zmieniając temperaturę obserwuje ze wyjście regulatora ładnie się zmienia. Np. zakładając temperaturę zadana na 1500 to po przekroczeniu około 1200 stopni wyjście regulatora zmniejsza się płynnie z 255 do 0 przy 1500 stopniach. Następnie wprowadzając jakąkolwiek wartość do wzmocnienia Ki i uruchomieniu programu wartość wyjściowa regulatora bardzo szybko nalicza się z 0 do 32767 i potem bez względu na temperaturę ta wartość się utrzymuje. W nocie Atmela odnośnie tej biblioteki jest napisane, żeby ograniczyć sumę całki, żeby własnie nie wychodziła poza zakres. Więc zmieniłem wartość zmiennej MAX_I_term na 255. I ograniczyłem wyjście regulatora zmiennej ret w if-ach <255 i >0. Teraz sprawa wygląda tak ,że bez względu na nastawy jakie wprowadzę czy to będzie Kp = 1, Ki = 0, Kd = 0 czy tez Kp = 1, Ki = 0,05, Kd = 0.6 to regulator owszem pracuje, ale wartości wyjścia regulatora dla rożnych temperatur sa takie same dla rożnych nastaw Ti i Td. Mam na myśli, ze dla np 1400 wyjście jest 89, dla 1300 jest 170. Moje doświadczenie w tej dziedzinie i jest bardzo małe, więc proszę o pomoc lub wytłumaczenie dlaczego tak się dzieje. Ponizej zamieszczam kody źródłowe zmodyfikowanej biblioteki Atmela i moj program główny. Regulator jest uruchamiany co z częstotliwością 500Hz. Pozdrawiam!
Plik PID.c
Plik PID.h
Plik main.c
Ostatnimi czasy walczę z regulatorem PID opartego na ATmega16 do pieca oporowego. Chcąc zastosować często polecaną bibliotekę PID Atmela natknąłem się na problemy. Po pierwsze czy mogę testować działanie (mam namyśli czy algorytm jest dobry) za pomocą potencjometru którym sobie reguluję zmienną Temp w zakresie 0 - 1800 i obserwując wartość wyjściowa regulatora w zakresie 0 - 255? Drugi problem to nastawy dla tego regulatora. Zależy mi aby regulator na wyjściu dawał wartość 0 -255. Ustawiając nastawy Kp = 1, Ki = 0, Kd = 0, zmieniając temperaturę obserwuje ze wyjście regulatora ładnie się zmienia. Np. zakładając temperaturę zadana na 1500 to po przekroczeniu około 1200 stopni wyjście regulatora zmniejsza się płynnie z 255 do 0 przy 1500 stopniach. Następnie wprowadzając jakąkolwiek wartość do wzmocnienia Ki i uruchomieniu programu wartość wyjściowa regulatora bardzo szybko nalicza się z 0 do 32767 i potem bez względu na temperaturę ta wartość się utrzymuje. W nocie Atmela odnośnie tej biblioteki jest napisane, żeby ograniczyć sumę całki, żeby własnie nie wychodziła poza zakres. Więc zmieniłem wartość zmiennej MAX_I_term na 255. I ograniczyłem wyjście regulatora zmiennej ret w if-ach <255 i >0. Teraz sprawa wygląda tak ,że bez względu na nastawy jakie wprowadzę czy to będzie Kp = 1, Ki = 0, Kd = 0 czy tez Kp = 1, Ki = 0,05, Kd = 0.6 to regulator owszem pracuje, ale wartości wyjścia regulatora dla rożnych temperatur sa takie same dla rożnych nastaw Ti i Td. Mam na myśli, ze dla np 1400 wyjście jest 89, dla 1300 jest 170. Moje doświadczenie w tej dziedzinie i jest bardzo małe, więc proszę o pomoc lub wytłumaczenie dlaczego tak się dzieje. Ponizej zamieszczam kody źródłowe zmodyfikowanej biblioteki Atmela i moj program główny. Regulator jest uruchamiany co z częstotliwością 500Hz. Pozdrawiam!
Plik PID.c
Kod: C / C++
Plik PID.h
Kod: C / C++
Plik main.c
Kod: C / C++