Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Regulator PID Atmega8 + Bascom

loodvis 01 Paź 2008 19:26 17693 8
  • Chciałbym przedstawić moje pierwsze "większe" urządzenie jakie zrobiłem podczas nauki mikrokontrolerów. Nie ma wprawdzie zastosowania praktycznego ale można by takie zastosowanie znaleźć. Zrobiony został przy okazji przedmiotu Automatyka i Robotyka.

    Sercem układu jest mega8 która obsługuje LCD 2x16, steruje coolerem komputerowym przez BC337 i odczytuje temperaturę z czujnika ds18b20. Dodatkowo na płytce z coolerem jest zamontowany rezystor 20ohm który poprostu ma się grzać (w praktyce do ok 70 stopni). Sterowanie za pomocą 3 przycisków.

    Regulator PID Atmega8 + Bascom

    Układ z wentylatorem wymaga jeszcze obudowania

    Regulator PID Atmega8 + Bascom


    Przedni panel nie prezentuje się najlepiej (na zdjęciu z bliska tym bardziej...) , niestety bez zlecenia wycinania tego na laserze nie jestem w stanie tego zrobić. Brak mi cierpliwość do precyzyjnej roboty, a wycinanie szlifierką kątową wygląda jak widać :| Plastikowe jeszcze gorzej mi wychodziły...

    Regulator PID Atmega8 + Bascom


    W głównym Menu jest kilka opcji

    1. Wprowadzenie wartości zadanej
    2. Ustawienie współczynników Kp, Kd, Ki
    3. Regulacja dwustanowa
    a) tutaj dodatkowo możliwość ustawienia histerezy
    4. Regulator PID
    5. Reset
    6. Wymuszenie skokowe

    Regulator PID Atmega8 + Bascom



    Odczyt temperatury z dokładnością tylko do 0,5°C. Myślę nad zmianą czujnika na jakiś termistor.

    W takiej konfiguracji jaka jest to regulator działa OK. Zadaną temperaturę przy odpowiednich ustawieniach potrafi utrzymywać powyżej 1 minuty bez wahnięć. Jak pojawi się uchyb momentalnie redukuje go do 0 i potem znowu ok 1minuty stabilnie utrzymuje temperaturę.

    Mam jednak problem przy wyższych temperaturach.
    Wentylator zatrzymuje się przy PWM ok 5% a startuje przy ok 15%, ta zwłoka na starcie powoduje niestety zbyt duże wahania temperatury.

    Zastanawiam się czy problem rozwiązał by odpowiedni kod który ruszyłby tylko wentylator dając chwilowo PWM na poziomie 15-20% ? Może jakieś inne rozwiązanie proponujecie ?

    Nie jestem pewien też co do ograniczeń które dałem na człon całkjący, próbowałem już różnych możliwości, takie jak dotychczas dają najlepsze rezultaty.


    Poniżej zamieszczam kod.
    Jest to mój pierwszy większy program po mruganiu diodą itp, także pewnie jest wiele błędów. Przyjmę konstruktywną krytykę :)


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #2 02 Paź 2008 02:26
    Dr.Vee
    VIP Zasłużony dla elektroda

    Gratuluję ambitnego podejścia do problemu. Brakuje Ci jednak systematyki w strojeniu parametrów PID - jest na ten temat wiele materiałów na sieci, zacznij np. od wikipedii.

    Rozszerz swój prototyp o periodyczne logowanie danych (np. przez rs232), tj. temperatury, nastaw, uchybu, członów P, I, D oraz wyjścia sterującego. Analizując te dane możesz naszkicować i analizować wykresy pracy urządzenia przy różnych parametrach, a więc też dostosować te parametry do optymalnej pracy.

    Pamiętaj, że dla algorytmu wyjściem układu jest intensywność chłodzenia, a nie wypełnienie impulsów sterujących silnik wentylatora. Do prawidłowej pracy potrzebne jest przekształcenie jednej wielkości na drugą - jak już zauważyłeś do startu silnika potrzebne jest większe wypełnienie niż do podtrzymania jego pracy. Twoja funkcja przekształcająca sterowanie -> PWM powinna uwzględnić tą histerezę, np. tak jak sugerujesz (rozruch, później hamowanie do odp. wartości).

    PS. w kodzie brakuje wcięć i strasznie się go czyta ;)

    Pozdrawiam,
    Dr.Vee

  • #3 06 Paź 2008 11:14
    loodvis
    Poziom 14  

    Nad logowaniem myślałem, ale jeszcze nie wiem jak to się robi. Będę musiał to opanować bo potrzebowałbym taki "loger" w samochodzie, jak tam się uda to w regulatorze też zrobię.

    Zrobiłem malutką poprawkę która dużo dała, wszystkie człony dziele przez 5 (można by i nawet przez 10 ) i daje wyjściowo 5 razy większe współczynniki.

    Teraz dając odpowiednio mały Ki nie ma takiej sytuacji że wentylator zdąży się zatrzymać przy wysokich temperaturach bo regulator reaguje odpowiednio wolno.

    Teraz regulator może pracować stabilnie przy zadanej temperaturze w granicy od temperatury otoczenia do 50°C co jest praktycznie maksymalną wartością bo wentylator pracuje już na granicy zatrzymania.

    Nie mniej jednak przydała by się histereza dla sygnału wyjściowego :)

  • #4 07 Paź 2008 22:06
    teorom
    Poziom 13  

    Pomysl fajny, ale proponuje poszukac materialow na temat teorii regulacji PID no i oczywiscie fajnie by bylo poszukac jak takie regulatory sa implementowane w praktyce. To zobaczysz ze nie jest to takie proste.

  • #5 06 Cze 2009 13:14
    lagoc
    Poziom 2  

    witam, mam wielką prośbę o pomoc w rozpracowaniu tego kodu. mam do szkoły zrobić reg. z regulacją PID. Mam pytanie, czy tutaj zamieszczony kod realizuje sterowanie PID?? Kolejne pytanie to opis pinów, a więc PD1 służy do obsługi czujnika 18B20,PD5-PD7 to przyciski, PC1 to RS wyświetlacza, PC0 to E wyśw, PB5 do DB4 itd, która z nóżek więc obsługuje to całe PWM??
    Czy jest to PB0 (pin 14 Atmegi)?? Z góry wielkie dzięki za pomoc

  • #6 10 Cze 2009 11:57
    loodvis
    Poziom 14  

    PWM jest na PB01

    Jak masz jakieś pytanie o fragmenty kodu to pisz najlepiej na gg, lub tutaj wklejaj konkretne fragmenty których nie rozumiesz

  • #7 13 Cze 2009 16:42
    lagoc
    Poziom 2  

    Czy część kodu z odczytem temp jest poprawna? Pytam ponieważ na moim czujniku 18B20 pokazuje temperature 85st podczas gdy powinno ok 25. Gdzie powinieniem zmienić kod programu??

  • #8 13 Cze 2009 20:12
    loodvis
    Poziom 14  

    Coś źle napisałeś albo masz źle podłączone. 85 stopni to jest temperatura jaką pokazuje czujnik po resecie czy coś takiego, nie pamiętam i nie chce mieszać, poszukaj na elektrodzie napewno będzie taki temat.

  • #9 16 Lis 2014 12:19
    tadzikj
    Poziom 11  

    Witam serdecznie!

    Poniżej zamieszczam program regulacji PID oparty na kodzie AN #109 - PID Controller ze strony: Link

    oraz wzorowany na niektórych liniach kodu "Regulator PID Atmega8 + Bascom" Piotra Ludwikowskiego.

    Zadana temperatura oraz współczynniki PID są na stałę (zmienne w kodzie) aby uprościć kod.
    Współczynniki PID należy dobrać indywidualnie.

    Program reguluje ogniwa Peltiera do utrzymania zadanej temperatury po stronie zimniej ogniwa.

    Podłączenie:
    PORTD.5 -> 1 nózka IRF540N
    Czarny przewód ogniwa -> 2 nózka IRF540N
    MASA Atmegi i masa zasilania ogniwa -> 3 nózka IRF540N
    Czerwony przewód ogniwa + 5V (używam zasilacza AT i bez problemu działą
    na temperaturach do TZ=2.2 przy temperaturze otoczenia 22 stopnie i Dużym radiatorze z wentylatorem podpiętym do 5V!
    DS18B20 podpiętey do PORTC.0

    Pozdrawiam serdecznie TadzikJ.

    Załączniki: