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.

Dokładne utrzymywanie temperatury

pirotechnik 16 Lis 2007 16:32 5017 11
  • #1 16 Lis 2007 16:32
    pirotechnik
    Poziom 10  

    Witam wszystkich użytkowników elektrody!
    Od niedawna hoduje pająki ptaszniki (gatunki nie wymagające rejestracji) i chcę zrobić termoregulator do precyzyjnego utrzymywania stałej temperatury w terrarium. Na początku zrobiłem zwykły termostat włącz/wyłącz ale wahania temperatury były bardzo duże i nie do przyjęcia... potem zrobiłem regulator PWM na NE555 i ręcznie potencjometrem nastawiałem moc grzania. Rozwiązanie niby dobre ale potrzebowałem czegoś co będzie reagowało na zmiany temperatury otoczenia... i wtedy powstał prosty termoregulator na Attiny2313 + DS18B20
    Niestety tu także wahania były duże pomimo regulacji PWM, pewnie przez długi czas odpowiedzi czujnika (700ms) i niedopracowany program...
    Teraz chcę podłączyć jakiś czujnik analogowy do wejścia przetwornika A/C Attiny13, który z kolei miałby “płynnie” sterować grzałką za pomocą sprzętowego PWM'a.
    Potrzebuje jakiegoś schematu w jaki sposób podłączyć taki analogowy czujnik do procesora i przykładowy program (BASCOM) wyliczający ile dać mocy na grzałkę żeby utrzymać stałą temperaturę.
    A może koncepcja z czujnikiem DS18B20 była lepsza tylko program był źle napisany?
    Proszę o jakąś pomoc bo idzie zima i nie chcę żeby mi pająki zmarzły ;/

    Aha no i za grzałkę robi mata grzewcza do podgrzewania lusterek samochodowych pobierająca około 1A przy 12V.

    0 11
  • #2 16 Lis 2007 17:12
    WoŹnY
    Poziom 28  

    700mS to bardzo mało w takich układach. Problemem będzie tu inercja układu terrarium (bezwładność cieplana). Według mnie problemem będzie moc grzałki (zbyt mała, aby szybko nagrzać) ewentualnie kiepski sposób oddawania ciepła z owej maty. Opisz dokładnie jak masz to wykonane. Ponadto jaki algorytm włączania grzałki stosujesz (jaki regulator)?

    1
  • #3 16 Lis 2007 17:33
    pirotechnik
    Poziom 10  

    To w takim razie wina programu.... terrarium jest bardzo małe i nagrzanie do 40oC to kwestia niecałej minuty a u mnie potrzeba 26-28°C

    Już dokładnie nie pamiętam jak był napisany program ale kombinowałem na kilka sposobów...
    Najpierw na zasadzie jeżeli temp. za mała o 0,1°C to zwiększ PWM o 5, jezeli o 0,2°C to o 10 itd. Potem kombinowałem z funkcją logarytmiczą i moimi własnymi mixami liniowej i logarytmicznej ale nic z tego nie wyszło. To znaczy działało, ale temperatura wahała się w granicach 5°C, a w wypadku termostatu on/off bywało nawet o 10°C za dużo.

    0
  • #4 16 Lis 2007 18:40
    snow
    Poziom 28  

    Pamiętać też należy że rozkład temperatury nie jest taki sam w całej objętości więc istotne jest umiejscowienie czujnika.

    1
  • #5 17 Lis 2007 09:38
    WoŹnY
    Poziom 28  

    Według mnie musisz wziąć pod uwagę bezwładność terrarium. Bardziej musisz zmieniać współczynnik wypełnienia PWM. Pewnie jest tak, że po wyłączeniu grzałki temp. jeszcze rośnie. Po prostu musisz sterować jakoby z wyprzedzeniem gdy tem jest np. 0.5 st poniżej zadanejm prawie wyłączyć grzałkę i poczekać aż terrarium samo dojdzie do zadanej. To samo gdy się wystudza, od razu włączać na maksa grzałkę aby jak najbardziej wyeliminować przeregulowania, a po odpowiednim czasie zmniejszyć aby nie przeregulować do góry. Unikałbym sytuacji gdy grzałka jest całkowicie wyłączona. Najlepiej poczytaj o typach regulatorów i postaraj się taki napisać programowo polecam PID, choć trzeba będzie conieco policzyć.

    0
  • #6 17 Lis 2007 09:56
    M. S.
    Poziom 34  

    A może napisać program, który nauczy się bezwładności cieplnej układu (wypracuje sobie i zapisze w EEPROM odpowiednie nastawy) - typu: jeśli nadmiernie wzrosła temperatura po wyłączeniu grzałki to następnym razem wyłącz ją przy kilka stopni niższej temperaturze, a jeśli nie dogrzano terrarium to następnym razem zwiększ temperaturę wyłączenia grzałki. Podobnie zbudowane są sterowniki silników spalinowych - uczą się cały czas i są w stanie dostosować się do postępu zużycia silnika.

    0
  • #7 17 Lis 2007 11:32
    pirotechnik
    Poziom 10  

    Po przeczytaniu waszych odpowiedzi wpadł mi do głowy jeszcze jeden pomysł...
    1. Zaraz po włączeniu urządzenia mikrokontroler sprawdza temperaturę bez podgrzewania.
    2. uC ustawia grzałkę na powiedzmy 80% i czeka aż osiągnie zadaną temperaturę (z uwzględnieniem bezwładności).
    3. uC wyłącza grzałkę i czeka do wystudzenia do temperatury początkowej.
    4. uC przelicza czas włączenia i wyłączenia na % i na tyle % ustawia grzałkę.
    5. uC dokonuje drobnych korekt mocy żeby utrzymać stałą temperaturę. Czy takie coś ma prawo działać?

    Nie sądziłem że z głupim termoregulatorem do terrarium będzie tyle zabawy :]
    A może da się to zrobić na LM35 + jakiś wzmacniacz operacyjny + NE555 do generowania PWM'a? (analogowa, a zwłaszcza wzmacniacze operacyjne u mnie leżą niestety :/ )

    0
  • #8 17 Lis 2007 12:29
    starob
    Poziom 25  

    Obawiam się, że duży wpływ na sterowanie może mieć temperatura pomieszczenia. Propomuje poczytać o sterowaniu pogodowym kotłów CO. Takie terrarium to chałupka w mikroskali.

    0
  • #9 17 Lis 2007 17:54
    Neverhood
    Poziom 16  

    Cytat:
    Najpierw na zasadzie jeżeli temp. za mała o 0,1°C to zwiększ PWM o 5, jezeli o 0,2°C to o 10 itd.

    A PWM masz ilu bitowy?8,9,10
    może zamiast robić skok w wypełnieniu o 5 dać na 1.

    Najlepiej jakby pwm nie wykorzystywać w ustawieniu 0 i max, tylko w pośrednich wartościach.

    0
  • #10 17 Lis 2007 23:15
    pirotechnik
    Poziom 10  

    PWM był ustawiony na ośmiobitowy.

    0
  • Pomocny post
    #11 18 Lis 2007 00:54
    shg
    Specjalista techniki cyfrowej

    pirotechnik napisał:
    Najpierw na zasadzie jeżeli temp. za mała o 0,1°C to zwiększ PWM o 5, jezeli o 0,2°C to o 10 itd.

    O ile dobrze zrozumiałem, to wyglądało to tak, że w każdym obiegu pętli wykonywałeś, to co napisałeś, w takim razie zrobiłeś regulator całkujący, nienajlepszy pomysł. W zależności od tego, w jakim czasie będzie wykonywany każdy obieg pętli, odpowiedź takiego układu może być między w miarę dobrą (ale powolną) a tragiczną (przeregulowania). Im szybciej uaktualniałeś PWM na tej zasadzie tym gorzej.

    pirotechnik napisał:
    Potem kombinowałem z funkcją logarytmiczą i moimi własnymi mixami liniowej i logarytmicznej ale nic z tego nie wyszło.


    Strumień ciepła dostarczany do układu (co przekłada się bezpośrednio na moc grzałki) jest wprost proporcjonalny do współczynnika wypełnienia.
    $$\dot{Q_i} = k_1 \cdot PWM$$
    Strumień ciepła tracony (przez ścianki) jest wprost proporcjonalny do różnicy temperatur wewnątrz i na zewnątrz. Pomijam tu nieznaczne nieliniowości wnoszone przez konwekcję i promieniowanie.
    $$\dot{Q_s} = k_2 \cdot (T_w - T_z)$$
    (Tw - temperatura wewnątrz, Tz - temperatura na zewnątrz)
    Dostarczając ciepło do układu powoduje się wzrost jego temperatury, odbierając ciepło (straty) powoduje się spadek temperatury.
    $$\frac{dT_w}{dt} = c \cdot \dot{Q}$$
    c - ciepło właściwe układu, gwoli ścisłości - zależne od temperatury, aczkolwiek w tym zakresie temperatur można przyjąć że jest stałe.
    Wypadkowy strumień ciepła (Q) to różnica:
    $$\dot{Q} = \dot{Q_i} - \dot{Q_s}$$

    W stanie ustalonym temperatura nie zmienia się w czasie:
    $$\frac{dT_w}{dt} = 0$$
    zatem:
    $$\dot{Q} = 0$$
    stąd:
    $$\dot{Q_i} = \dot{Q_s}$$
    Oba strumienie są sobie równe, tzn. tyle samo ciepła jest dostarczane, co tracone w jednostce czasu.
    Podstawiając za Qi i Qs mamy:
    $$k_1 \cdot PWM = k_2 \cdot (T_w - T_z)$$
    stąd:
    $$T_w = T_z + \frac{k_1}{k_2} \cdot PWM)$$
    Wniosek:
    Temperatura wewnątrz będzie liniowo zależeć od współczynnika wypełnienia. Ponadto uwzględnić należy wyraz wolny w postaci temperatury na zewnątrz obiektu.

    Iloraz k1/k2 możesz wyznaczyć eksperymentalnie. Wystarczy wyeksmitować lokatora, i przeprowadzić kilka pomiarów temperatury przy różnych współczynnikach wypełnienia (pomiar wykonać po ustabilizowaniu się temperatury). Potem sporządzić z tego wykres Tw = f(PWM), powinna wyjść linia prosta (im mniejsze odchylenia punktów pomiarowych od prostej tym lepiej). Współczynnik kierunkowy tej prostej będzie szukanym ilorazem k1/k2.
    Nie jest to konieczne i można by też zrobić wszystko na oko, a potem dochodzić metodą prób i błędów. Osobiście jednak polecałbym takie podejście, nie powinno to zająć zbyt dużo czasu, zwłaszcza że, jak piszesz, grzałka nagrzewa terrarium bardzo szybko.

    Dysponując takim uproszczonym modelem obiektu jesteś już w stanie zrealizować regulator feed-forward, który będzie w stanie w krótkim czasie ustalić przybliżoną wartość temperatury. Dodając do tego człon całkujący będziesz miał możliwość sprowadzenia uchybu temperatury do zera.




    W ogólnym zarysie widzę to tak:

    1. Pomiar Tw, pomiar Tz
    2. e = Ts - Tw
    3. ai = ai + e
    4. PWM = (1/kf) * (Ts - Tz) + ki * ai

    Ts - temperatura zadana,
    Tw - temperatura wewnątrz,
    Tz - temperatura na zewnątrz,
    e - uchyb,
    kf - współczynnik proporcjonalności Tw do PWM (wyznaczony wcześniej iloraz k1/k2),
    ki - wzmocnienie członu całkującego,
    ai - akumulator członu całkującego.

    Powyższą procedurę należy wykonywać w ściśle określonych odstępach czasu (najlepiej kilka razy krótszych od stałej czasowej obiektu). Pamiętać należy też o wszelkich nieprzyjemnościach związanych z programową implementacją członu całkującego. Konkretniej to chodzi o to, żeby akumulator się nie przepełnił, bo wtedy wyjdą kompletne głupoty i lokator może zostać usmażony.
    Trzeba zrobić nasycenie, tj. ograniczyć zakres wartości na wyjściu członu całkujacego do pewnych przyjętych granic na zasadzie, że jeżeli wartość uchybu jest większa (mniejsza) od zera, a sygnał wyjściowy członu całkującego osiągnął nasycenie od strony dodatniej (ujemnej), to pominąć krok 3 (nie zwiększać (zmniejszać) wartości w akumulatorze).
    Tak chyba będzie prościej:
    2. e = Ts - Tw
    3. ai = ai + e
    3a. jeżeli ai > ai_max, to ai = ai_max
    3b. jeżeli ai < ai_min, to ai = ai_min
    Mimo tego i tak należy uważać, żeby tymczasowa wartość ai (liczona w kroku 3) nie była większa od możliwej do przechowywania w zmiennej danego typu. W praktyce oznacza to że wartości ai_max i ai_min należy dobrać z takim zapasem, żeby dodanie / odjęcie od nich maksymalnej możliwej wartości uchybu (e) nie powodowało przepełnienia.

    Wartość granic zależeć będzie od dokładności modelu (członu feed-forward), im dokładniejszy, tym węższe granice można przyjąć. Zakres regulacji członu całkującego powinien być na tyle szeroki, aby umożliwił całkowite skompensowanie błędów modelu (zawsze jakiś błąd będzie, bo jednak zależność temperatury od PWM nie jest do końca liniowa).
    Człon feed-forward można zastąpić członem proporcjonalnym, wtedy będzie zwykły regulator PI, ale z dobrym modelem feed-forward + I jest lepszy.

    Zostaje jeszcze problem wzmocnienia członu całkującego. Można dojść do tego metodą prób i błędów zwiększając jego wartość stopniowo (od zera) i obserwując wahania sygnału sterującego (PWM) podczas skokowej zmiany zadanej temperatury. Można też, a właściwie powinno się, określić (metodą eksperymentalną) odpowiedź obiektu na wymuszenie skokowe i na jej podstawie dobrać ki.

    PWM może sobie być nawet i ośmiobitowy, jeżeli wynikowa wartość współczynnika wypełnienia odpowiadająca zadanej temperaturze będzie leżała pomiędzy dwiema możliwymi wartościami, to obecność członu całkującego spowoduje oscylacje (nieszkodliwe przy dobrze dobranym wzmocnieniu). Naprzemiennie wybierane będą dwie sąsiednie wartości (oczywiście i większa amplituda oscylacji może się zdarzyć), tak żeby wartość średnia utrzymana była na żądanym poziomie.

    1
  • #12 18 Lis 2007 01:07
    pirotechnik
    Poziom 10  

    WOW 8-O
    Nie spodziewałem się tak wyczerpującej i wyjaśniającej wiele zagadnień wypowiedzi... dzięki za dokładny opis, jutro przeczytam to jeszcze raz i zabiorę się do testów.
    Naprawdę wielkie dzięki... masz u mnie + ;)

    0