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ł:
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++
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:
Sukces, odczyt działa:
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:
Znaczenia poszczególnych odczytanych bitów obrazują tabelki:
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:
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++
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++
Zostaje tylko wyłuskać pomiary...
Kod: C / C++
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:
Załączam plik z obrazka do zabawy, do otwarcia w PulseView:
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ę.
