logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega16][C] - Biblioteka PID Atmela, kłopot z zastosowaniem

Szlast 14 Sie 2012 14:30 2439 2
REKLAMA
  • #1 11207890
    Szlast
    Poziom 10  
    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

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Plik PID.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Plik main.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 11208866
    janbernat
    Poziom 38  
    Zajrzyj tu:
    http://controlengineering.pl/no_cache/menu-go..._ttnews%255BbackPid%255D=293&cHash=e49de4e766
    Weź pod uwagę bezwładność elementu sterowanego- w tym wypadku pieca.
    Jeśli masz zapas mocy to możesz dostarczyć taką moc do grzałek że się przepalą/rozsadzą piec zanim temperatura w miejscu pomiaru wzrośnie na tyle żeby zacząć ograniczać moc.
    Regulacja PID jest dlatego trudna do strojenia że trudno jest obliczyć odpowiedź czasową obiektu sterowanego.
  • #3 11209980
    Szlast
    Poziom 10  
    Przeglądając przemysłowe regulatory temperatury zauważyłem, że najczęściej czas próbkowania wynosi od 500 ms do 1 s. W programie wprowadziłem czas próbkowania 500 ms i w pliku pid.h zmieniłem MAX_I_TERM na INT16_MAX a także w pliku pid.c dla wartości wyjściowej ret zmieniłem z powrotem górna granice na MAX_INT. I teraz na wyjściu otrzymuje sygnał w zakresie 0 - 511 i regulator zaczął reagować na wprowadzanie rożnych wartości nastaw. Czyli powinno być ok. Może ktoś stosował w praktyce tą bibliotekę i może mi podpowiedzieć w jakich zakresach powinny być nastawy (aktualnie obrałem 9.90 - 0.01) i jak można lepiej dostosować ten algorytm do tego projektu, bo zmieniając SCALING_FACTOR i ten MAX_I_TERM rożne rzeczy wychodzą?
REKLAMA