Czujnik jest produkowany przez kilku różnych producentów pod taką samą nazwą, chociaż firma ST dodaje swój prefiks i oznaczenie ma postać STLM75. Bez względu na wytwórcę, funkcje i główne parametry są bardzo podobne:
- zakres mierzonych temperatur: –55…+125°C,
- rozdzielczość: 0,5°C,
- dokładność pomiarów: nie gorsza niż ±2°C w zakresie –25…+100°C i ±3°C w zakresie –50…+125°C,
- komunikacja: magistrala I2C z zegarem taktowanym 400 kHz,
- czas pomiaru: od 100 do 300 ms, typowo 150 ms,
- napięcie zasilania: 3…5,5 V, STLM75 od 2,7 V,
- typowy pobór prądu: 250 mA, STLM75 125 μA.
Czujniki zazwyczaj występują w różnych wariantach obudowy SO-8, rozłożenie poszczególnych wyprowadzeń jest opisane na rysunku 1.
Wyprowadzenia czujnika pełnią następujące funkcje:
- VDD, GND – zasilanie,
- SDA, SCL – linie zegarowa i danych magistrali I2C,
- A0, A1, A2 – linie określające adres czujnika w obrębie magistrali. Możliwe jest dołączenie do 8 czujników LM75 do jednej magistrali, jeżeli każdy będzie miał ustawiony inny adres.
- OS/INT – linia pełniąca rolę wyjścia sterującego termostatu lub wyjścia na którym generowane są impulsy przerwań. Wyjście typu otwarty dren, wymaga podciągania do napięcia zasilania zewnętrznym opornikiem.
Budowa wewnętrzna i funkcje wyprowadzeń
Na rysunku 2 pokazano wewnętrzną strukturę czujnika. Napięcie z wyjścia sensora temperatury poddawane jest zamianie na wartość cyfrową w przetworniku ADC. Wynik konwersji zapisywany jest w rejestrze Temperature Register.
Wartość może być odczytywana poprzez magistralę I2C, a jednocześnie jest porównywana z ustawieniami rejestrów TOS i THYS, które odpowiadają za funkcje termostatu i sterowanie wyprowadzeniem OS. Wartości tych rejestrów można odczytywać i modyfikować również za pośrednictwem magistrali I2C. Na rysunku 3 pokazano jak będzie się zmieniał stan wyjścia OS, pracującego w trybie komparatora (wyjścia termostatu) lub wyjścia przerwania, w zależności od ustawień rejestrów i aktualnej temperatury.
Komunikacja
Adresem bazowym układu jest 0x48 (w notacji 7 bitowej nie uwzględniając bitu sterującego zapisem/odczytem). Jest to sytuacja gdy wyprowadzenia A2...A0 są zwarte do masy. Stan tych wyprowadzeń wpływa na 3 najmłodsze bity adresu układu w ramach magistrali I2C. Stosując różne kombinacje ustawień można do tej samej magistrali podłączyć nawet 8 czujników.
Czujnik LM75 pozwala na dostęp do 4 wewnętrznych rejestrów. Przed odczytem lub zapisem wybranego rejestru, trzeba podać jego adres ustawiając dodatkowy rejestr wskaźnikowy. Za wybór adresu odpowiadają dwa najmłodsze bity rejestru wskaźnikowego P1, P0. Możliwe są następujące ustawienia bitów:
- 00 – wybór Rejestru Temperatury,
- 01 – wybór Rejestru Konfiguracyjnego,
- 10 – wybór Rejestru Histerezy,
- 11 – wybór Rejestru Załączania wyprowadzenia OS.
Pozostałe bity P7...P2 powinny być wyzerowane. Po zapisie do rejestru wskaźnikowego możliwy jest odczyt lub zapis do wybranego rejestru.
Rejestr Konfiguracyjny ma rozmiar jednego bajta, jego wartość można odczytywać i zapisywać, znaczenie poszczególnych bitów jest następujące:
- D4...D3 – określają długości serii kolejnych pomiarów temperatury wykorzystywanych do porównań w trybie termostatu:
- 00 – 1 pomiar,
- 01 – 2 pomiary,
- 10 – 4 pomiary,
- 11 – 6 pomiarów.
- D2 – bit określający poziom aktywny wyjścia OS w trybie termostatu:
- 0 – po przekroczeniu wartości załączania aktywny jest poziom niski,
- 1 – poziomem aktywnym jest poziom wysoki.
- D1 – bit przełączający tryb pracy wyjścia OS:
- 0 – tryb komparatora (termostatu),
- 1 – tryb generacji impulsu przerwania, działanie pokazano na rysunku 3.
- D0 – włączanie trybu uśpienia:
- 0 – normalna praca,
- 1 – tryb uśpienia.
Rejestr Załączania określa próg załączenia wyjścia OS, a jego działanie pokazano na rysunku 3. Jest rejestrem 2 bajtowym, temperatura przełączania, podobnie jak w przypadku Rejestru Temperatury, zapisywana w kodzie uzupełnienia do 2 z użyciem bitów D15...D7.
Rejestr Histerezy określa próg wyłączenia wyjścia OS gdy mierzona temperatura opadnie poniżej ustawionej wartości. Jest rejestrem 2 bajtowym a zapis temperatury wyłączenia zapisuje się przy użyciu bitów D15...D7 w kodzie uzupełnienia do 2.
Konwersja temperatury na wartość dziesiętną
Odczyt i zapis rejestrów za pomocą magistrali I2C przebiega w standardowy sposób. Na Listingu 1 pokazana jest funkcja konwersji temperatury na wartość typu float z odczytanych 2 bajtów rejestru.
char Konwersja_odczyt_temp(char *p_buf, float *p_temp) {
uint16_t liczba;
float temp;
liczba =*p_buf <<1;
if ((*(p_buf+1) & 0x80) !=0) liczba =liczba+1;
if ((liczba & 0x100) !=0) {
//temperatura ujemna
liczba =(~liczba &0xff)+1;
temp =liczba;
temp =0 -temp;
}
else temp =liczba;
temp =temp /2;
//sprawdzanie czy odczytana temperatura
//mieści się w dopuszczalnym zakresie
if (temp<TEMP_MIN || temp>TEMP_MAX) return false;
*p_temp =temp;
return true;
}
Parametrami funkcji są 2 wskaźniki: char *p_buf wskazujący na bufor ze starszym i młodszym bajtem temperatury i float *p_temp wskazujący na bufor przeznaczony na wartość otrzymaną po konwersji. Stałe TEMP_MIN i TEMP_MAX służą do sprawdzania czy otrzymany po konwersji wynik mieści się w dopuszczalnym zakresie. Jeżeli wszystko się zgadza funkcja zwraca wartość true.
Listing 2 pokazuje sytuację odwrotną, gdy wartość umieszczona w buforze wskazywanym przez float *p_temp ma zostać zamieniona na 2 bajty temperatury w formacie dopełnienia do 2. Także tutaj, najpierw sprawdzane jest czy temperatura do konwersji mieści się w dopuszczalnym zakresie. Jeżeli wszystko się zgadza następuje zamiana temperatury na 2 bajty umieszczane w buforze wskazywanym przez char *p_buf.
char Konwersja_zapis_temp(char *p_buf, float *p_temp) {
float temp;
char temperatura_ujemna;
uint16_t temp_16;
char ulamek_05;
temp =*p_temp;
//sprawdzanie czy temperatura do konwersji
//mieści się w dopuszczalnym zakresie
if (temp<TEMP_MIN || temp>TEMP_MAX) return false;
if (temp<0) {
temperatura_ujemna =true;
temp =0 - temp;//zmiana na wartość absolutną
}
else temperatura_ujemna =false;
temp_16 =temp; //temperatura w stopniach
if ((temp-temp_16)>=0.5) ulamek_05 =true;
else ulamek_05 =false;
temp_16 =temp_16<<1;//temperatura w 0,5 stopnia
if (ulamek_05 ==true) temp_16++;
if (temperatura_ujemna ==true) {
temp_16 =~temp_16 +1;
}
temp_16 =temp_16 & 0x1ff;
//formowanie 2 bajtów w dopełnieniu do 2
temp_16 =(temp_16<<7);
*p_buf =(temp_16>>8);//H bajt
*(p_buf+1) =0xff & temp_16;
return true;
}
Aplikacja testowa
Dla badania czujnika LM75, została zbudowana aplikacja testowa działająca jak termometr z funkcją termostatu. Działa na płycie rozwojowej STM32F746G-DISCO z płytką KA-NUCLEO-Weather, na której jest zamontowany czujnik STLM75. Płytka KA-NUCLEO-Weather ma złącza w standardzie Arduino i wygodnie montuje się ją w przystosowanych do tego złączach z tyłu płyty rozwojowej, tak jak to widać na fotografii 1.
Płytka korzysta z napięcia zasilania 3,3 V pobieranego z płyty STM32F746G-DISCO. Magistrala I2C podłączona jest do gniazda CN7-9,10 czyli wyprowadzeń SDA/D14/PB9 i SCL/D15/PB8. Wyprowadzenie OS czujnika dostępne jest na gnieździe CN4-8. Na płytce KA-NUCLEO-Weather zamontowano oporniki podciągające dla magistrali I2C i wyprowadzenia OS czujnika.
Na fotografii 2 widnieje ekran ustawiania temperatury załączania wyjścia OS, w podobny sposób ustawiana jest temperatura rozłączania czyli histereza. Dla lepszego zobrazowania działania do wyjścia OS (CN4-8) można podłączyć poprzez opornik ograniczający ok. 1 kΩ katodę diody LED.
Anodę podłączamy do najbliższego wyprowadzenia napięcia 3,3 V np. CN7-8 AVDD. Aplikacja działa w ten sposób, że dopóki mierzona temperatura nie osiągnie poziomu ustawionego w Rejestrze Załączania, dioda LED będzie się świecić. Dioda zapali się ponownie gdy temperatura opadnie poniżej wartości zapisanej w Rejestrze Histerezy. Ciekawe czy czytelnicy domyślą się jak zachowa się dioda gdy temperatura Histerezy będzie miała ustawioną wyższą temperaturę niż poziom Załączania?
Ryszard Szymaniak, EP