Pogotowie chłodnicze warszawa i okolice 24h tel. zgłoszeń 0 662287555
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;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.