
Termometr mikromocowy LCD ATMEGA16
Tym razem głównym celem projektu było sprawdzenie możliwości wykonania mikromocowego systemu pomiaru temperatury w oparciu o możliwie standardowe elementy, mówiąc w skrócie byłem ciekawy czy zwykły avr może być konkurencją dla układów msp430, które to podobno właśnie do takich zastosowań są preferowane. Zanim jednak zacznę przynudzać (co niektórych)...
Najistotniejsze parametry urządzenia:
Zasilanie Akumulator ni-mh 60mAh ładowany ogniwami fotowoltanicznymi.
Średni pobór prądu ~150uA (zależny od napięcia zasilającego), dla pełnego akumulatora daje to teoretycznie 2 tygodnie pracy, bez doładowywania słońcem.
Pomiar temperatury z rozdzielczością 1C (dokładność względna i zakres jak dla użytych DS18B20)
Obsługa równocześnie dwu termometrów (wewnętrzny i zewnętrzny)
Wskazywanie monotoniczności temperatury (nie spada, nie rośnie)
Zapamiętywanie najniższej/najwyższej temperatury z możliwością skasowania
Pomiar i zapamiętywanie min/max napięcia zasilającego
Zliczanie błędów magistrali 1Wire termometrów (max 255 kasowalne)
Obsługa za pomocą jednego przycisku (przeglądanie min/max, kasowanie...)
Wizualizacja za pomocą 4 cyfrowego wyświetlacza LCD
Kosztorys:
Ogniwa słoneczne -obudowa urządzenia sztuk 3 =15zł
Ogniwo słoneczne zewnętrzne 2.5zł
Akumulator ni-mh (w zestawie z każdym ogniwem sztuk jedna)=0zł
Atmega16 (10zł ?)
DS18B20 sztuk dwie =10zł
Płytka uniwersalna, lvc14, reszta drobnicy- odzysk cena nieznana
W sumie ~40zł, ale z powodzeniem można zastosować tylko jedno małe ogniwo „zaokienne” co obniży znacznie koszt.
Wynalazek ciekłych kryształów zastosowany do użytku w wyświetlaczach moim zdaniem był przełomem jeśli chodzi o urządzenia elektroniczne mogące zużywać jak najmniej prądu. Porównałbym go do wynalezienia tranzystora (zwłaszcza tranzystora MOS). Oba wynalazki zaowocowały, po pierwsze miniaturyzacją, po drugie zmniejszeniem poboru mocy przez urządzenia. Chociaż technologia LCD ma już sporo lat (samo odkrycie zjawiska to rok 1888 i doświadczenia z marchewkami

Budowę termometru rozpocząłem od sprawdzenia możliwości wysterowania wyświetlacza przez procesor, a dokładniej zbadania , czy odświeżanie generowane przez zegar WDT procesora umożliwia poprawną jego pracę. W skrócie przypomnę, że wyświetlacz o którym mówimy, aby mu się krzywda nie działa musi być sterowany przez czas cały sygnałem prostokątnym o częstotliwości około 50Hz. Zaciemnienie segmentu występuje w momencie występowania różnicy potencjałów między wyprowadzeniem podłoża oraz segmentu który chcemy uaktywnić. Napięcie sterujące powinno wynosić od kilku do kilkunastu woltów. Jeżeli chcemy aby segment pozostał nieaktywny, należy po prostu podawać na niego napięcie zmienne w fazie z napięciem podawanym na wyprowadzenie BP. W użytym procesorze udało się uzyskać maksymalną częstotliwość 15Hz sygnału sterującego, co okazało się wystarczające do poprawnego działania. Nota katalogowa podaje minimalną częstotliwość 30Hz, jednak nie przypuszczam, aby 15Hz miało jakieś destruktywne skutki dla kryształów przynajmniej na przestrzeni dekady

Pobór prądu dla zegara 1MHz / 8MHz, częstotliwość WDT=30Hz:
2.5V Atmega przestaje współpracować

3V 12uA/9uA
3.5V 14uA /11uA
4V 18uA/12uA
5V 23uA/18uA
6V 30uA/24uA
Nie ma pomyłki w przedstawionych wynikach, dla szybszego zegara pobór mocy jest mniejszy

Pobór prądu jak widzimy jest zachęcająco mały, ale żeby nie było tak wesoło sporo energii zmarnuje nam ordynarna przetwornica, której sprawność to max 50%, co i tak jest niezłą wartością biorąc pod uwagę jej prostotę. Przetwornica zbudowana jest z bramek odwracających z przerzutnikami Schmitta, elementy RC ustalają częstotliwość generatora na około 500Hz, oraz długość impulsów załączających tranzystor mosfet który steruje prądem indukowanym w cewce. Później klasyczna dioda filtr, i sprzężenie zwrotne które wyłącza przetwornicę po przekroczeniu 5.8V. Maksymalne napięcie celowo zostało dobrane na graniczne bezpieczne dla AVR z powodu wymagań wyświetlacza który wg noty powinien być zasilany min. 4V RMS, ale najlepszy kontrast to wartości jeszcze wyższe. Podczas normalnej pracy obciążonego układu procesorem napięcie jednak nie osiąga tak wysokiego poziomu, utrzymując się w granicach 4.5V dla 1.3V napięcia ogniwa. Chciałem w tym miejscu zwrócić uwagę na użycie transila. Niestety spory prąd wsteczny zwykłej diody zenera wykluczył jej użycie w tym rozwiązaniu. (Być może przetwornica podwyższająca doczeka się współczesnej wersji na TPS6120, bo na takich specjalizowanych kontrolerach powinno się realizować takie zadania. Wtedy teoretycznie pobór prądu powinno się udać uzyskać jeszcze mniejszy, niestety to okaże się dopiero w praktyce, ponieważ nota układu nie podaje sprawności dla tak niskich poborów mocy).
Pobór prądu przez przetwornicę na układzie 74LVC14 (odłączone zasilanie cewki):
1.25V 6uA
1.3V 10uA
1.4V 15uA
1.5V 26uA
1.6V 41uA
1.7V 60uA
1.8V 80uA
1.9V 105uA
2V 135uA
Podłączmy więc nasz „zasilacz” z zabezpieczeniem nadnapięciowym, który będzie zasilał procesor dostarczając odpowiednio wysokiego napięcia z ogniwa PV (w początkowej fazie wszystkie próby pracy układu odbywały się z zasilania za pomocą ogniwa). Niestety podłączona do takiego źródła napięcia Atmega nie startuje. Po krótkiej analizie okazuje się, iż procesor dla napięć poniżej progu jego zadziałania pobiera ponad 1mA prądu, co jest wartością zbyt dużą, aby było możliwe jego wystartowanie dla powoli narastającego napięcia z tak małowydajnego źródła. W związku z tym, byłem zmuszony dodać układ, który załączy zasilanie procesora dopiero po przekroczeniu napięcia 3.1V. Układ składa się z specjalizowanego komparatora/resetu MC33460, oraz dowolnego mosfeta (wystarczy jakikolwiek RDSON<10R). Układ ten pobiera dodatkowo kilka uA, ale zapewnia niezawodny start procesora mimo wahań napięcia. Ktoś mógłby tutaj zauważyć, że można by użyć układu BOD AVRa, jednak po pierwsze nie zmniejszyło by to poboru prądu dla napięć 0-2.5V (zanim wystartuje program), po drugie BOD pobiera dodatkowo 30uA, co jest wartością 2x większą od średniego prądu pobieranego przez procesor w stanie swojej normalnej pracy. Na zakończenie ważna informacja. Kondensator blokujący zasilanie ATMEGI nie może mieć dużej wartości gdyż napięcie musi narastać odpowiednio szybko. Wartość 100nF jest optymalna i umożliwia poprawne zadziałanie układu POR procesora w całym zakresie temperatur (oczywiście sprawdziłem czy układ po schłodzeniu do -30C działa i wyświetla poprawnie

Przejdźmy do następnego zasilanio-zagadnienia jakim jest wydajność prądowa ogniw PV dla natężenia oświetlenia „żarówkowego”. Niestety mimo użycia kilku ogniw natężenie światła zapewniające pracę urządzenia musi być na poziomie takim jaki zapewnia komfortową pracę elektronika




O działaniu programu słów kilka. Pomiary termometrów są inicjowane i sczytywane z częstotliwością zależną od stopnia naładowania akumulatorka. Dla napięcia ogniwa <1.3V czas ten wynosi minutę dla każdego termometru. Program po wystartowaniu nie dokonuje konwersji temperatury w celu odczekania tych 30 sekund na naładowanie kondensatora (w przypadku braku akumulatora możliwa praca na samym ogniwie słonecznym). Podczas normalnej pracy, na wyświetlaczu wyświetlana jest przez 80% czasu temperatura zewnętrzna, 20% czasu temperatura wewnętrzna (miga ówczas małe 'r' z lewej strony). Dodatkowo na tej samej pozycji wskazywane jest czy temperatura nie wzrasta lub nie rośnie. Analogicznie po prawej stronie małe c oznaczające stopnie Celcjusza po osiągnięciu maksymalnej lub minimalnej zanotowanej temperatury zamienia się w taki sam znaczek. Zapamiętane ekstremalne temperatury można odczytać naciskając przycisk. Kolejne przyciśnięcia wywołują następujące funkcje menu:
1.wyświetlenie obecnego napięcia zasilania czas 2sek
'2.'Lo c' najniższa notowana temperatura /kasowanie flagi min temperatury
'3.'Hi c' najwyższa notowana temperatura
'4.'Lo U' najniższe napięcie zasilania
'5.'hi U' najwyższe napięcie zasilania
'6.Err' ilość błędów magistrali 1wire jeśli wystąpiły <>0 (zerowanie po 5sek.)
'7.rES' po 5s od wyświetlenia napisu 'res' resetuje zapamiętane temperatury i napięcia.
Jak widać można za pomocą jednego przycisku i menu z odpowiednimi „time outami” zrobić całkiem intuicyjną obsługę wyświetlania i kasowania zmierzonych parametrów. Żeby było ciekawiej przycisk jest podłączony do portu reset procesora, ponieważ w tym projekcie wąskim gardłem była ilość wyprowadzeń, cała reszta zasobów wystąpiła w nadmiarze

Wróćmy jeszcze do wyświetlacza i sposobu zamiany zmierzonej temperatury na cyfry LCD.
Jest faktem, że korzystając z nadmiaru romu, a chcąc oszczędzić na czasie, można by umieścić całą tablice przeliczania wartości binarnej bezpośrednio na przemapowaną wartość LCD-ram w pamięci, jednak zrezygnowałem z tego pomysłu ponieważ zysk czasu byłby naprawdę niezauważalny, a pracy w napisaniu tablicy sporo. I tak wszystkie obliczenia związane z wyświetlaniem wykonywane są raz na sekundę (z małym wyjątkiem programu wywoływanego po wejściu w menu 'reset', gdzie zrobiona jest szybsza „animacja” na wyświetlaczu).
Ponieważ najpierw podłączyłem do procesora wyświetlacz (tak żeby było wygodnie poprowadzić „ścieżki”), a później dochodziłem do tego który segment do którego portu, odpowiednie mapowanie znaków umieszczone jest w pamięci rom. Jedna cyfra/znak wykorzystuje jeden lub dwa porty procesora. Procedura wyświetlania znaków napisana jest w ten sposób, że każda jedna cyfra ma swój odpowiednik 4 bajtów (wszystkie porty/segmenty mogą zostać dowolnie ustawione). W celu wyświetlenia 4 cyfr procedura wywoływana jest 4 razy, a pobrane dane są „or -owane”- ulegają logicznemu 'lub' jak kto woli. W identyczny sposób przechowywane są etykiety semitekstowe, które również zajmują 4 bajty każda.
Na zakończenie o 1wire. Termometry korzystają ze wspólnego portu, co wymusiło konieczność sczytania adresów każdego z nich i umieszczenia w pamięci programu (brak procedury poszukiwawczej automatycznie rozpoznającej i przypisującej adresy urządzeń na magistrali). Z powodu resetowania się procesora 30 razy na sekundę nie możliwe było życie standardowego sposobu zasilania pasożytniczego (cykliczne spadki napięcia na linii danych uniemożliwiają poprawną konwersję temperatury – 'strong pullup'). Z tego powodu termometry zaopatrzone są w dodatkowy kondensator oraz diodę która dostarcza napięcie z wyprowadzenia danych, umożliwiając standardowe zasilanie dwuprzewodowe oraz poprawną konwersję, mino niedomagań napięcia zasilającego w trakcie jej trwania. Dodatkowy rezystor w zewnętrznym termometrze wymusza większy prąd magistrali, konieczny w przypadku użycia dłuższych przewodów wnoszących znaczną pojemność. Rezystor na linii danych w wewnętrznym termometrze jest tylko po to, aby umożliwić poprawne programowanie przez spi. Nie typowym, lecz celowym zjawiskiem ze względu na oszczędność energii jest fakt, że napięcie na 1wire występuje tylko w momencie pomiaru temperatury przez jeden z termometrów. Mam nadzieję, że udało mi się przybliżyć ciekawostki i niuanse mojego potraktowania problemów występujących przy adaptacji AVR w mikromocowym zastosowaniu, równocześnie zachęcając do budowania urządzeń o jak najmniejszym zapotrzebowaniu na energię

Zdjęcia z budowy:

















