DS18B20


10
Ocena: None Średnia: 10 (1 głosujący)

Układ DS18B20, wyprodukowany przez firmę MAXIM/DALLAS (http://www.maxim-ic.com/), jest cyfrowym termometrem pracującym na magistrali 1-Wire. Od czujnika DS18S20 różni się rozdzielczością, która w tym przypadku wynosi 9-12 bitów. Do komunikacji z mikrokontrolerem wymagany jest tylko jeden przewód (oraz masa). Zasilanie potrzebne do odczytu oraz konwersji temperatury pobierane może być z linii danych lub dodatkowym przewodem z układu sterującego. Każdy z czujników ma własny niepowtarzalny numer seryjny co sprawia że na jednej magistrali może ich pracować teoretycznie dowolna ilość.

Kartę Katalogową układu DS18B20 można pobrać ze strony producenta. Link bezpośredni dostępny tutaj

Ważniejsze właściwości:
- Magistrala 1-Wire wymagająca tylko jednego pinu do komunikacji
- Każdy z układów posiada własny unikalny 64-bitowy kod
- Nie potrzebuje elementów zewnętrznych
- Może być zasilany napięciem od 3V do 5.5V
- Mierzy temperaturę od -55 do +125 stopni
- Zapewnia dokładność 0.5 stopnia dla temperatur -10 do 85 stopni
- ustawiana rozdzielczość 9 do 12 bitów
- Konwertuje temperaturę nie dłużej niż 750ms
- Zawiera termostat

Wyprowadzenia:
Rozkład wyprowadzeń układu w różnych obudowach przedstawia poniższy rysunek:

Krótki opis działania:
Ds18B20 będący w stanie uśpienia musi otrzymać od mikrokontrolera rozkaz konwersji temperatury (Convert T [44h]). Po pomiarze temperatura wpisywana jest do dwóch bajtów rejestru (scratchpad memory) a układ znowu powraca do stanu uśpienia. Na poniższym rysunku przedstawione są dwa pierwsze bajty w pamięci DS18B20.

Pięć najstarszych bitów bajtu MSB oznaczone jako S zawierają informację o znaku temperatury a trzy młodsze bity MSB wraz z całym bajtem LSB zawierają 12 bitową liczbę (teperaturę pomnożoną przez 16). Dla teperatur dodatnich jest ona wyrażona w kodzie binarnym a dla ujemnych w kodzie U2 (uzupełnień do dwóch). Widok całego rejestru ukladu DS18B20 przedstawia poniższy rysunek.

Po dokładny opis pozostałych bajtów w rejestrze odsyłam do orginalnej karty katalogowej. W praktyce przy budowie prostych urządzeń wykorzystujących czujnik DS18B20 będziemy odczytywać tylko dwa pierwsze bajty a potem nastąpi reset magistrali 1-Wire.

Komunikacja i Rozkazy:
Komunikacja z układem DS18B20 odbywa się w trzech krokach

a) Inicjalizacja
Jest to sygnał esetu magistrali wykonywany przez mikrokontroler sterujący. Każda transmisja przez magistralę 1-Wire musi rozpocząć się od tego sygnału.

b)Komendy ROM
Są to polecenia służące do operowania na unikalnym 64-bitowym kodzie układu. Zapewniają określenie ile i jakie układy podpięte są do magistrali, odczytanie numerów zapisanych w ich pamięci ROM oraz uaktywnienie układu o znanym wcześniej numerze.
Do najważniejszych poleceń z tej grupy należą:
Reed Rom [33h] - Pozwala procesorowi na odczyt 8 bajtów numeru seryjnego układu. Nie działa gdy na magistrali jest więcej niż jeden układ.
Match Rom [55h] - Umozliwia aktywowanie jednego z układów na magistrali za pomocą jego 64-bitowego numeru.
Skip Rom [CCh] - Pozwala na pominięcie sprawdzania numerów układów i wysłanie jednocześnie rozkazów do wszystkich układów na magistrali. Komenda jest przydatna do wysyłania poleceń konwersji temperatury do wszystkich czujników temperatury pracujących na jednej magistrali, lub gdy używamy tylko jednego układu DS18B20.

c) Komendy Funkcji Układu
Rozkazy te następują po komendach dotyczących wyboru układu lub pominięcia sprawdzania numeru. Służą do konwersji temperatury oraz do zapisu lub odczytu danych z rejestrów DS18B20. Do najważniejszych poleceń z tej grupy należą:
Convert T [44h] - Rozkaz ten rozpoczyna proces konwersji temperatury, po jego zakończeniu wyniki będą umieszczone w dwóch bajtach rejestru DS18B20
Read Scratchpad [BEh] - Rozkaz powoduje sekwencję odczytu danych z rejestru czujnika począwszy od bajtu 0 do 8. Odczyt może być przerwany przez sygnał resetu magistrali 1-Wire jeżeli nie potrzeba wszystkich 9 bajtów.

Uwaga! Rysunki użyte w opisie pochodzą z karty katalogowej, zostały zamieszczone tylko w celach edukacyjnych.




Portret użytkownika Grzegorz

Witam jak pozmieniać w tym

Witam jak pozmieniać w tym programie żeby działało z ds1820

'Wersja z dnia 26.04.2012
$regfile = "Attiny2313.dat"
$crystal = 1000000                                          'Fusebit CKDIV8 = 0 -> zaprogramowany (ustawienie domyślne producenta)
$hwstack = 32
$swstack = 32
$framesize = 32
 
'Konfiguracja wyświetlacza LCD
Config Lcd = 16 * 1
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.2 , Db6 = Portb.4 , Db7 = Portb.3 , E = Portb.0 , Rs = Portd.6
 
'Konfiguracja magistrali 1wire
Config 1wire = Portd.0
 
'Deklaracje zmiennych
Dim Tmierzona As Byte                                       'Temperatura mierzona przez czujnik DS1820
Dim Ttermostatu As Byte                                     'Temperatura termostatu
Dim Hist_plus As Byte , Hist_minus As Byte                  'Wartości histerezy regulacji
Dim Refresh As Byte                                         'Wskaźnik żądania odświerzenia zawartości ekranu
Dim Ekran As Byte                                           'Wskaźnik rodzaju wyświetlanego ekranu: 0-> regulacja termostatu, 1-> regulacja parametrów histerezy
Dim Clock As Word                                           'Zegar programowy do obsługi pomiarów temperatury
Dim Btemp As Byte                                           'Zmienna ogólnego przeznaczenia
 
'Deklaracje zmiennych w pamięci EEPROM mikrokontrolera
Dim Ee_hist_plus As Eram Byte , Ee_hist_minus As Eram Byte
Dim Ee_ttermostatu As Eram Byte
 
'Aliasy nazw portów sterujących
Plus Alias Pind.5
Minus Alias Pind.4
Histereza Alias Pind.3
Przekaznik Alias Portb.6
 
'Deklaracje procedur
Declare Sub Inicjalizacja
Declare Sub Inicjuj_pomiar
Declare Sub Odczytaj_pomiar
Declare Sub Odswierz_ekran
 
'#####################################################################################
'#####################################################################################
Call Inicjalizacja                                          'Inicjalizacja urządzenia
 
Do
 
  'Obsługa przycisków - ich funkcja zależna jest od trybu pracy, którego wskaźnikiem jest zmienna Ekran
  ' **************** PRZYCISK PLUS ****************
  If Plus = 0 Then
    Waitms 50                                               'Eliminacja drgań styków
    If Plus = 0 Then
 
       If Ekran = 0 Then
 
         If Ttermostatu < 50 Then
            Incr Ttermostatu
            Refresh = 1                                     'Żądanie odświerzenia ekranu
            Ee_ttermostatu = Ttermostatu                    'Zapamiętanie ustawienia w nieulotnej pamięci EEPROM mikrokontrolera
         End If
 
       Else
 
         Incr Hist_plus
         If Hist_plus > 5 Then Hist_plus = 1                'Zawężenie zakresu do przedziału 1...9
         Refresh = 1                                        'Żądanie odświerzenia ekranu
 
       End If
 
    End If
  End If
  ' **************** *****************************
 
  ' **************** PRZYCISK MINUS ****************
  If Minus = 0 Then
    Waitms 50                                               'Eliminacja drgań styków
    If Minus = 0 Then
 
       If Ekran = 0 Then
 
         If Ttermostatu > 5 Then
            Decr Ttermostatu
            Refresh = 1                                     'Żądanie odświerzenia ekranu
            Ee_ttermostatu = Ttermostatu                    'Zapamiętanie ustawienia w nieulotnej pamięci EEPROM mikrokontrolera
         End If
 
       Else
 
         Incr Hist_minus
         If Hist_minus > 5 Then Hist_minus = 1              'Zawężenie zakresu do przedziału 1...5
         Refresh = 1                                        'Żądanie odświerzenia ekranu
 
       End If
 
    End If
  End If
  ' **************** *****************************
 
  ' **************** PRZYCISK HISTEREZA ****************
  If Histereza = 0 Then
    Waitms 50                                               'Eliminacja drgań styków
    If Histereza = 0 Then
 
       If Ekran = 1 Then
          'Jeżeli jesteśmy już w trybie regulacji parametrów histerezy to ponowne wciśnięcie przycisku Histereza
          'powoduje przejście do ekranu głównego (regulacji temperatury termostatu) jak również zapamiętanie
          'parametrów histerezy regulacji w pamięci EEPROM mikrokontrolera
          Ee_hist_plus = Hist_plus
          Ee_hist_minus = Hist_minus
       End If
       Ekran = Not Ekran                                    'Zmiana trybu pracy
       Refresh = 1                                          'Żądanie odświerzenia ekranu
 
    End If
  End If
  ' **************** *****************************
 
  'Obsługa żądania odświerzenia ekranu
  If Refresh = 1 Then Call Odswierz_ekran
 
  'Obsługa zegara programowego odmierzającego czas ok.500ms i sterującego pomiarem temperatury
  If Clock = 0 Then Inicjuj_pomiar
  If Clock = 65535 Then Odczytaj_pomiar
  Incr Clock
  Waitus 7
 
  'Obsługa termostatu czyli realizacja funkcjonalności termostatu
  Btemp = Ttermostatu - Hist_minus                          'Obliczenie progu dolnego
  If Tmierzona <= Btemp Then
    If Przekaznik = 0 Then Refresh = 1                      'Żądanie odświerzenia ekranu, gdyż nastąpiła zmiana stanu pracy przekaźnika
    Set Przekaznik                                          'Załączenie przekaźnika (w domyśle elementu grzejnego)
  End If
 
  Btemp = Ttermostatu + Hist_plus                           'Obliczenie progu górnego
  If Tmierzona => Btemp Then
    If Przekaznik = 1 Then Refresh = 1                      'Żądanie odświerzenia ekranu, gdyż nastąpiła zmiana stanu pracy przekaźnika
    Reset Przekaznik                                        'Wyłączenie przekaźnika (w domyśle elementu grzejnego)
  End If
 
Loop
'#####################################################################################
'#####################################################################################
 
'Procedura inicjalizacyjna urządzenia
Sub Inicjalizacja
 
  'Ustalenie kierunku portów sterujących
  Ddrb = &B11111111                                         'Cały port B jako port wyjściowy (z domyślnym stanem niskim na wszystkich wyprowadzeniach)
  Ddrd = &B11000111                                         'Porty przycisków jako porty wejściowe, reszta jako wyjściowe
  Portd = &B00111000                                        'Podciągnięcie rezystorów pod porty wejściowe przycisków
 
  Call Inicjuj_pomiar                                       'Pierwsza inicjalizacja pomiaru temperatury
 
  'Definicja znaków specjalnych LCD
  Cls
  Deflcdchar 0 , 24 , 24 , 6 , 9 , 8 , 9 , 6 , 32           'Symbol stopnia Celcjusza + mała literka C
  Deflcdchar 1 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32      'Sam symbol stopnia Celcjusza
  Deflcdchar 2 , 4 , 14 , 21 , 4 , 17 , 31 , 31 , 32        'Symbol ogrzewania (załączenia przekaźnika)
  Cls
  Cursor Off Noblink
  Lcd "Wait!"
 
  'Odczyt ustawionych parametrów regulacji z pamięci EEPROM i ich ewentualna korekta jeśli wykraczają poza przyjęty zakres
  Ttermostatu = Ee_ttermostatu
  If Ttermostatu < 5 Or Ttermostatu > 50 Then Ttermostatu = 20
  Hist_plus = Ee_hist_plus
  If Hist_plus < 1 Or Hist_plus > 5 Then Hist_plus = 1
  Hist_minus = Ee_hist_minus
  If Hist_minus < 1 Or Hist_minus > 5 Then Hist_minus = 1
 
  Waitms 500
  Call Odczytaj_pomiar                                      'Pierwszy odczyt temperatury
  Refresh = 1                                               'Żądanie odświerzenia zawartości ekranu
End Sub
 
'#####################################################################################
 
Sub Inicjuj_pomiar
  1wreset                                                   'Reset magistrali
  1wwrite &HCC                                              'Polecenie: Skip ROM
  1wwrite &H44                                              'Polecenie: Convert T
End Sub
 
'#####################################################################################
 
Sub Odczytaj_pomiar
  1wreset                                                   'Reset magistrali
  1wwrite &HCC                                              'Polecenie: Skip ROM
  1wwrite &HBE                                              'Polecenie: Read Scratchpad
  Tmierzona = 1wread()                                      'Odczytujemy tylko jeden bajt -> wartość temperatury
  Shift Tmierzona , Right , 1                               'Pomijamy pół stopnia
End Sub
 
'#####################################################################################
 
Sub Odswierz_ekran
 
  Home Upper
 
  If Ekran = 0 Then
    'Jesteśmy w trybie regulacji temperatury termostatu
    Btemp = 32                                              'Domyślny kod znaku spacji
    If Przekaznik = 1 Then Btemp = 2                        'Symbol załączenia przekaźnika
    Lcd Chr(btemp) ; Chr(32)
 
    If Ttermostatu < 10 Then Lcd Chr(32)                    'Obsługa zera nieznaczącego
    Lcd Ttermostatu ; Chr(1) ; Chr(67)
 
  Else
    'Jesteśmy w trybie zmiany nastaw progów histerezy regulacji
    Lcd Chr(43) ; Hist_plus ; Chr(0) ; Chr(45) ; Hist_minus ; Chr(0)
  End If
 
  Refresh = 0                                               'Wyzerowanie flagi żądania odświerzenia ekranu
  Bitwait Histereza , Set                                   'Oczekiwanie na ewentualne zwolnienie przycisku Histereza
End Sub
 
'#####################################################################################

Portret użytkownika mirley

Re: DS1820

Dla DS1820 jest ok. Procedura odczytu temperatury jest dobra.... może inne części programu nie działają? napisz programik gdzie masz tylko czujnik temperatury i lcd żeby sprawdzić czy sam czujnik działa

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.