Elektroda.pl
Elektroda.pl
X
PLC Fatek
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Termometr na ATTiny13

bobeer 22 Maj 2013 06:37 22482 6
  • Termometr na ATTiny13 Termometr na ATTiny13 Termometr na ATTiny13 Termometr na ATTiny13

    Jak to w życiu bywa, człowiek kolejny raz staje przed wyborem kupienia wątpliwej jakości chińskiego produktu, albo wyprodukowania „elastycznego” narzędzia którego parametry są nieco pewniejsze ;), przede wszystkim korzystanie z niego będzie sprawiać mi podwójną przyjemność. Tym razem temat dotyczy termometru. Miernik o tyle niebanalny, że do jego budowy poza naszym małym ulubieńcem TINY13 użyty został marnie udokumentowany wyświetlacz LPH7653 (do którego dość dokładny opis pozwoliłem sobie zamieścić w osobnym załączniku), termometr LM75, rozszerzenie pamięci ROM ;) 24C64, oraz ADS1112. Przed wyborem układu z TI długą chwilę zastanawiałem się nad wykorzystaniem wbudowanego w AVR przetwornika AD. Rozważałem również wbudowany w niektóre AVRy wzmacniacz, ale to wszystko do czasu, aż nie przypomniałem sobie, że są takie wynalazki jak wcześniej wspomniany przetwornik analogowo cyfrowy który posiada szereg bardzo korzystnych w tym zastosowaniu właściwości, oraz parametry o których jakikolwiek wbudowany w AVR ADC mógłby tylko pomarzyć ;). Wszystkie szczegółowe informacje można znaleźć w nocie, dlatego wspomnę tylko o najistotniejszych cechach które zadecydowały nad użyciem go w projekcie.

    1.Rozdzielczość 16bit
    2.Wzmacniacz x8
    3.Wbudowane napięcie odniesienia o świetnych parametrach
    4.Bardzo niski pobór prądu
    5.Możliwość pomiaru z kilku wejść
    6.Zasilanie od 2.7V-5V

    Zacznijmy jednak od wyświetlacza. Jakiś czas temu zakupiłem owy na testy z nadzieją, że znajdę w końcu coś, co będzie pobierać mniej prądu od poczciwego PCD8544. Po małym „reverse engineering” okazało się, że być może i udało by się uzyskać pobór prądu <0.3mA, ale trzeba wtedy pozbyć się dodatkowej płytki na której znajduje się układ zasilania wyświetlacza i postarać się o dostarczenie odpowiednich napięć bezpośrednio do układu LPH. Najprawdopodobniej układ na pcb wyświetlacza zajmuje się dodatkowo kompensacją temperaturową, więc sprawa mogła by być nieco utrudniona. Ostatecznie oryginalne pcb pozostało, a wyświetlacz jest zasilony w sposób nieco inny niż z jakim dotychczas się spotkałem w popularnych opisach z internetu, moim zdaniem najwłaściwszy, ale pewnie to jeszcze nie to co być powinno (kto wie w jakim sprzęcie używa się tego wyświetlacza ? ). W każdym razie kontrast jest na praktycznie stałym poziomie w zakresie napięć od 3.3V-5V, a obniżenie temperatury do -15C też nie robi na nim wrażenia. W tym miejscu trzeba wspomnieć o przetwornicy ujemnego napięcia zasilania którego parametry mają istotny wpływ na zachowanie się wyświetlacza. Metodą prób ustaliłem odpowiednią częstotliwość i wypełnianie dla uzyskania najlepszej sprawności i odpowiedniego napięcia, które wynosi około -5.5V przy VDD = 3.6V. / Gdybym jednak miał zbudować przetwornice w sposób bezkompromisowy, to z pewnością użyłbym ujemnego sprzężenia zwrotnego w celu autoregulacji, ale ponieważ pochłonęło by to dodatkowe minimum dwa tranzystory zostałem przy wersji uproszczonej, do moich celów zupełnie wystarczającej.




    (Tutaj małe wskazówki do pracy z tym LCD. Przy napięciu przekraczającym -10V wyświetlacz przestaje wyświetlać prawidłowo, również wyprowadzenie kontrastu nie należy łączyć bezpośrednio z wyprowadzeniem +3V ponieważ LCD może się nie uruchomić mimo pozornie prawidłowych napięć. Najlepiej użyć dzielnika który może dostarczać tylko kilku uA prądu.)
    Po „rozgryzieniu” wyświetlacza i kwestii związanych z minimalizacją poboru mocy przyszła pora na zawartość którą chciałem wyświetlić. Ponieważ w przypadku graficznych LCD 1kB rom w procesorze to wartość tragicznie mała, więc cały zestaw używanych znaków, oraz ewentualną bitmapę należało umieścić w osobnej pamięci w tym przypadku eeprom kompatybilnej z resztą sprzętu na magistrali i2c. Zapisaną pamięć warto zabezpieczyć przed modyfikacją (dla 24C64 blokowana jest górna ćwiartka pamięci). Jak widać zastosowałem czcionki o wysokości 16pix ponieważ chciałem żeby były czytelne nawet z większej odległości. Od razu informuje, że w obrazie eeprom nie ma liter oprócz 'mV', paru dodatkowych znaków oraz ikony baterii. Na wyświetlaczu udało się zmieścić 3 temperatury, oraz wskaźnik naładowania akumulatora (3 ikony) w trybie termometru, lub dwa napięcia w trybie woltomierza, bo skoro już mamy dokładny woltomierz, to może się przydać nie tylko do pomiaru temperatury, ale również jako miernik napięcia właśnie :). Pomiędzy wskazywaniem napięcia, a temperatury używa się przełącznika w postaci przycisku reset, który służy również do włączania i wyłączania urządzenia. W programie udało się zmieścić funkcję auto off po ustalonym czasie, niestety na auto on w pierwotnej wersji programu już nie starczyło miejsca, więc byłem zmuszony upośledzić procedury obsługi I2C pozbawiając je opóźnień, ale warto było, ponieważ automatyczne włączanie termometru to bardzo fajna sprawa (Bez opóźnień program dla szybkości 4MHz generuje około 100kHz na linii CLK więc komunikacja przebiega mimo wszystko bezproblemowo). Jeżeli napięcie z którejś termopary przekroczy ~50C (lub opcjonalnie wystąpi temperatura ujemna) program procesora wychodzi z trybu drzemki i włącza się normalne wyświetlanie temperatury na wyświetlaczu. Każde przekroczenie progu włączenia resetuje timer auto off. Urządzenie w trybie oczekiwania na włączenie przyciskiem lub progiem temperatury, jak obliczyłem w przybliżeniu pobiera 70uA. Temperatura jest sprawdzana w odstępach 8sekundowych (najdłuższy czas WDT). Kolejny element to LM75 którego jedynym zadaniem jest pomiar temperatury otoczenia (zimnego końca) którą w trybie termometru jest dodawana do odczytanej z termopar (pomijam dalej w opisie kwestię samonagrzewania podczas pomiarów, ale można ten błąd skompensować w programie). Na koniec pozostaje ADS1112 który dostarcza informacje o napięciu z 3 portów. Na początku myślałem, że wykorzystam wszystkie 3, niestety okazało się, że jedno wyprowadzenie musiało zostać zużyte do „pomiaru napięcia GND” w celu kompensacji offsetu przetwornika.
    Teraz tylko pozostało upchnąć obsługę tego 'skomplikowanego' sprzętu w 1kB pamięci procesora, i można cieszyć się termometrem którego baterię będziemy ładować raczej nie częściej niż 1 raz w miesiącu, bo dzięki możliwości zmiany CLKPR w procesorze i działaniu z 0.5MHz prędkością cały termometr pobiera około 1.3mA prądu co jest wartością całkiem niezłą. W razie potrzeby szybszego wyświetlania (około 4 x większa częstotliwość odświeżania pomiarów), można zmodyfikować jeden parametr w programie i procesor będzie taktowany 4MHz (podniesie to pobór prądu do około 3.5mA).
    Jest to pierwszy mój projekt na TTINY13 w którym na zakończenie pozostały prawie dwa niewykorzystane porty, a to za sprawą I2C która 'pociągła' wszystkie potrzebne peryferia. ADC procesora zostało użyte do pomiaru napięcia zasilania sygnalizowanego zmianą ikony baterii.
    Można było rozdzielić włączanie LDO i przetwornicy napięcia ujemnego, co przełożyłoby się na oszczędność prądu, jednak wymagało by to znowu dodatkowej pamięci programu a tej w przypadku tego projektu dało się odczuć mocny jej brak ;) .

    Kalibracja:

    Ogromną zaletą prezentowanego rozwiązania jest kalibracja programowa, która polega jedynie na zapisaniu odpowiednich współczynników podziału wartości odczytywanych przez przetworniki.
    Pierwszym krokiem jest ustawienie termometru w tryb pomiary napięcia, i takie dobranie stałej 'divcoeVOLT' aby napięcie wyświetlane zgadzało się co do wartości z doprowadzonym wzorcem napięcia. Należy pamiętać o największej wadzie ADS1112 jaką jest dość niska impedancja wejściowa. W przypadku Gain x8 wynosi ona około 1M ohm dla napięcia stałego. Po zestrojeniu woltomierza następnym krokiem jest dobranie współczynnika 'wzmocnienia' dla pomiaru temperatury 'divcoeTemp'. Jak wiadomo dla Termopary typu K napięcie z każdym stopniem wzrasta o mniej więcej 41uV w całym zakresie mierzonych temperatur. Ja dokonałem korekty tego współczynnika posiłkując się tablicą w której podane jest napięcie w funkcji temperatury. Na samym końcu należy dokonać przeskalowania temperatury mierzonej przez LM75 która aby mogła zostać zsumowana z surowymi wartościami napięcia z ADC, musi zostać doprowadzona do skali odpowiadającej napięciu z ADC. Mówiąc prościej trzeba o tyle podzielić wartość z LM75 o ile zostanie później pomnożona w momencie przeskalowywania surowego napięcia z ADC do stopni C. Ja zrobiłem to podstawiając za temperaturę z LM75 stałą wartosć np. 100 i korygując tak współczynnik 'divcoe1' aby dla zerowego napięcia z termopar uzyskać prawidłowe wskazanie temperatury. Na tym proces kalibracji można by uznać za zakończony gdyby nie fakt, że jeżeli użyjemy „wersji uproszczonej” wtyczki termopary (BLS+goldpiny), tak jak nie powinno się tego robić to może powstać dodatkowe termoogniwo które można skompensować, w tym celu w programie jest jeszcze jeden parametr 'Verroroffset' którego należy użyć w przypadku problemu z 'zerem'. Należy pamiętać, że przetwornik w konfiguracji jak na schemacie powinien mierzyć tylko napięcia dodatnie (w praktyce mierzy również ujemne, po umieszczeniu w zamrażarce termopary wskazania wynosiły -20C z dokładnością do kilku stopni).
    Podsumowując, urządzenie umożliwia pomiar temperatury z dwóch termopar równocześnie od co najmniej -200C do +999C, oraz w trybie woltomierza pomiar napięcia od -256mV do +256mV, przy czym pomiar ujemnej (względem zimnego końca) temperatury lub napięcia jest obarczony błędem, przykładowo +24.95mV po odwróceniu = -25.05mV 150mv = -150.9mV, jak przypuszczam ma to również związek ze zmianą impedancji wejściowej przetwornika. Po 'regulacji' błąd wzmocnienia między ads1112 a sanwa5000 w całym zakresie napięć dodatnich wydaje się nie być większy niż 30uV. W przypadku używania układu jako miliwoltomierza należy pamiętać o jego bardzo niskiej impedancji wejściowej.

    Bonus:
    Na zakończenie prac z termomierzem, postanowiłem sprawdzić, jak wyglądało by napisanie czegoś w rodzaju oscyloskopu, bo trudno nazwać oscyloskopem rysowanie wykresu funkcji w tak oszałamiającym tempie ;) na dodatek bez wyzwalania i z „pływającą” podstawą czasu. Jak widać na filmach po przełączeniu przetwornika w tryb ~200Sa/s można sobie zobrazować częstotliwość do około 20Hz. Pierwszy film pokazuje pracę procesora z prędkością 0.5MHz i częstotliwość sygnału to ~5Hz, jak widać obraz odświeża się z częstotliwością mniej więcej 1Hz (Bitmapa na początku programu jest ładowana przy prędkości procesora 4MHz). Na drugim filmie rysowanie jest już 8x szybsze, więc dopiero pod koniec widać wyraźniej trójkąt o częstotliwości 30Hz, ale jest „zeschodkowany” ze względu na ograniczoną prędkość ADS1112.





    soft_asm.zip zawiera programy termometru i 'oscyloskopu' w asemblerze oraz wsad do eeprom.
    LPH7653.zip zawiera opis wyświetlacza mojego autorstwa znajduje się tam min rozrysowany schemat elementów na PCB, prądy i napięcia sterujące, opis formatu danych.
    Reszta załączników to ogólnodostępne noty w pdf oraz tablica napięć dla termopary typu K.


    bobeer napisał:
    Zapomniałem napisać kosztów, mniej więcej ceny są takie:
    tiny13 3zł
    24C64 1zł ? (nigdy tego nie kupuje pełno wszędzdie tych pamięci)
    LM75 ~3zł
    ADS1112 ? (niemam pojęcia za ile i gdzie to można dzisiaj trafić ja miałem z sampli)
    LCD 12zł
    Reszta drobnicy to powiedzmy 3zł
    W sumie wyszło dwadzieściapare.


    Fajne!
  • Semicon
  • #2 23 Maj 2013 18:57
    Neverhood
    Poziom 16  

    Pod jaką nazwą marketingową(telefon?) można znaleźć ten wyświetlacz lcd LPH7653?

  • Semicon
  • #4 24 Maj 2013 10:03
    Trabi
    Poziom 36  

    Ciekawe, małe i poręczne - to na plus.
    Na minus - ta płytka drukowana i połączenia gołymi drucikami :(. Nie boisz się zwarć?

    Schemat mało czytelny (czarny); bardziej czytelny jest taki: :)

    Termometr na ATTiny13

  • #6 25 Maj 2013 19:51
    Mariano5
    Poziom 11  

    Witam.
    Niby ciekawy pomysł, ale co do termometru to delikatna przesada. (rozdzielczość wbudowanego przetwornika ADC w zupełności wystarcza)

    Takie rozwiązania są dobre np. w urządzeniach rejestrujących sygnał audio, bądź w oscyloskopach.
    W twoim przypadku to niestety nie jest ani rejestrator, ani oscyloskop. (po co przetwornik o takiej rozdzielczości do rejestracji temperatury?. Tego nawet nie zastosujesz w laboratorium chemicznym, bo brakuje tu pewnych funkcji. W sumie mogło by się to nadawać do określania odchyłek termoelementów, bądź czujników ale i tu potrzeba sporych udoskonaleń)

  • #7 25 Maj 2013 20:17
    bobeer
    Poziom 28  

    Dziękuję za słowa krytyki, ale kolega najwyraźniej nie zrozumiał idei tego projektu oraz zastosowania zewnętrznego przetwornika AD ze wzmacniaczem. Wystarczy spróbować zmierzyć napięcie termopar bezpośrednio przetwornikiem wbudowanym w ATTINY13 żeby zrozumieć, że nie chodzi tutaj o rozdzielczość tylko o czułość. 16 bitowa rozdzielczość przy 8x wzmocnieniu daje możliwość rezygnacji z dodatkowego wzmacniacza i oto przede wszystkim chodzi. Żeby lepiej wykorzystać możliwości przetwornika AD można korzystać z urządzenia w trybie miliwoltomierza. Nie jest to przyrząd laboratoryjny, nie pod takim kątem został zaprojektowany.