powrót do spisu treści

powrót do publikacje

4.2 Pomiar temperatury.

Zastosowany układ DS18B20 jest cyfrowym termometrem z ustalaną rozdzielczością pomiaru temperatury. Posiada unikalny 64-bitowy numer oraz dwa rejestry umożliwiające ustawienie alarmu po przekroczeniu górnej lub dolnej temperatury granicznej. Układ posiada wbudowany w strukturę zbiór 9 rejestrów oraz pamięć EEPROM, których rozkład pokazano w tabeli 5.

Tabela 5. Struktura pamięci wewnętrznej układu DS18B20 [13]

Bajt temperatury (LSB) 0 -
Bajt temperatury (MSB) 1 EEPROM
H – górna temperatura progowa 2 TH – górna temperatura progowa
TL – dolna temperatura progowa 3 TL – dolna temperatura progowa
Rejestr konfiguracyjny 4 Rejestr konfiguracyjny
Zarezerwowany 5 -
Zarezerwowany 6 -
Zarezerwowany 7 -
CRC 8 -

Sposób zapisu temperatury w dwóch 8-bitowych rejestrach przedstawiają tabele 6 i 7. Temperatura skalowana jest w stopniach Celsjusza. Format danych przedstawiony w tabeli 7 odpowiada 12-bitowej rozdzielczości pomiaru temperatury. Jeżeli rozdzielczość wynosi [13]:

- 11 bitów - bit 0 rejestru LSB jest nieokreślony

- 10 bitów - bity 0,1 rejestru LSB są nieokreślone

- 9 bitów - bity 0,1,2 rejestru LSB są nieokreślone.

Tabela 6. Sposób zapisu temperatury [8]

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
LSB 2*10^3 2*10^2 2*10^1 2*10^0 2*10^3-1 2*10^-2 2*10^-3 2*10^-4
MSB S S S S S 2*10^6 2*10^5 2*10^4

S- znak temperatury S = 0 (S = 1) temperatura dodatnia (ujemna)

 

Tabela 7. Konwersja wartości temperatury zapisanej w bitach na °C, rozdzielczość 12 bitów [8]

TEMPERATURA WARTOŚĆ CYFROWA (binarnie) WARTOŚĆ CYFROWA (HEX)
+125,0°C 00000111 11010000 07D0h
+85,0°C 00000101 01010000 0550h
+25,0625°C 00000001 10010001 0191h
+10,125°C 00000000 10100010 00A2h
+0,5°C 00000000 00001000 0008h
0 °C 00000000 00000000 0000h
-0.5°C 11111111 11111000 FFF8h
-10.125°C 11111111 01011110 FF5Eh
-25,0625°C 11111110 01101111 FE6Fh
-55,0°C 11111100 10010000 FC90h

Rejestr konfiguracyjny (tabela 8), decyduje o rozdzielczości pomiaru temperatury przez układ. Ważne jest tu, że im wyższa rozdzielczość tym dłuższy czas konwersji temperatury

Tabela 8. Rejestr konfiguracyjny [13]

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0 R1 R0 1 1 1 1 1

Tabela 9 przedstawia znaczenie bitów R1 i R0 rejestru konfiguracyjnego. Zawiera ona również maksymalne czasy konwersji temperatury.

Tabela 9. Konfiguracja bitów R1 i R0 oraz czas konwersji [13]

R1 R0 Rozdzielczość Maksymalny czas konwersji
0 0 9-bitów 93,75ms
0 1 10-bitów 187,5ms
1 0 11-bitów 375,0ms
1 1 12-bitów 750,0ms

Układ DS18B20 używa do komunikacji magistrali 1-Wire, opracowanej w firmie Dallas Semiconductor i przeznaczonej do jednoprzewodowego przesyłania informacji pomiędzy układem Master (mikrokontrolera) i układami Slave. Każde z urządzeń dołączonych do magistrali musi mieć wyjście typu otwarty dren, a linia sygnałowa jest połączona z plusem zasilania przez rezystor podciągający 4,7kΩ. W stanie bezczynności (idle state) linia danych jest w stanie wysokim. Jeżeli z jakiejś przyczyny wymiana informacji jest wstrzymana, to linia danych musi przejść w stan idle state. Kiedy stan niski utrzymuje się dłużej niż 120µs, jest to traktowane jako polecenie zerowania interfejsów układów dołączonych do magistrali. Protokół wymiany danych poprzez magistralę 1-Wire składa się z czterech podstawowych sekwencji:

- inicjalizacja (reset and presence) - zapis zera;
- zapis jedynki;
- odczyt bitu.

Sekwencja inicjalizacji (rys.11) rozpoczyna się wysłaniem na magistralę przez układ Master impulsu zerującego o czasie trwania 480...960µs. Po tym czasie układ Master przechodzi w stan odbioru i na magistrali pojawia się stan wysoki. Funkcja inicjująca ma postać:

bit w1_reset(void)
{
bit err;
one_wire_IO = 0; //utrzymanie stanu niskiego na linii 1Wire
nop();
wait100us(5); //przez wyliczony czas "time_slot"
one_wire_IO = 1; //ustawienie stanu wysokiego na linii 1Wire
wait10us(7);
err = one_wire_IO; //odczyt presence pulse
wait100us(4);
wait10us(1);
return (!err) & one_wire_IO; // stan niski = zwarcie na linii
}

Jeżeli do magistrali podłączony jest układ Slave, to po zidentyfikowaniu końca impulsu zerującego odczekuje on 15...60µs i wystawia na magistralę impuls obecności (presence pulse) o czasie trwania 60...240µs. Sekwencja inicjalizacji umożliwia Masterowi wykrycie, czy do magistrali jest podłączony jakikolwiek układ Slave.

Rys. 11. Inicjalizacja magistrali 1-wire [13]

W sekwencjach zapisu i odczytu bitów z magistrali 1-Wire jest definiowana szczelina czasowa (time slot), w której ich wykonanie musi się zmieścić. Czas trwania takiej szczeliny mieści się w przedziale 60...120µs i jest inicjowana wymuszeniem przez układ Master stanu niskiego na magistrali (rys.10). 

Rys. 12. Odczyt bitu przez Master ze Slave [13]

W operacji odczytu widocznej na rysunku 12, po zainicjowaniu przez Master szczeliny czasowej przechodzi on w stan odbioru. Po ok. 14...20µs Master może odczytać stan magistrali - jej stan zależy wtedy od układu Slave. Cała operacja kończy się razem z zakończeniem trwania szczeliny czasowej sekwencji odczytu. Funkcja odczytu pojedynczego bitu ma postać:

bit w1_bit_read(void)
{
bit b;
one_wire_IO = 0; // inicjalizacja szczeliny czasowej
waitus(1);
one_wire_IO = 1; // zwolnienie magistrali przez master
wait10us(1);
waitus(4); // po około 14 µs odczyt stanu magistrali
b = one_wire_IO;
return (b);
}

Zapisywanie danych z układu Master do układu Slave jest podzielone na dwie sekwencje: zapis zera i zapis jedynki. Zapis zera rozpoczyna się inicjacją szczeliny, po czym przez co najmniej 60µs Master musi utrzymywać na magistrali stan niski (rys. 15).

Rys.13. Zapis zera do układu Slave [13]

W przypadku zapisu jedynki, po inicjacji okna, po ok. 15µs linia danych Mastera musi przejść w stan odbioru. Rezystor podciągający magistrali wymusi stan wysoki, który musi tam trwać przez 60µs od chwili inicjalizacji szczeliny, widać to na rysunku 14.

Rys. 14. Zapis jedynki do układu Slave [13]

Funkcja zapisu pojedynczego bitu na magistralę One wire jest ta sama, bez różnicy czy zapisujemy zero czy jedynkę i ma postać:

bit w1_bit_write(bit b)
{
one_wire_IO = 0; // inicjalizacja szczeliny czasowej
wait10us(1);
one_wire_IO = b;
wait10us(6); // jeśli b=0 to one_wire_IO=0 przez około 60 µs
// jeśli b=1 to one_wire_IO=1 przez około 60 µs
one_wire_IO = 1;
}

Funkcje odczytu i zapisu danych, które zostały przedstawione powyżej, działają na pojedynczych bitach, dane przesyłane pomiędzy mikrokontrolerem a układem DS18B20 mają postać bajtów. Aby odebrać albo wysłać całe bajty, powyższe funkcje należy wywoływać osiem razy, procedury odczytu i zapisu całych bajtów mają zatem postać:

char w1_write(char b) //zapis bajtu do one_wire
{
char i;
for(i=0;i<8;i++)
{
w1_bit_write( b & 0x01 );
b>>=1;
}
wait10us(10); //czekaj na zakończenie time slot
}
char w1_read(void) //odczyt bajtu z one_wire
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(w1_bit_read())
value|=0x01< wait10us(12); //czekaj na zakończenie time slot
}
return(value);
}

Dane odbierane z układu DS18B20 są zabezpieczone przed wystąpieniem błędów w transmisji, za każdym razem przed przystąpieniem do przetworzenia odebranych bajtów temperatury, w programie jest umieszczona pętla sprawdzająca sumę kontrolną CRC przedstawiona poniżej:

crc=0;
for (i=0; i<9; i++)
{
crc = ds_crc_tab[crc ^ dane_one_wire[i]];
} // jeśli otrzymamy crc=0 to oznacza, że odczyt odbył się bezbłędnie
if(crc==0)
{
… //tutaj są przetwarzane otrzymane dane jeśli crc=0
}

Każda wymiana danych z układem podłączonym do magistrali obejmuje trzy etapy [13]:

1. Inicjalizacja. Zawiera etap zerowania układu Slave oraz etap potwierdzenia przez Slave ’a obecności na magistrali.

2. Przesłanie komendy typu ROM. Każdy układ Slave posiada unikalny 64-bitowy kod. Komendy typu ROM umożliwiają zaadresowanie konkretnego układu, identyfikację układu, wyszukanie alarmu lub pominięcie sprawdzania 64-bitowego kodu.

3. Przesłanie funkcji sterującej układu. Sekwencja tego typu umożliwia realizację wszystkich dostępnych operacji na wybranym układzie DS18B20.

powrót do spisu treści

powrót do publikacje