niedziela, 6 maja 2018

MCP9808 - cyfrowy czujnik temperatury, zajęcia praktyczne .

Biblioteka I2C do PIC32MM przygotowana. Jesteśmy zatem gotowi do poznania od strony praktycznej milutkiego cyfrowego czujnika temperatury MCP9808.
Czujnik ten ma sporo funkcjonalności jak na takie maleństwo i jest bardzo prosty w implementacji. Nie sprawił mi żadnych problemów przy uruchomieniu. Wszystko zaskoczyło od przysłowiowego pierwszego strzała. W sumie sam byłem zdziwiony , że tak łatwo poszło. Do uruchomienia czujnika MCP9808 posłużyłem się moją autorską płytką developerską dla PIC32MM.
Czujnik został osadzony na mini płytce-rozszerzeniu wpiętej w złącze PICbus, w które jest wyposażona moja płytka developerska . Mamy zatem kompletny modularny system do badania różnych komponentów z udziałem uroczego 32-bitowego MCU PIC32MM firmy Microchip.

Ogromną zaletą tego MCU jest jego prostota przy stosunkowo dużej wydajności rdzenia. Jak na razie jestem bardzo zadowolony z poznania tego MCU. Obcowanie z nim to po prostu czysta przyjemność i tyle. Warto wspomnieć , że seria PIC32MM jako jedyna z 32-bitowców PIC-a jest wspierana przez MCC (MPLAB Code Configurator) co znacząco przyspiesza poznanie obsługi i konfigurowania peryferiów tego MCU, szczególnie przez osoby zaczynające zabawę z PIC32. Dlatego jest to MCU , który z czystym sumieniem polecam początkującym, chcącym wejść w świat 32-bitów w sposób beztresowy i przyjemny.
Poniżej zdjęcie mojej sympatycznej i funkcjonalnej płyteczki z podpiętym modułem PICbus, zawierającym m.in czujnik MCP9808, moduł CAN MCP2517FD i transciver.


Czujnikiem MCP9808 zmierzymy poprawnie temperaturę w zakresie -20 do +100 °C czyli na biegunie południowym obok stacji Rosyjskiej z nim nie zawalczymy bo tam -89 °C bywało. Mamy do dyspozycji jedno programowalne wyjście do sygnalizowania różnych zdarzeń związanych z przekroczeniem wartości progowych temperatur takich jak Tupper, , Tlower, i Tcrit.
Mamy możliwość ustawiania histerezy  w zakresie : 0°C, +1.5°C, +3°C ,+6°C
co razem z wyjściem do eventów umożliwia nam zbudowanie regulatora temperatury w pomieszczeniach czy termostatu.

Rozdzielczość i czasy konwersji :
 +0.5°C (tCONV= 30 ms)
 +0.25°C (tCONV= 65 ms)
 +0.125°C (tCONV= 130 ms)
 +0.0625°C (power-up default, tCONV= 250 ms)

Warto wspomnieć , że w odróżnieniu od np czujnika DS18B20, nie musimy zawracać sobie głowy zmuszaniem czujnika do konwersji poprzez dodatkowe sygnały startu konwersji. Konwersja jest robiona w tle automatycznie w trybie kontynuacji (ale możemy to zmienić). Musimy tylko pamiętać, że kolejny pomiar dostępny w rejestrze AMBIENT TEMPERATURE REGISTER jest gotowy po czasie zależnym od ustawionej rozdzielczości. Po resecie mamy rozdzielczość na poziomie +0.0625°C, czyli odczyt temperatury musimy zorganizować po czasie >=250ms tylko bez żadnych delay-i :)

Schemat podłączenia czujnika : 


Zwracam uwagę na istotny szczegół, który przeoczyłem w  procesie projektowania płytki do MCP9808. Ten szczegół prezentuje rysunek poniżej.


Pod czujnikiem musimy zrobić tzw. termal pad, który podłączamy do masy. Zalecam grzecznie zastosować się do tej sugestii i do tego rozkładu ścieżek. Jeśli w konstrukcji płytki nie uwzględnimy termal pad-a, możemy się spodziewać tendencji do zawyżania wyniku temperatury, na szczęście jest to stabilny parametr , który można wyeliminować programowo.

Linie adresowe podłączone do masy, co implikuje nam ustawienie trzech najmłodszych bitów na "0" . Adres czujnika ustalamy zgodnie z poniższym rysunkiem (pierwszy wiersz w tabeli):


Tylko tu zwracam uwagę na jeden myk. Z rysunku powyżej wynika wprost , że wartość adresu to 0x18 ale w procesie formowania do wysyłki po I2C pełnego bajtu adresu z bitem R/W, musimy przesunąć ten 7-bitowy adres w lewo o jeden bit. Co daje nam adres 0x30. Wspominam o tym, żeby nie drapać się potem w głowę skąd w programie adres 0x30 jak z wykresu powyżej jest jak w mordeczkę strzelił 0x18.

Teraz zerknijmy jak wygląda struktura zapisu do rejestrów MCP9808.




Pierwszy bajt standardowo adres urządzenia z bitem R/W. Kolejny bajt opisany jako Configuration Pointer jest wskaźnikiem rejestru z którym będziemy gadać. Ponieważ rejestry w MCP980816-bitowe stąd kolejne dwa bajty opisane jako MSB data i LSB data reprezentują strukturę wybranego  rejestru.
W sumie nie wygląda to groźnie.

Poniżej widzimy jak wygląda bajt Configuration Pointer w szczególe i co trzeba ustawić w nim aby wskazywał na konkretny rejestr, przy okazji widać jakie mamy do dyspozycji ogólnie rejestry :



W sumie najważniejszym rejestrem jest rejestr Temperature register (TA) inaczej AMBIENT TEMPERATURE REGISTER aby się do niego dostać musimy Configuration Pointer ustawić na wartość 0b00000101 (hex 0x5)

Rejestr z którego odczytujemy temperaturę i jej znak wygląda jak poniżej :


Trochę dziwacznie wygląda zawartość rejestru jakieś potęgi ?? Jak z tego wydumać temperaturę ??.Żeby głowa nas za mocno nie rozbolała producent podał jak na tacy wzór z którego wyliczymy temperaturę i wygląda on jak poniżej :


Jedyne co musimy zatem zrobić to odczytać dwa bajty UpperByte i LowerByte  z rejestru AMBIENT TEMPERATURE REGISTER i zastosować się do powyższego wzoru. Zapewniam jednak, że  jak nie pomyślimy nad prawidłowym oznaczeniem typu zmiennych we wzorze to nam głupoty wyjdą na bank. Prawidłowa postać będzie pokazana w programie, ale tu zasygnalizuję , że UpperByte i LowerByte trzeba zrzutować jawnie do typu float !!!!!!
Jeśli ktoś się boi typu float a baliśmy się tego jak ognia w MCU 8 bitowych, to w 32-bitowcach możemy zapomnieć o tego typu ograniczeniach.

Przyjrzyjmy się zatem jak wygląda odczyt temperatury z rejestru :

Na początku standardowo wysyłamy adres urządzenia z bitem R/W ustawionym na 0. Kolejny bajt to wskaźnik(adres) rejestru , wskazuje nam na adres rejestru AMBIENT TEMPERATURE REGISTER. Następnie robimy restart transmisji czyli ponownie wysyłamy adres urządzenia ale tym razem z bitem R/W ustawionym na 1. Następnie odczytujemy w kolejnych dwóch bajtach UpperByte , LowerByte i kończymy transmisję.
Możemy odczytane dwa bajty podstawić do wzoru i otrzymamy ładnie temperaturę .

Nie będę tutaj opisywał wszystkich dostępnych rejestrów bo skupiłem się tylko na najistotniejszych sprawach, resztę informacji możemy sobie doczytać w datasheet (link poniżej artykułu), które jest bardzo przyjazne i z licznymi przykładami. Dokumentacja to jest mocna strona tego czujnika.

Na koniec zrzut z analizatora stanów logicznych dla przykładowej paczki danych z odczytu temperatury w komunikacji z MCP9808.




Zwieńczeniem artykułu będzie kod zamieszczony na GITHubie dla MCU PIC32MM. Kod będzie dostępny w postaci gotowego projektu dla MPLAB IDE czyli jedynego słusznego środowiska dla MCU Microchipa.

Cały proces, komunikacji , pobierania i wyświetlania  temperatury z rejestru MCP9808 zamieściłem w jednej funkcji read_Temp(). Funkcja jest wywoływana cyklicznie co 250 ms za pomocą timera programowego TMR2.
Do wygenerowania ustawień TMR2 i zegara systemowego 24 MHz użyłem wtyczki do MPLAB IDE - MCC, jest to bardzo wygodne i szybkie. Ale proponuję używać tego typu narzędzi wtedy kiedy jesteśmy świadomi co , gdzie , jak i dlaczego :)


Pozdrawiam
picmajster.blog@gmail.com



Linki :

MCP9808 - strona produktu 

MCP9808 - datasheet 

PIC32MM - MCP9808 Library on GITHub

7 komentarzy:

  1. Witaj Picmajster z góry chwalę twojego bloga z tego co widzę jedyny w Polsce zapowiadający się ciekawie o architekturze Pic32 jak i samych Picach tylko jest jedno ale ;-) wciąż czekam na kontynuację podstaw " PIC32MM - I/O podstawy " a tu już I2C ,chętnie bym powielił twój projekt MCP9808 jednak trochę pogubiłem się w konfiguracjach

    OdpowiedzUsuń
  2. Witaj
    Dziękuję za ciepłe słowa, cieszę się , że moja amatorska dłubanina komuś się podoba bo to zawsze stanowi dodatkową motywację do działania . Edukacja w zakresie MCU idzie u mnie szybko naprzód, dlatego rzeczy proste zaczynam pomijać (omijać) lub traktować po łebkach, bo uważam je jako oczywista oczywistość, stąd takie przeskoki od mrugania LED do I2C :). Uważam , że najszybszą drogą do poznanie czegoś jest dotknięcie , pomacanie , praktyka, tak jak niemowlak poznaje świat :) . Ja obecnie przyjąłem taką idee , najpierw kupuję element potem robię dla niego wygodne stanowisko w postaci płytki-modułu a na końcu czytam dokumentację i dostępne informacje. Dla wielu pewnie od tyłka strony kolejność :) Ale ja się w takiej formule bardzo dobrze czuję.
    Oczywiście pewnie trafię kiedyś na element na którym połamię zęby lub się zatnę :) ale na razie odpukać się nie zdarzyło :)
    Dobra teraz konkretnie i na temat :) Odnośnie PIC32MM , służę Szanownemu Koledze moją płytką developerską i płytką PICBus pod MCP9808 za całkowicie darmo :) Do płytek dodaję pełne wsparcie merytoryczne czyli poprowadzenie za rączkę od lutowania do programowania :)
    Czemu to robię ?, jeśli jest szansa , że ktoś poczucje taki sam wiatr w żagle jak ja to czemu mam zachować to tylko dla siebie, radością trzeba dzielić się z innymi bo tylko wtedy można ją w pełni przeżyć :). Alternatywą dla mojej amatorskiej płytki dla PIC32MM jest gotowy produkt Microchipa http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=DM320107 koszt ok 22 EUR + przesyłka. Czasami zdarzają się promocje w Microchipie na np. upust 20 % .Jeśli masz jakiś niedosyt odnośnie podstaw PIC32MM to proszę napisz czego ci brakuje, jeśli będzie to w zasięgu mojej percepcji poznawczej to chętnie napiszę artykuł lub po prostu pomogę w stawianiu pierszych kroków. Zważ tylko , że ja sam przecieram szlak związany z PIC32 i wszystko odkrywam za pomocą własnej pracy organicznej :)
    Odnośnie MCP9808 do startu nie jest potrzebna żadna konfiguracja , włączasz zasilanie i działa :) Czyli pierw się delektujesz działaniem a potem dumasz nad ewentualną dodatkową konfiguracją :)
    Muszę tylko nadmienić, że moja płytka MCP9808 nie jest optymalnie zaprojektowana , nie uwzględnia termal pada i rozkładu ścieżek zgodnie z datasheet. W płytce z transciverem Si4432 poprawię ten aspekt.

    Pozdrawiam
    PICmajster

    OdpowiedzUsuń
  3. Witaj, chętnie bym nawet odkupił od ciebie płytki (bowiem szanuję czyjąś pracę), jak byś je wrzucił na popularne serwisy aukcyjne jestem pierwszy, podaj tylko link lub inne możliwości zakupu. Obecnie dysponuję już programatorem pickitem 4 i zestawem dm240313 ,MCP9808 w "surowej formie", też posiadam jak i również pica32, tylko brak mi właśnie płytek . Jako tako podstawy 8 bitowców ogarnąłem ale coraz bardziej fascynują mnie
    32-dwójki, lubię je za ich inność w stosunku do popularnych armów . Materiały dydaktyczne jak najbardziej pożądane i jeszcze lepiej na Twoim blogu w formie kursów, myślę, że nie tylko ja jestem zainteresowany pikami więc czekamy ....
    Pozdrawiam
    Piotr

    OdpowiedzUsuń
  4. Odnośnie konfiguracji w projekcie MCP9808 to można sobie podejrzeć jak ustawiony zegar, piny i timer w MCC i skonfrontować to z kodem. W projekcie jest zakładka Important Files, jak wejdziesz w nią to tam jest plik wygenerowany przez MCC o nazwie MyConfig1.mc3, klikasz w niego i otwiera się MCC (jeśli masz zainstalowaną wtyczkę MCC w MPLAB X IDE). Jeśli masz tutaj problemy ze zrozumieniem czegoś to służę pomocą. Odnośnie płytek to oferowałem je tobie z free więc niech tak pozostanie. Ale w szczegółach jeśli masz ochotę to przenieśmy tę rozmowę na majla picmajster.blog@gmail.com .

    Pozdrawiam
    PICmajster

    OdpowiedzUsuń
  5. I absolutely love your blog and find many of your post's
    to be precisely what I'm looking for. can you
    offer guest writers to write content to suit your needs?
    I wouldn't mind publishing a post or elaborating on a number of the subjects you write concerning here.
    Again, awesome site!

    OdpowiedzUsuń
  6. For me, a blogspot is enough, everything is intuitive and simple.

    OdpowiedzUsuń
  7. Hi it's me, I am also visiting this web page on a regular basis, this site is actually fastidious and the users are
    really sharing pleasant thoughts.

    OdpowiedzUsuń