
Witam wszystkich kolegów.
Na samym początku życzę wszystkim wesołych świąt i wielu interesujących pomysłów na nowe konstrukcje.
Chciał bym wam przedstawić konstrukcje swojego wielokanałowego kontrolera temperatury współpracującego z czujnikami Pt100. Zastanawiałem się czy pewno pokazać tą konstrukcję bo niestety okazało się że ma drobny błąd. Trzeba było dodać jeden układ jako "dead bug" (lub jak mawia mój kolega "na martwego zwierza"). Ale zdecydowałem się z dwóch powodów:
-takie błędy się zdarzają nawet w profesjonalnych rozwiązaniach (chyba komputery ZX-Spectrum były tak łatane)
-obecnie znaczną część czasu przebywam ze Francji i w zasadzie następna szansa poprawy projektu i jego prezentacji była by w sierpniu.
Mam nadzieje ze będziecie wyrozumiali.
A teraz bardziej do rzeczy. Układ powstał jako kontroler do:
-rejestrator temperatury w piecu laboratoryjnym
-akwarium kolegi (będzie to jeszcze rozwijane)
-wędzarni
-temperatury w przedsionku.
-kurnika kolegi
Do układu można podłączyć od 1 do 3 czujników Pt100 w konfiguracji 4 przewodowej. Każdy czujnik jest całkowicie niezależny i posiada własny dedykowany przetwornik analogowo-cyfrowy MAX31865.
Możliwości układu to:
-pomiar 3 temperatur
-kontrola stanu 4 przekaźników w zależności od temperatur lub godziny.
(tutaj żeby wybrać jakie mają być zależności muszę zmieniać kod, zrobienie tego uniwersalnie z menue przekracza moje zdolności programistyczne)
-wysyłanie danych o temperaturze po RS485
-wysyłanie danych po USB
-kontrola stanu 8 wyjść otwarty-kolektor
Układ składa się z trzech dwustronnych płytek drukowanych o wymiarach dokładnie 100x100 (jest limit wymiarów dla tanich płytek z chin).
Są to następujące moduły:
1) "płyta główna" z przetwornikami i uC
2) wyświetlacz z klawiaturą
3)płyta zasilająca i wykonawcza.
Teraz opis każdej z płytek:
1) "płyta główna" z przetwornikami i uC
W jej skład wchodzi:
- uC ATxmega serii A4U (16/32/64/128) i chyba nie trzeba wyjaśniać co on robi, ale dla formalności obsługuje on komunikacje SPI z przetwornikami A/D, kontroluje wyświetlacz i klawiaturę, wysyła i odbiera dane po RS485. Przewidziana jest również opcja USB i wyprowadzone są linie TXD/RXD interfejsu RS485
-zegar RTC DS3232M
-Pretworniki A/D. Jak już wspomniałem każdy kanał ma swój niezależny układ MAX31865 dedykowany do czujników rezystencjach (Pt100, Pt1000, Ni1000 itp) Każdy kanał ma swoje niezależne izolowane zasilanie za pomocą przetwornicy DC/DC 1W (AM1S-0505SZ) które następnie jest stabilizowane za pomocą dwóch (osobno zasilanie części cyfrowej i analogowej) układów TC1015-3.3V. Może takie rozwiązanie zasilania to lekka przesada, ale te układy są bardzo tanie i zajmują bardzo mało miejsca na PCB. Układ MAX31865 wymaga też zastosowania rezystora wzorcowego. Tutaj zdecydowałem się na zastosowania rezystora serii PTF-56 Vishay o bardzo małym dryfcie temperaturowym.
-Każdy kanał ma również izolowaną komunikacje SPI zrealizowaną za pomocą układu ADuM152N0. Tu pojawił się problem. Po za liniami CS wszystkie linie SPI połączone są równolegle. Niestety powoduje to problem jeśli pracuje więcej niż 1 kanał. Problem polega na tym że ciężko jest sprowadzić stan linii MISO do "0". Problem ten rozwiązałem przecinając każda z linii MISO zaraz za układem ADuM (po stronie uC) i dodając prostu układ na 7400 rozwiązujący ten problem. Rozwiązanie polega na tym że żeby sygnał MISO z układu ADuM "przechodził" dalej na uC wybrana linia CS musi być w stanie niskim. Problem ten będzie rozwiązany w następnej wersji oczywiście ale muszę zamówić nowe płytki. Miejsce na 7400 się znajdzie.
-MAX3485 do komunikacji RS485
Schemat:
2) wyświetlacz z klawiaturą
Na płytce znajdują się:
-wyświetlacz w standardzie ST7565R
-8 przycisków
-układ debouncer MAX6818
-złącza pozwalające na dołączenie zewnętrznych przycisków w stosunku do tych które są używane na płytce (mogą pracować równolegle).
-DIP-Switch do wyboru które przyciski będą podłączone do wejść uC
Schemat:
3) płyta zasilająca i wykonawcza.
-przetwornica AC/DC ( AC 100-230V->5V DC) TracoPower TMLM 04105
-4 przekaźniki
-Układ MCP23017
-2 układu ULN2803
-złącze z wyprowadzonymi 8 liniami "wysokoprądowymi" z ULN2803A
Przekaźniki kontrolowane są przez układ MCP23017 po protokole I2C.
Schemat:
Całego kodu w obecnej chwili nie przedstawie, natomiast najistotniejsza wg mnie część to ta związana z obsługą MAX31865 i tutaj jest istotny kawałek. Może nie jest to wersja optymalna bo używam typów zmiennoprzecinkowych w jednym miejscu ale mogłem sobie na to pozwolić. Co ważne w pliku konfiguracyjnym łatwo zmienić dane dotyczące rezystencji czujnika oraz rezystencji wzorca. Jak dopracuje kod na tyle żeby go upublicznić to wtedy może go zamieszczę. Jednak nie wiem czy będzie miało to duży sens.
MAX31865_SPI.h
Code: c
MAX31865_SPI.c
Code: c
Kod jest może trochę skomplikowany, natomiast wynika to z tego że są dwie opcje kompilacji. Jedna dla zakresu -50 do 150degC gdzie można użyć jednego równanie 2 stopnia do dokładnego wyliczenia temperatury (z rozdzielczością na jaką pozwala MAX31865). Dla szerokiego zakresu temperatur trzeba by użyć równania wyższego stopnia, lub zastosować funkcje sklejaną tak jak ja tutaj.
Zdjęcia układu w wersji 2 kanałowej (zabrakło mi złącz M8) :
a) "Płyta główna"
Jeśli chodzi o działanie układu to jestem zadowolony. Układ pracuje stabilnie. Jeśli podłącze zewnętrznie rezystor 100ohm 0.01% 5ppm (ptf56) to wskazywana jest temperatura 0.04degC (czasem przeskakuje do 0.07degC, czyli o 1 LSB). Współpraca z prawdziwym czujnikiem tez przebiega bez problemu.
Cool? Ranking DIY