logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak uruchomić pomiar temperatury termoparą i kontrolerem MAX31855 z Arduino? Protokół komunikacji

p.kaczmarek2 28 Paź 2024 22:59 987 0
  • Moduł Arduino UNO z podłączonym adapterem i przewodami.
    Pokażę tu jak łatwo uruchomić MAX31855 z Arduino a potem omówię jego protokół komunikacji. MAX31855 oferuje 14-bitowy pomiar temperatury z zakresu zależnego od użytej sondy, od -270°C aż do 1800°C. MAX31855 oferuje prosty protokół komunikacji oparty o SPI, zasadniczo odczytujemy z niego tylko jedno słowo 32-bitowe, co pozwała na jego łatwą implementację na mikrokontrolerze. Pracuje on na napięciu 3.3V, choć niektóre dostępne z nim modułu mogą ruszyć i na 5V dzięki dostępnemu na pokładzie LDO.
    Cały zestaw (moduł + termopara typu K + złącza) można kupić w naszym kraju za około 35 zł:
    Moduł MAX31855 z termoparą typu K i złączem.
    Powyższy zestaw z termoparą typu K oferuje pomiar od -200°C do 850°C.

    Uruchomienie z Arduino
    Nie każdy ma wiedzę i czas by bawić się w uruchamianie układów od 0. Czasem wystarczy użyć Arduino. Do MAX31855 w sieci dostępnych jest kilka bibliotek, ale chyba najłatwiej uruchomić jest tą od enjoyneering:
    https://github.com/enjoyneering/MAX31855
    Działa ona na platformach:
    - Arduino AVR
    - Arduino ESP8266
    - Arduino ESP32
    - Arduino STM32
    Wspierane jest zarówno sprzętowe SPI (tu moim zdaniem zbędne), jak i programowe.
    Przykładowy kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Piny uzupełniamy w konstruktorze: MAX31855soft(cs, so, sck)
    Kod sprawdza czy MAX jest wykryty, w razie ewentualnych błędów z podłączeniem próbuje je wykryć, a potem dokonuje odczytu wspomnianego 32-bitowego słowa i je dekoduje.
    Po więcej przykładów należy zajrzeć tutaj: https://github.com/enjoyneering/MAX31855/tree/master/examples
    Moduł zasiliłem z 3.3V.
    Wgrywamy:
    Arduino UNO połączone z modułem MAX31855K i termoparą na niebieskiej macie.
    Sukces, odczyt działa:
    Zrzut ekranu z monitora szeregowego Arduino przedstawiający komunikaty błędów i odczyty.

    Uruchomienie na własnej platformie
    MAX31855 korzysta z SPI do komunikacji, ale w tym przypadku całość komunikacji zamyka się w jednym odczycie 32-bitowego słowa. Nie ma dodatkowych rejestrów, ustawień, itd. Wszystko jest bardzo proste. Ilustrują to dobrze rysunki "Serial-Interface Protocol" i "Serial-Interface Timing" z nowy katalogowej:
    Schemat protokołu komunikacji szeregowej SPI dla MAX31855 z wykresami sygnałów.
    Znaczenia poszczególnych odczytanych bitów obrazują tabelki:
    Schemat mapy pamięci dla MAX31855
    Mamy tu przede wszystkim 14-bitowy pomiar temperatury, dodatkowo 12-bitowy pomiar temperatury złącza odniesienia, dodatkowo mamy bit błędu (Fault) który jest niezerowy gdy jest wykryty któryś z problemów opisywanych kolejnymi bitami SCV, SCG, i OC, które kolejno oznaczają zwarcie do Vcc, do GND, oraz brak podłączenia czujnika. Dwa ostatnie brakujące bity są zarezerwowane i nie są używane w tej chwili, zwracają zawsze 0.
    Teraz pytanie jak są zakodowane wartości temperatur - wyjaśniają to dwie kolejne tabelki:
    Tabela formatu danych temperatur dla termopary i złącza odniesienia.
    Obie wartości to liczby całkowite (ze znakiem, typ signed), pierwsza jest 14-bitowa, druga 12-bitowa. Aby uzyskać wartości temperatury w stopniach, pierwszą mnożymy przez 0.25, drugą przez 0.0625.
    Rozważmy zatem przykładową transakcję SPI wykonaną programowo. Kod z biblioteki enjoyneering (uproszczony):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tak jak na ilustracji komunikacji w nocie katalogowej - najpierw ustawiamy CS na stan niski, a potem wykonujemy cykle zegara i odczytujemy dane. Dane odczytujemy po zboczu rosnącym zegara (po zamianie ze stanu niskiego na wysoki). Kolejno dopisujemy bity do odczytanego słowa, tak 32 razy. Potem ustawiamy CS na stan wysoki, zakańczamy transakcję.
    Teraz trzeba jeszcze wyłuskać odpowiednie informacje z tego 32-bitowego słowa co mamy.
    Poszczególne bity raczej wiemy jak sprawdzić - makro bitRead, jeśli nie mamy go u siebie, to oto ono:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zostaje tylko wyłuskać pomiary...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wystarczy przesunięcie bitowe, przy czym dla bitów [15:4] dodatkowo wykonujemy operację AND z 0xFFFF by zgasić bity [31:16], inaczej nawet po przesunięciu by nam bruździły...
    Zasadniczo to tyle - w ten sposób możemy zaprogramować MAX31855 na naszej platformie!

    Przykłady komunikacji przechwycone analizatorem logicznym
    Przy okazji troszkę pobawiliśmy się analizatorem, był już on prezentowany w temacie:
    Analizator stanów logicznych Salae 24MHz za 40 zł - analiza nieznanego protokołu wyświetlacza LED
    Dzięki dekoderowi SPI można podejrzeć jak wyglądają poszczególne bajty:
    Zrzut ekranu z programu PulseView pokazujący przechwycenie danych z interfejsu SPI.
    Załączam plik z obrazka do zabawy, do otwarcia w PulseView:
    MAX on ard...apture.zip Download (1016 bajtów)
    W ramach ćwiczenia możecie spróbować sobie samodzielnie zdekodować pomiar z załączonego pliku. Jaka jest tam temperatura?

    Podsumowanie
    Bardzo prosty w użyciu czujnik. Można go szybko uruchomić z Arduino, albo po prostu napisać jego obsługę samodzielnie, nie jest skomplikowana. Niestety zdaje się być nieco mniej dostępny i popularny niż 12-bitowy MAX6675, który też już opisywałem:
    Pomiar wysokich temperatur - termopara z MAX6675 - podłączenie i protokół komunikacji
    Zależy co potrzebujemy i jaki zakres temperatur nas interesuje.
    Czy macie jakieś doświadczenia z pomiarami wysokich temperatur? A jeśli tak, to jakiego układu do tego używaliście?
    PS: Testy były realizowane z kolegą @ DeDaMrAz , dziękuję za użyczenie sprzętu/fotek.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
REKLAMA