- sterowanie rezystorem grzejnym dla uzyskania zadanej temperatury,
- możliwość ustawienia temperatury od 30°C do 100°C z krokiem 1°C,
- wyświetlanie aktualnej temperatury z precyzją 0,1°C,
- wyświetlacz OLED o przekątnej 0,91”,
- ustawianie zadanej temperatury przyciskami,
- zasilanie napięciem stałym o wartości 12 V,
- pobór prądu maksymalnie 0,45 A.
Termostaty to urządzenia pozwalające utrzymać określoną temperaturę. Zazwyczaj kojarzymy je z modułami (elektronicznymi lub elektromechanicznymi), które sterują elementem wykonawczym – grzałką lub chłodziarką. Ten układ posiada wbudowaną, miniaturową grzałkę oraz sprzęgnięty z nią czujnik temperatury.
Idea układu jest prosta: jeżeli chcemy skalibrować termometr, musimy ogrzać jego czujnik do znanej temperatury, a następnie dokonać odpowiedniej regulacji w układzie. Często są w tym celu stosowane „chałupnicze” metody, jak wkładanie czujnika do wrzącej wody, chłodzenie w zamrażalce lub chłodziarce. Zaprezentowane urządzenie pozwala na dokładne ustalenie temperatury czujnika, więc skalibrowanie takiego termometru będzie dokładniejsze, oraz oczywiście szybsze i wygodniejsze. Sam termostat nie wymaga kalibracji. Użyto w nim cyfrowego czujnika temperatury, skalibrowanego przez producenta.
Budowa i działanie
Schemat ideowy warsztatowego termostatu został pokazany na rysunku 1. Układ jest przystosowany do zasilania napięciem stałym o wartości 12 V, które jest doprowadzane, także do elementu wykonawczego w postaci grzałki. Pozostała część elektroniki wymaga stabilizowanego napięcia 3,3 V, którego dostarcza stabilizator liniowy US1. Dioda D1 zabezpiecza przed uszkodzeniem w razie odwrotnego podłączenia zasilania.
Grzałką steruje tranzystor T1, podłączony w konfiguracji wspólnego źródła. Sygnał sterujący bramką pochodzi wprost z wyprowadzenia mikrokontrolera, ponieważ tranzystor AO3416 cechuje się bardzo niskim napięciem progowym. Rezystor R1 utrzymuje go w stanie zatkania zanim mikrokontroler podejmie pracę, a R2 zwiększa czas przełączania, co przyczynia się do zmniejszenia poziomu generowanych zakłóceń.
Jako element grzejny został wybrany grubowarstwowy rezystor typu GBR-618-12-10-2 produkcji krajowej firmy TELPOD, która już od dziesięcioleci zajmuje się elementami pasywnymi oraz technologią grubowarstwową. Ma kształt kwadratu o boku długości 12,7 mm. Został wykonany w postaci warstwy rezystywnej naniesionej na podłoże z tlenku aluminium. Do zasilania zostały przewidziane dwa pola lutownicze. Poglądowy rysunek tego elementu znajduje się na rysunku 2.
Jego nominalna moc wynosi 10 W przy zasilaniu napięciem 12 V. Co oczywiste, nie ma przeciwwskazań do tego, by tę moc zmniejszyć stosując np. sterowanie PWM. Dużym atutem użycia takiego elementu jest równomierne rozprowadzenie wydzielanego ciepła po całym obszarze rezystywnym (w kolorze czarnym). Maksymalna temperatura tego elementu może wynieść aż 300°C, więc nie ma obaw o jego przegrzanie w tym zastosowaniu.
Aktualna oraz zadana wartość temperatury wyświetlana jest na niewielkim wyświetlaczu OLED o przekątnej 0,91”. Ma postać niewielkiego modułu ze zintegrowanym kontrolerem SSD1306. Komunikacja z mikrokontrolerem odbywa się poprzez interfejs I2C, przez co zajęte są tylko jego dwa wyprowadzenia i ułatwia poprowadzenie ścieżek.
W celu kontroli temperatury powierzchni grzałki został użyty dobrze znany i popularny czujnik typu DS18B20. Jego dużymi zaletami są: fabryczna kalibracja oraz niska cena. Wyklucza to konieczność posiadania dokładnego termometru, który byłby konieczny do kalibracji wskazań termostatu.
Zarówno interfejs I2C, jak i 1-Wire, którym posługuje się czujnik DS18B20, wymagają do prawidłowego działania rezystorów podciągających. W projekcie użyto R3…R5 o wartości 3,3 kΩ. Połączenia między elementami są na tyle krótkie, że wymóg zapewnienia odpowiednio krótkiego czasu narastania zboczy można z całą pewnością uznać za spełniony. Układem zarządzającym pracą całego urządzenia jest mikrokontroler typu STM32F051, wyposażony w odpowiednio pojemną pamięć (zarówno Flash, jak i RAM, która jest konieczna do obsłużenia wyświetlacza) a dodatkowo odznacza się niewysoką ceną. Do jego zaprogramowania służy czteroszpilkowe złącze J2, do którego można podłączyć programator typu np. ST-LINK, komunikujący się poprzez SWD.
Ustawianie zadanej temperatury odbywa się przy pomocy dwóch przycisków. Wyprowadzenia mikrokontrolera, do których są dołączone przyciski, korzystają z wewnętrznych rezystorów podciągających mikrokontrolera. Zadana temperatura nie jest zapisywana w pamięci nieulotnej, po ponownym włączeniu urządzenia należy ustawić ją ponownie. Ma to zaletę, że po podaniu zasilania, układ podgrzewa grzałkę do temperatury 30°C, więc nie ma obawy o poparzeniu po przypadkowym dotknięciu. Dopiero użytkownik może tę wartość zwiększyć.
Montaż i uruchomienie
Układ został zmontowany na dwustronnej płytce drukowanej o łącznych wymiarach 75×30 mm, z czego część z elektroniką mieści się na obszarze 50×30 mm, a wystający fragment z elementem grzejnym zajmuje powierzchnię o wymiarach 25×13 mm. Schemat ścieżek oraz schemat montażowy pokazuje rysunek 3.
W odległości 3 mm od krawędzi płytki (w części z elektroniką) znalazły się otwory montażowe o średnicy 3,2 mm. Szczegóły dotyczące wymiarów płytki oraz lokalizacji otworów, przycisków i wyświetlacza pokazuje rysunek 4.
Montaż należy rozpocząć od elementów lutowanych powierzchniowo, które znajdują się tylko na wierzchniej stronie płytki, szczegóły pokazuje fotografia 1. Dalsza kolejność czynności montażowych jest następująca:
- przylutować kondensator C1, który leży płasko na powierzchni płytki,
- przylutować listwę zaciskową J1,
- przylutować listwy kołkowe typu goldpin: J2 i pod wyświetlacz DISP1,
- przylutować przyciski S1 i S2,
- przykleić rezystor grzejny w odległości 3 mm przed końcem wystającej części płytki (szczegóły na fotografii 2),
- przykleić czujnik US2 klejem termoprzewodzącym do powierzchni rezystora grzejnego tak, aby cała powierzchnia jego obudowy znajdowała się na czarnym polu warstwy oporowej (fotografia 2),
- po związaniu kleju, przylutować wyprowadzenia czujnika US2 do przeznaczonych dla niego pól lutowniczych,
- połączyć cienką srebrzanką (lub innym cienkim drutem) pola lutownicze rezystora z polami lutowniczymi na płytce,
- nałożyć na czujnik krótki odcinek (około 10 mm) rurki elektroizolacyjnej, która zmniejszy oddawanie ciepła z jego obudowy do otoczenia (fotografia 3).
Miejsce położenia krawędzi rezystora zostało zaznaczone cienką linią znajdującą się na powierzchni płytki. Taki naddatek wystającego laminatu ma za zadanie ochronić kruche, a przez to podatne na uszkodzenia, podłoże rezystora grzejnego przed przypadkowym uszkodzeniem. Rezystor można przykleić do płytki tym samym klejem termoprzewodzącym. Przypominam w tym miejscu o dokładnym odtłuszczeniu wszystkich klejonych powierzchni.
Po zmontowaniu układu, do zacisków złącza J1 można podłączyć napięcie stałe o wartości 12 V i zaprogramować pamięć Flash mikrokontrolera dostarczonym wsadem. Następnie wystarczy wyłączyć zasilanie, odłączyć programator SWD od złącza J2 i nałożyć wyświetlacz DISP1.
W układzie prototypowym użyto rezystora typu GBR-618-12-10-2 o znamionowej mocy 10 W. W handlu dostępny jest rezystor o dwukrotnie mniejszej mocy i identycznych wymiarach, który nosi oznaczenie GBR-618-12-5-2. Można go użyć zamiennie, ale należy liczyć się z wolniejszym nagrzewaniem jego powierzchni.
Eksploatacja
Prawidłowo zmontowany i zaprogramowany układ jest od razu gotowy do działania. Po włączeniu zasilania, wyświetlany jest ekran startowy, a potem układ przechodzi do normalnej pracy, pokazując ekran jak na fotografii tytułowej. Ustawienie zadanej temperatury jest bardzo proste, ponieważ odbywa się poprzez wciskanie przycisków S1 i S2. Dłuższe przyciśnięcie powoduje samoczynny wzrost lub spadek zadanej temperatury. Układ sam zaczyna reagować na zmiany temperatury zadanej i odpowiednio steruje grzałką.
Zarówno temperatura aktualna (NOW), jak i zadana (SET), są wskazywane w stopniach Celsjusza. Minimalna wartość temperatury zadanej to 30°C, a maksymalna 100°C. Z kolei, temperatura aktualna – odczytana z czujnika – może się zawierać w przedziale 0…125°C. Powyżej 100°C jest pokazywana z precyzją 1°C, a poniżej – 0,1°C. Ograniczeniem jest powierzchnia treści wyświetlacza.
Prąd pobierany przez układ silnie zależy od sygnału, który steruje grzałką. W czasie szybkiego rozgrzewania do wysokiej temperatury, pobór prądu w układzie prototypowym wyniósł 0,44 A. Utrzymywanie ustalonej temperatury 90°C wiąże się z poborem prądu o natężeniu 0,13 A. Stąd wniosek, że zasilacz do tego układu musi mieć wydajność prądową minimum 0,5 A.
Pomiary wykonano przy napięciu zasilającym o wartości 12 V.
Na rysunku 5 znajduje się wykres przedstawiający temperaturę aktualną w funkcji czasu po zadaniu temperatury 90°C. Widać na nim fragment obarczony niewielkimi oscylacjami, w którym temperatura zbliża się do wartości zadanej. W zależności od tego, jak dużej dokładności oczekujemy, układ dochodzi do stanu ustalonego po około 1,5 min od zadania nastaw przy dopuszczeniu błędu rzędu 2%. Całkowite ustanie zmian temperatury i ustabilizowanie się wskazań następuje po upływie około 2,5 min.
Czujnik, którego wskazania chcemy kalibrować, najlepiej byłoby przyłożyć do warstwy oporowej rezystora jak najbliżej czujnika US2. Jeszcze lepiej, gdyby udało się go „wtulić” pod izolacyjną rurkę. Producent rezystora dołożył starań dla zapewnienia jak największej równomierności grzania, więc część rezystora, która wystaje przed czujnikiem, powinna mieć tę samą temperaturę – to przydatne w przypadku kalibracji czujników o większych gabarytach. Warto zapewnić izolację termiczną, aby naturalne prądy konwekcyjne nie chłodziły go nadmiernie.
Na powierzchni laminatu znajdują się elementy, których temperatura może osiągnąć 60°C i więcej. Dotknięcie powierzchni silnie nagrzanego rezystora może spowodować bolesne oparzenie.
Dokładność użytego w projekcie czujnika temperatury wynosi ±0,5°C dla mierzonej temperatury do 85°C i ±1°C w przypadku pomiaru temperatury do 100°C.
Dla dociekliwych
Odczyty z czujnika DS18B20 wykonywane są co 750 ms. Czas reakcji rezystora jest bardzo mały, gdyż w ciągu kilku sekund jest w stanie nagrzać się do temperatury przekraczającej możliwości pomiarowe użytego czujnika. Dlatego zrealizowanie termostatu metodą „włącz-wyłącz”, jaką znamy z elektrycznych podgrzewaczy ciepłej wody użytkowej, było niemożliwe: temperatura ulegałaby silnym wahaniom z powodu małej stałej czasowej ogrzewanego elementu.
Konieczne było zasilanie rezystora przebiegiem typu PWM. W dobie tanich tranzystorów MOSFET o niskiej rezystancji otwartego kanału i niskim napięciu progowym, jest to banalnie proste. Użyty w projekcie tranzystor typu AO3416 jest sterowany napięciem 3,3 V wprost z wyprowadzenia mikrokontrolera, a w czasie pracy jego obudowa jest jedynie ciepła.
Częstotliwość sygnału PWM to 480 Hz – na tyle mała, aby nie wychodziły na jaw problemy z szybkim przeładowywaniem bramki, a na tyle wysoka, aby uśrednianie wydzielanej w rezystorze mocy zachodziło prawidłowo.
Większym problemem jest obliczenie odpowiedniego wypełnienia owego sygnału sterującego. Z jednej strony, układ powinien możliwie szybko dojść do zadanej temperatury, a z drugiej nie ma prawa oscylować wokół niej. To są wzajemnie wykluczające się warunki, z którymi teoria sterowania boryka się od dziesiątek lat. Jednym z popularniejszych rozwiązań jest implementacja regulatora typu PID. Osoby związane z szeroko pojętą automatyką doskonale znają znaczenie tego akronimu, a mniej obeznanym objaśniam: jest to regulator proporcjonalno-całkująco-różniczkujący. Najczęściej ma postać modułu z podpiętymi czujnikami i własnym wyświetlaczem, ale w ogólności jest to twór matematyczny. Można go zrealizować przy użyciu elementów dyskretnych, jak i zaimplementować programowo, pamiętając o pewnych ograniczeniach.
Wielkością wejściową jest uchyb, czyli różnica między wartością aktualną a zadaną. Uchyb może być dodatni, ujemny lub zerowy. Ideą tego regulatora, w najprostszym jego wydaniu, są trzy człony, pracujące niezależnie:
- proporcjonalny, zwany też liniowym, który wzmacnia aktualną wartość uchybu,
- całkujący, który gromadzi poprzednie wartości uchybu,
- różniczkujący, który odpowiada proporcjonalnie do wielkości przyrostu uchybu.
Wyjściem regulatora jest suma wielkości wyjściowych wszystkich bloków. Niewiadome wielkości, które trzeba obliczyć lub ustalić doświadczalnie, to wielkości tych wag. Od nich zależy, z jaką szybkością układ będzie dochodził do wielkości zadanej oraz zdeterminują jego skłonność do wpadania w oscylacje. Również one pełnią funkcję skalującą między wielkością wejściową a wyjściową, które mogą się różnić o wiele rzędów wielkości (np. wejściem jest napięcie mierzone przetwornikiem o rozdzielczości 8 bitów, a wyjściem generator PWM o rozdzielczości 16 bitów).
Programowa implementacja tego regulatora narzuca kilka ograniczeń. Po pierwsze, skończona precyzja, wynikająca z arytmetyki danego mikrokontrolera. Po drugie, skłonność członu całkującego do nasycania się przy długotrwałym dochodzeniu do stanu ustalonego. Trzeba narzucić mu pewne ograniczenie co do akumulowanej wartości, aby „nagromadzony” w nim uchyb nie powodował zbyt długiego dochodzenia do stanu ustalonego. Warto również sprawdzić, czy obliczona przez regulator nastawa ma sens, czyli czy mieści się w zakresie akceptowalnym przez sterowany obiekt.
Zastosowana w tym projekcie implementacja została pokazana na listingu 1. Przyjęto maksymalne wypełnienie sygnału sterującego grzałką na 50%, aby nie uległa ona przegrzaniu pomiędzy kolejnymi odczytami z czujnika DS18B20. Maksymalną wartość zakumulowaną w bloku całkującym przyjęto jako równą maksymalnemu współczynnikowi wypełnienia.
#define PWM_PERIOD 9999 //maksymalnne wypełnienie PWM
#define PWM_MAX PWM_PERIOD/2 //maksymalna wartość wypełnienia, jaką może zadać układ
#define KP 7 //nastawa członu proporcjonalnego
#define KI 0.45 //nastawa członu całkującego
#define KD 0.2 //nastawa członu różniczkującego
volatile uint16_t temp_akt = 0; //aktualna temperatura do utrzymywania
volatile uint16_t temp_zadana = 0; //temperatura zadana
volatile uint16_t pwm = 0; //wypełnienie
volatile int16_t error = 0; //wartość błędu w danej iteracji
volatile int16_t last_error = 0; //poprzedni błąd
volatile int16_t proportional = 0; //wartość P
volatile int16_t integral = 0; //wartość I
volatile int16_t derivative = 0; //wartość D
volatile int16_t set_val = 0; //wartość do ustawienia, przed kontrolą nasycenia
///////////////////////////////////////////////////
last_error = error; //skopiowanie poprzedniej wartości uchybu - dla członu I
error = (temp_zadana * 10) - temp_akt; //aktualny uchyb
proportional = error; //człon P - działanie na aktualnym uchybie
integral = integral + error; //człon I - zbieranie poprzednich wartości uchybu
if(integral > PWM_MAX){integral = PWM_MAX;} //kontrola nasycenia członu I
if(integral < (-1 * PWM_MAX)){integral = -1 * PWM_MAX;}
derivative = error - last_error; //człon D
set_val = (KP * proportional) + (KI * integral) + (KD * derivative); //suma ważona
if(set_val <= 0){pwm = 0;} //wartość ujemna = wypełnienie zerowe
if(set_val > 0 && set_val < PWM_MAX){pwm = set_val;}
if(set_val > PWM_MAX){pwm = PWM_MAX;} //kontrola nasycenia wyjścia
TIM_SetCompare1(TIM1, pwm); //uaktualnij wypełnienie
Temperatura zadana ma postać liczby całkowitej z przedziału 30…100, zaś aktualna uwzględnia cyfrę po przecinku (czyli jest 10 razy większa od wyświetlanej na ekranie), stąd konieczność pomnożenia zadanej przez 10, aby były one ze sobą porównywalne. Przedstawiony algorytm jest uruchamiany po każdym odczycie z czujnika temperatury.
W uproszczeniu, największe znaczenie ma człon proporcjonalny, gdyż w dużej mierze warunkuje stabilność układu. Człon całkujący spowalnia reakcję układu na szybkie zmiany, które tutaj mogłyby być spowodowane np. przyłożeniem zimnego czujnika do nagrzanego już rezystora, ale też przyspiesza tę reakcję, kiedy wysoki uchyb trwa zbyt długo. Człon różniczkujący działa przeciwnie: opowiada tym silniej, im większy jest przyrost uchybu, więc odgrywa dużą rolę przy początkowym rozgrzewaniu rezystora, kiedy różnica między wartością aktualną i zadaną jest bardzo wysoka. Nastawy członów – KP, KI i KD – zostały ustalone doświadczalnie.
Układ nie ma tendencji do wpadania w oscylacje, jest zatem stabilny. Uważam to za najistotniejszą cechę w tego typu projekcie. Jednocześnie, czas na dojście do stanu ustalonego jest stosunkowo krótki, jak na element grzejny z relatywnie rzadką kontrolą stanu aktualnego.
Michał Kurzela, EP
Bibliografia:
https://bit.ly/3pNr0UJ
https://bit.ly/36YIPaD
https://bit.ly/336IwcJ
- R1, R6…R8: 10 kΩ SMD0805
- R2: 33 Ω SMD0805
- R3…R5: 3,3 kΩ SMD0805
- C1: 47 µF/25 V raster 2,54 mm
- C2, C4, C6, C7, C9, C10: 100 nF SMD0805
- C3, C5, C8: 10 µF/16 V SMD0805
- D1: M7 lub podobna
- DISP1: OLED 0,91" SSD1306 128×32 pix
- T1: AO3416
- US1: LD1117S33TR SOT223
- US2: DS18B20 TO92
- US3: STM32F051K8T6 TQFP32
- J1: ARK2/500
- J2: goldpin 4 pin męski 2,54 mm THT
- S1, S2 microswitch 6×6 17 mm THT
- Goldpin 4 pin męski+żeński 2,54 mm THT (do wyświetlacza)
- Rezystor GBR-618-12-10-2 TELPOD (opis w tekście)
- Klej termoprzewodzący np. AG TermoGlue
- Rurka elektroizolacyjna 12 mm i długości 10 mm (opis w tekście)