Parafrazując pewne porzekadło, należy stwierdzić, że niezwykłe wymagania wymagają niezwykłych rozwiązań.
Układ i mikrokontroler wykorzystane do budowy modułu pomiarowego (ATmega32, MAX6675)
Pomiar temperatury spalin w kominie wymaga takich specjalnych możliwości, gdyż warunki pracy takiego sensora należy określić jako praca w warunkach skrajnie agresywnych. Pomijając sam zakres temperatury (poza zasięgiem elementów półprzewodnikowych), głównym zagrożeniem może okazać się płomień. Nie można wykluczyć, że sam czujnik będzie zawsze poza jego destrukcyjnym zasięgiem. By sprostać wszystkim wymaganiom, jako rozwiązanie zostało wybrane zastosowanie termopary.
Zastosowanie termopary w amatorskich rozwiązaniach nie jest częste. Z jednej strony idea działania takiego elementu pomiarowego nie jest powszechnie zrozumiała. Z drugiej strony sama obsługa sprzętowa czujnika „na piechotę” nie należy do zagadnień trywialnych. Termopara, z punktu widzenia elektrycznego, jest ogniwem, źródłem napięcia. W dużym uproszczeniu można stwierdzić, że na styku dwóch różnych przewodników powstaje napięcie elektryczne, którego wartość jest zależna od temperatury (i zastosowanych do budowy złącza metali).
Tematyka opisująca zjawiska zachodzące na styku jest wystarczająca złożona, by nie zagłębiać się w nią na łamach „Elektroniki dla Wszystkich”, niemniej osoby pragnące poszerzyć swoją wiedzą zawsze mogą samodzielnie studiować to zagadnienie. Na szczęście współczesna elektronika proponuje gotowe rozwiązania. Zamiast samotnie pokonywać problemy związane z obsługą takiego termoogniwa, można wesprzeć się na pracy i doświadczeniu innych.
Zapewne jakiś inżynier pracujący w laboratorium firmy Maxim musiał być ekspertem, by opracować gotowy układ scalony zawierający kompletną obsługę termopary. Właśnie w ofercie tej firmy jest układ o symbolu MAX6675 zapewniający kompletną jej obsługę wraz z niezbędną kompensacją temperaturową. Dodatkowo układ ten integruje w sobie przetwornik analogowo-cyfrowy tak, że wspomniany układ doskonale nadaje się do współpracy z mikrokontrolerami.
Moduł pomiarowy jest obsługiwany przez mikrokontroler, którego zadaniem jest odpowiednia komunikacja z układem scalonym MAX6675. Tradycyjnie dane pomiarowe są wysyłane za pośrednictwem kontrolera transmisji szeregowej do kolejnych elementów systemu automatyki. Czytelnicy zapewne już się przyzwyczaili, że wszystkie elementy systemu realizują swoją transmisję jako komunikację półdupleksową z wykorzystaniem interfejsu RS485. Tak też jest i w tym przypadku. Głównym elementem modułu jest mikrokontroler ATmega32. Schemat jednostki centralnej pokazuje rysunek 1. Jest to podobna jak w dotychczasowych rozwiązaniach aplikacja mikrokontrolera z rodziny AVR. Jedynym ewentualnym zaskoczeniem jest użycie modelu ATmega32.
Jak pokazuje rysunek 1, do wybranych wyprowadzeń portu C jest przyłączone złącze, poprzez które do systemu może być przyłączony wielopinowy sensor różnych wielkości fizycznych. W poprzednich częściach były opisane obsługi, które wymagały maksymalnie dwóch wyprowadzeń portów do realizacji komunikacji mikrokontrolera z sensorem. W obecnym module pomiarowym wymagania są większe i przewidziane jest więcej wyprowadzeń.
W czasie, gdy były tworzone pierwsze sterowniki pomiarowe, wydawało się, że możliwości zaproponowanych rozwiązań będą wystarczające. Niestety, życie potrafi zaskakiwać i pojawiły się nowe potrzeby. Stąd zastosowanie mikrokontrolera o większych zasobach, zarówno w sensie liczby wyprowadzeń przeznaczonych do współpracy z sensorami pomiarowymi, jak i w sensie wielkości pamięci FLASH przeznaczonej na program obsługi. Wszystkie sygnały wychodzą na złącze, do którego zostanie przyłączony układ obsługujący termoparę. Schemat przyłącza pokazuje rysunek 2.
Wyprowadzenia portu przewidziane do obsługi układu MAX6675 dochodzące do złącza, są zabezpieczone przed przepięciami dedykowanymi do tego celu elementami D201–D203, natomiast nad zasilaniem „wyeksportowanej” płytki z układem MAX6675 czuwa dioda zabezpieczająca D204. Niektórych czytelników może zastanowić takie rozwiązanie: dlaczego układ MAX6675 nie wchodzi w skład modułu pomiarowego, a jest do niego przyłączany jako element zewnętrzny, wykorzystując jedynie sygnały cyfrowe do komunikacji. Wyjaśnienie jest, jak zwykle, proste: gotowym komponentem jest termopara wraz z niewielką płytką PCB zawierającą układ MAX6675, co jest wymagane z uwagi na kompensację temperatury tzw. zimnego końca. Termoparę z małą płytką obsługi pokazuje fotografia 1.
Sygnalizacja stanu pracy oraz zaistnienia innych zdarzeń jest zrealizowana przez zespół lampek LED, które jako mała płytka front panelu jest przyłączana do płyty głównej modułu. Schemat pokazuje rysunek 3.
Diody LED są poprzez rezystory bezpośrednio przyłączone do wyprowadzeń portu mikrokontrolera. Specyfika takiego rozwiązania musi być odpowiednio ujęta w oprogramowaniu, gdyż dioda LED świeci, jeżeli na wyjściu portu występuje stan logicznego zera. Kanał transmisji szeregowej będący na wyposażeniu mikrokontrolera pozwala na zorganizowanie łącza komunikacyjnego z pozostałymi elementami systemu. Ze względu na funkcjonalność modułu pomiarowego (jest elementem typu SLAVE) komunikacja jest rozwiązana jako transmisja półdupleksowa z zastosowaniem jako interfejsu układu SN75C176. Rozwiązanie jest identyczne jak we wszystkich modułach realizujących funkcjonalność SLAVE opisanych dotychczas. Schemat przyłącza pokazuje rysunek 4.
Wszystkie moduły systemu Infinity są zasilane ze źródła napięcia o wartości 12V, toteż każdy moduł musi zawierać odpowiedni stabilizator napięcia. Tradycyjnie, ze względu na nieprzerwane działanie, stabilizator napięcia jest zbudowany w oparciu o rozwiązania impulsowe. Schemat przetwornicy pokazuje rysunek 5. Jak w każdym przypadku wykorzystania rozwiązań impulsowych, do filtracji napięcia wyjściowego należy stosować kondensatory niskoimpedancyjne. Ta konieczność wynika z dużej częstotliwości pracy, z jaką działa sama przetwornica. Tradycyjnie wyjście napięcia z przetwornicy jest odłączane od pozostałej części modułu zworką P501 (rysunek 5).
Montaż i uruchomienie - moduł pomiaru temperatury za pomocą termopary
Opracowaną płytkę PCB do powyższego schematu pokazuje rysunek 6 (strona TOP) oraz rysunek 7 (strona BOTTOM).
Prezentowany moduł w swej idei jest jedynie rozszerzeniem rozwiązania zastosowanego do obsługi czujnika SHT11, a samo rozszerzenie dotyczy tylko liczby wyprowadzeń portu dostępnych na złączu przeznaczonym do przyłączenia sensora pomiarowego. By nie dopuścić do ewentualnych pomyłek, złącze P401 (rysunek 4 i 6) przeznaczone do przyłączenia zasilania i magistrali komunikacyjnej jest sześciopinowe. Do obsługi sensora pomiarowego (złącze P201, rysunek 2 i 6) zastosowane jest złącze o innej liczbie pinów. To skutecznie wyklucza jakiekolwiek pomyłki, gdyż nikogo nie trzeba przekonywać o skutkach doprowadzenia do wyprowadzeń portu mikrokontrolera napięcia o wartości 12V. Taka pomyłka jest wręcz gwarancją problemów.
Jak wspomniałem, moduł jest funkcjonalnym rozszerzeniem (liczba pinów) wcześniej opisanych modułów pomiaru temperatury. Struktura bloku konfiguracyjnego, przechowywanego w pamięci nieulotnej mikrokontrolera, jest taka sama jak w module opisanym w poprzednim miesiącu (oczywiście z dokładnością do identyfikatora nadanego modułowi jako wartość domyślna, tu jest TMPS3). Lista poleceń, jakimi posługuje się moduł, jest identyczna, a jedyna różnica zawiera się w odpowiedzi na polecenia HELLO oraz GETVER. Konfiguracja modułu, czyli zmiana określonych wartości identyfikatorów i sposób ich uzyskania, jest identyczna jak dotychczas. Konfigurując, należy jedynie pamiętać, że nowy element systemu musi mieć unikalny identyfikator modułu oraz identyfikator wielkości mierzonej. Ze względu na fakt wkompilowania pewnych identyfikatorów w oprogramowanie serwera www, bieżący moduł musi być określony jako TMPS03, a wielkość mierzona jako T03. Lista subskrybentów danych pomiarowych jest identyczna, gdyż dane pomiarowe są wysyłane do serwera www oraz do systemu przewidzianego do logowania wszystkich zachodzących zdarzeń.
Moduł w większości zawiera elementy przystosowane do montażu powierzchniowego, jednak przy odrobinie staranności uruchomienie nie powinno nastręczać kłopotów. Po zmontowaniu, w pierwszej kolejności należy sprawdzić poprawność generowanego napięcia zasilającego mikrokontroler. Przed włączeniem zasilania wymagane jest zdjęcie zworki P501 (rysunek 5 i 6). Po dołączeniu do modułu zasilania należy sprawdzić napięcie na wyjściu przetwornicy, powinno wynosić około 5V. Dopiero po upewnieniu się, że układ zasilający działa poprawnie, można założyć zworkę P501 i przejść do kolejnego kroku związanego z ustawieniem FUSE w zastosowanym mikrokontrolerze. Docelowo bity FUSE powinny odpowiadać rysunkowi 8 (uzyskanego z pakietu AVRSTUDIO 4).
Do istotnych bitów konfiguracyjnych należy zaliczyć:
- wyłączenie (brak ptaszka) JTAG,
- SUT_CKSEL – ustawić zewnętrzny rezonator kwarcowy o średnim zakresie częstotliwości,
- włączenie (jest ptaszek) EESAVE – pozwala zachować zawartość pamięci nieulotnej przy każdej operacji kasowania/ programowania pamięci FLASH przeznaczonej na program, opcja może okazać się przydatna przy realizacji własnych eksperymentów, co wiąże się z wielokrotnym przeprogramowaniem pamięci FLASH.
Po pierwszym uruchomieniu modułu, w jego pamięci nieulotnej zostaną zapisane domyślne wartości parametrów konfiguracyjnych. Te parametry wymagają korekty, którą można wykonać, posługując się odpowiednim programem do konfiguracji (dostępnym na stronie internetowej czasopisma). Niezbędne zmiany to wprowadzenie nowych identyfikatorów, których wartości zostały wymienione wyżej. Również oprogramowanie mikrokontrolera nie wymaga dodatkowych wyjaśnień. Zastosowane rozwiązania były już wystarczająco dokładnie opisane w dotychczasowych numerach czasopisma. Jedynie pewnego wyjaśnienia wymaga obsługa termopary, a właściwie sposób porozumiewania się z układem MAX6675. Płytka PCB zawierająca wspomniany układ jest pokazana na fotografii 2.
Zawiera ona listwę GOLDPIN do połączenia z modułem pomiarowym. Poszczególne jej wyprowadzenia są precyzyjnie opisane, toteż nie powinno być problemów z ich identyfikacją i integracją. Należą do nich:
- napięcie zasilające VCC i GND – wymagane jest to samo napięcie, jakim jest zasilany mikrokontroler,
- sygnał wyboru CS – sygnał aktywacji układu obsługi termopary do przesłania danych, jest wejściem dla MAX6675,
- sygnał taktujący SCK – synchronizujący przesyłanie danych, jest wejściem dla MAX6675,
- sygnał danych szeregowych SO – dane są przesyłane szeregowo z prędkością wynikającą z sygnału zegarowego SCK, jest wyjściem (trójstanowym) w MAX6675.
Odczyt danych z sensora - układ MAX6675
Komunikacja mikrokontrolera z układem obsługi termopary ogranicza się jedynie do operacji odczytu danych. Odczytywane dane są liczbą 16-bitową. Szczegóły dotyczące sprzęgu pokazuje listing 1 (wszystkie listingi są dostępne w Elportalu wśród materiałów dodatkowych do tego numeru), wszystkie sygnały są doprowadzone do portu C, w tym SCK (taktujący) jest na pozycji bitowej 0, sygnał CS (wyboru) jest jako bit 1 oraz SO (danych) to bit 2. Część tych sygnałów jest generowana przez mikrokontroler (są wyjściami), sygnał danych jest odczytywany przez mikrokontroler (jest wejściem). Jest to ujęte w odpowiedniej konfiguracji portów, szczegóły pokazuje listing 2.
Odczyt danych z sensora nie należy do operacji skomplikowanych. W typowej pętli wygenerowanych jest 16 impulsów zegarowych. Po wystąpieniu opadającego zbocza sygnału zegarowego odczytywane są dane szeregowe. Dane te są wysyłane, poczynając od bitów najbardziej znaczących. Istotnym elementem jest wystawienie sygnału wyboru (CS). W ogólnym przypadku możliwe jest użycie kilku układów MAX6675 mogących mieć wspólne sygnały zegarowe i danych. Rozdzielając sygnał wyboru indywidualnie dla każdego z nich, istnieje możliwość wyboru jednego z wielu możliwych. W prezentowanym przypadku obsługiwany jest jeden układ MAX6675, co nie zwalnia z konieczności wskazania sygnałem CS na ten jedyny. Techniczny odczyt danych pokazuje listing 3.
Poszczególne bity odczytanej liczby 16-bitowej mają znaczenie pokazane na rysunku 9. Najbardziej znaczący bit (bit 15) jest bitem znaku. Ponieważ układ MAX6675 jest dedykowany do pomiaru temperatur dodatnich, bit ten ma zawsze wartość równą zero. Kolejne bity odzwierciedlają zmierzoną wartość temperatury, gdzie MSB oznacza najbardziej znaczącą pozycję oraz LSB – najmniej znaczącą pozycję. Kolejny bit określa status sondy: jeżeli jest ustawiony, to oznacza, że sonda jest nieprzyłączona (w znaczeniu, element termoogniwa nie jest przyłączony do odpowiednich końcówek układu MAX6675). Kolejny bit ma zawsze wartość równą zero, ostatni bit należy uważać za nieokreślony.
Ten format danych jest ujęty w procedurze odczytu danych (listing 3), gdzie wczytane dane są przesunięte bitowo w prawą stronę o trzy pozycje. Ten zabieg pozwala wyselekcjonować z odebranych danych informacje określające zmierzoną wartość (zmienna MeasurementData). Jednocześnie w pamięci przechowywana jest oryginalna wartość odczytana z układu MAX6675 (zmienna MeasurementTechData), tu jest zawarta informacja o ważności danych pomiarowych (czy sonda jest przyłączona).
Sama liczba, określająca wartość zmierzoną, jest liczbą ułamkową. Po przesunięciu danych pomiarowych o 3 pozycje bitowe (rysunek 10) na dwóch najmłodszych pozycjach tak uzyskanego rezultatu zakodowana jest wartość ułamka. Jest to liczba czwartych części stopnia. Na dwóch bitach można zapisać cztery warianty. Przykładowo 01 (binarnie) oznacza 0,25 stopnia, a 11 (binarnie) to 0,75 stopnia. Ma to swoje odbicie w procedurze konwersji danych do postaci znakowej. Algorytm pokazuje listing 4. Uzyskane dane w postaci znakowej (zmienna TempParamAsciiValue) są wysyłane do modułów stowarzyszonych via kanał transmisji szeregowej.
Opisany moduł zamyka grupę elementów pomiarowych. Do opisania pozostały elementy przeznaczone do lokalnego prezentowania danych, toteż w kolejnym miesiącu przejdę do przedstawienia kolejnej funkcjonalności związanej z prezentacją danych.