Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DS18B20 i 0,1 stopnia

Czeslaw10 05 Cze 2005 16:02 3914 20
  • #1 05 Cze 2005 16:02
    Czeslaw10
    Poziom 15  

    Przejrzałem wszystkie posty ,które znalazłem na Elektrodzie po słowie szukaj.I nic nie znalazłem.
    Potrzebuje sprawdzony program napisany w Bascomie aby prawidłowo odczytać temperature z dokładnością 0,1 stopnia z DS18B20.
    Dołanczam program który odczytuje ale zawyża o ok. 3 stopnie

    0 20
  • #3 05 Cze 2005 16:16
    Czeslaw10
    Poziom 15  

    Zgadza się jest wszystko,ale z wyświetlaczem tekstowym LCD.
    Ja zrobiłem to na LEDach i gubię się bo inaczej się to wyświetla.

    0
  • Pomocny post
    #4 05 Cze 2005 18:34
    jacur
    Poziom 32  

    Mniej wiecej tak to mozna zrobic ;)
    Listing do AVR-a pozmieniaj nazwy portów

    '################# wyswietlanie temperatury #########################
    Multiplex:

    Dim Mux As Byte
    Dim 100stopni As Integer
    Dim 10stopni As Integer
    Dim 1stopni As Integer
    Dim Dstopni As Integer

    Config Porta = &B11111111
    Config Portc = &B11111111

    T2 = Abs(t1)

    Porta = &B11111111
    Portc = &B11111111

    Incr Mux

    If Mux > 4 Then
    Mux = 1
    End If

    Select Case Mux

    '############## wyswietlanie setek stopni ######################
    Case 1:

    100stopni = Tt(2) / 1000

    If Tt(1) < 0 Then
    100stopni = 10 ' wyswietlanie minusa
    End If

    Porta = Lookup(100stopni , Dig1)
    Portc.4 = 0

    '########### wyswietlanie dziesiatek stopni ####################
    Case 2:

    10stopni = Tt(2) Mod 1000
    10stopni = 10stopni / 100

    Porta = Lookup(10stopni , Dig1)
    Portc.5 = 0

    '#### wyswietlanie jednostek stopni i kropki dziesietnej #######
    Case 3:

    1stopni = Tt(2) Mod 100
    1stopni = 1stopni / 10


    Porta = Lookup(1stopni , Dig1)
    Porta.x=0 'x - numer portu na którym jest kropka dziesietna
    Portc.6 = 0

    '########### wyswietlanie dziesietnych stopnia
    Case 4:

    Dstopni = Tt(2) Mod 10


    Porta = Lookup(dstopni , Dig1)
    Portc.7 = 0

    Return
    '###################################################################

    0
  • #5 05 Cze 2005 21:59
    Viperus
    Poziom 13  

    Witam.
    Nie da się przy pomocy tego układu zmierzyć temperatury z taką dokładnością. Czytałeś note katalogową? dokładność pomiaru dla tego czujnika wynosi ±0.5 stopnia.

    Grzesiek.

    0
  • #6 05 Cze 2005 22:10
    Yoshi
    Poziom 18  

    Viperus napisał:
    Witam.
    Nie da się przy pomocy tego układu zmierzyć temperatury z taką dokładnością. Czytałeś note katalogową? dokładność pomiaru dla tego czujnika wynosi ±0.5 stopnia.

    Grzesiek.


    Witaj,
    dokładność a rozdzielczość to różne kwestie.
    Nie czytałem noty do DS18B20 ale w przypadku DS1820 odczytuje się temperaturę z rozdzielczością 0,1C.

    0
  • Pomocny post
    #7 05 Cze 2005 22:26
    Viperus
    Poziom 13  

    Cytat:
    dokładność a rozdzielczość to różne kwestie.

    Zdaję sobie z tego sprawę dlatego napisałem to co napisałem - Czeslaw10 pytał o dokładność. A jeśli chodzi o rozdzielczość przetwornika A/D to ds18b20 może pracować od 9 do 12 bitów (konfigurowane przez użytkownika - standardowo 12bit), jednak nie zmienia to dokładności pomiaru.

    Grzesiek.

    0
  • #8 05 Cze 2005 22:27
    jacur
    Poziom 32  

    Viperus
    Dokładnośc czujnika DS to jest odchyłka pomiaru od temperatury zmierzonej termometrem wzorcowym i według dokumentacji ma sie ona miescic w granicach 0,5°C w kazdą strone. Pomiar jest powtarzalny czyli jezeli masz 36,6 zmierzone przez DS-a to następnym razem tez bedziesz miał 36,6 chociaz mierząc w tym samym momęcie termometrem dobreej klasy dokłądnosci mozesz miec np 36,3 na wzorcowym. Z doświadczenia wiem że DS18B20 w przedziale od 30 do 40 °C zaniza pomiar o max 0,2°C względem termometru rtęciowego laboratoryjnego .
    I to by było na tyle ;)

    A tak z ciekawosci sie zapytam bo nigdy nie miałem w rękach DS1820 jak mozna odczytac temperature z dokładnoscią 0,1 °C jezeli przetwornik jest 9 bitowy ;)

    0
  • #9 05 Cze 2005 22:58
    Viperus
    Poziom 13  

    Zbaczamy już za bardzo z tematu ale pozwolę sobie jeszcze wtrącić co do tej powtarzalności pomiaru. Właśnie mam termometr z tym czujnikiem na biurku, rozdzielczość ustawiona na 12bit a wynik wyświetlany do jednej pozycji po przecinku. Pomiary wykonywane co ok. 700ms i ta ostatnia cyfra potrafi skakać. Sugerujesz, że mam aż tatkie ruchy powietrza w pokoju, a ten czujnik tak małą bezwładność (w dodatku zamknięty w koszulce termokurczliwej) i potrafi to wychwycić? chyba będę musiał poeksperymentować z jakąś wolno ogrzewaną cieczą i sprawdzić jak sie będzie zachowywał.

    Druga część pytania to raczej nie do mnie bo nigdzie tego nie powiedziałem. Dla jasności - przy 9bit dokładność konwersji wynosić bedzie 0.5

    Pozdrawiam,
    Grzesiek.

    0
  • #10 06 Cze 2005 00:01
    rejestr007
    Poziom 17  

    Witam!

    Cytat:
    A tak z ciekawosci się zapytam bo nigdy nie miałem w rękach DS1820 jak mozna odczytac temperature z dokładnoscią 0,1 °C jezeli przetwornik jest 9 bitowy

    Jacur w przypadku układu DS1820 dziesiąte części stopnia wylicza się na podstawie odczytu dwóch rejestrów i oblicza poprawkę ze specjalnego wzoru podanego w karcie katalogowej układu. Możesz też zerknąć na moją stronę gdzie to opisałem.
    http://republika.pl/rejestr/strony/termometr.html
    Pozdrawiam

    0
  • #11 06 Cze 2005 00:10
    jacur
    Poziom 32  

    Jezeli skacze o 0,1 to normalne dla tych czujników (dosyć czułe maleństwo ;) ) Z doswiadczenia wiem ze w pomieszczeniu bez ruchu powietrza w odległości 0,5m mozesz miec róznice nawet 0,3°C

    Karte katalogową do DS1820 znam ale to 0,1°C jest dla mnie za bardzo naciągane bo i jakim cudem z 9 bitów ;)

    0
  • #12 06 Cze 2005 10:19
    Dareek
    Poziom 11  

    Ds18B20 ma programowalną rozdzielczość 9 - 12 bitów, czyli rozdzielczość pomiarowa = 0,0625 st.C, ale ich dokładność to 0,5 st. C

    Tu masz procedury do 4 czujników:

    Code:

    Odczytaj_id:
       1wreset
       T1_id(1) = 1wsearchfirst()
          If Err = 1 Then
          T1_id(1) = 0
          End If
       T2_id(1) = 1wsearchnext()
          If Err = 1 Then
          T2_id(1) = 0
          End If
       T3_id(1) = 1wsearchnext()
          If Err = 1 Then
          T3_id(1) = 0
          End If
       T4_id(1) = 1wsearchnext()
          If Err = 1 Then
          T4_id(1) = 0
          End If
       Temp = 1wirecount()
    Return

    Odczytaj_temperatury:
       Gosub Odczytaj_id
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Wait 1
       1wreset
          1wverify T1_id(1)
          If Err = 0 Then
          1wwrite &HBE
          Dana(1) = 1wread(9)
          Elseif Err = 1 Then
             Dana(1) = 128
             Dana(2) = 12
          End If
       1wreset
          1wverify T2_id(1)
          If Err = 0 Then
          1wwrite &HBE
          Dana(3) = 1wread(9)
          Elseif Err = 1 Then
             Dana(3) = 128
             Dana(4) = 12
          End If
       1wreset
          1wverify T3_id(1)
          If Err = 0 Then
          1wwrite &HBE
          Dana(5) = 1wread(9)
          Elseif Err = 1 Then
             Dana(5) = 128
             Dana(6) = 12
          End If
       1wreset
          1wverify T4_id(1)
          If Err = 0 Then
          1wwrite &HBE
          Dana(7) = 1wread(9)
          Elseif Err = 1 Then
             Dana(7) = 128
             Dana(8) = 12
          End If
    Return

    Akt_temp:
       Do




       Gosub Odczytaj_temperatury
       If Dana(2) >= 248 Then
          Dana(1) = 255 - Dana(1)
          Dana(2) = 255 - Dana(2)
          Znak = "-"
          Else
          Znak = "+"
          End If
       T1 = Dana(1) / 16
       T2 = Dana(2) * 16
       T1 = T1 + T2
       Wynik = Fusing(t1 , "##.####")
       Print "czujnik nr 1: " ; Wynik
       If Dana(4) >= 248 Then
          Dana(3) = 255 - Dana(3)
          Dana(4) = 255 - Dana(4)
          Znak = "-"
          Else
          Znak = "+"
          End If
       T1 = Dana(3) / 16
       T2 = Dana(4) * 16
       T1 = T1 + T2
       Wynik = Fusing(t1 , "##.####")
       Print "czujnik nr 2: " ; Wynik
       If Dana(6) >= 248 Then
          Dana(5) = 255 - Dana(5)
          Dana(6) = 255 - Dana(6)
          Znak = "-"
          Else
          Znak = "+"
          End If
       T1 = Dana(5) / 16
       T2 = Dana(6) * 16
       T1 = T1 + T2
       Wynik = Fusing(t1 , "##.####")
       Print "czujnik nr 3: " ; Wynik
       If Dana(8) >= 248 Then
          Dana(7) = 255 - Dana(7)
          Dana(8) = 255 - Dana(8)
          Znak = "-"
          Else
          Znak = "+"
          End If
       T1 = Dana(7) / 16
       T2 = Dana(8) * 16
       T1 = T1 + T2
       Wynik = Fusing(t1 , "##.####")
       Print "czujnik nr 4: " ; Wynik
       Print
       Loop
    Return

    0
  • #13 06 Cze 2005 21:24
    Czeslaw10
    Poziom 15  

    Super dyskusja rozgorzała pochwalam zainteresowanie.
    Ale ja nadal nie wiem czy ten program wyświetli mi temperaturę z dokładnością 0,1 stopnia?

    1wreset
    1wwrite &HCC
    1wwrite &H44
    wait 1
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    B1=1wread()
    B2=1wread()
    1wreset
    If B2>=248 Then
    B1=R-B1
    B2=R-B2
    End If
    T=Makeint(B1,B2)
    T=T*10
    T=T/16
    T = zmienna którą Dzielę przez tysiąc na pierwszy wyświetlacz
    sto na drugi
    dziesięć na trzeci
    a czwarty nie dzielę i to jest 0,1 stopnia

    Proszę o pomoc w weryfikacji programu?

    0
  • Pomocny post
    #14 06 Cze 2005 22:09
    Viperus
    Poziom 13  

    Oliczenia są ok, pamietaj tylko o ustawieniu przecinka w odpowiednim miejscu.
    Grzesiek.

    Ps. w Twoim programie procek czeka bezczynnnie przez 1s, można to zrobić na przerwaniach - jak? poszukaj na elektrodzie, było już kilka razy.

    0
  • Pomocny post
    #15 06 Cze 2005 22:40
    lechoo
    Poziom 39  

    @Czeslaw10

    Ten fragment:

    Code:
    If B2>=248 Then 
    
    B1=R-B1
    B2=R-B2
    End If

    jest niepotrzebny, prawdę mówiąc to nie rozumiem co miał robić ten warunek...

    0
  • Pomocny post
    #16 07 Cze 2005 00:26
    Viperus
    Poziom 13  

    Sprawdzenie czy temperatura jest dodatnia czy ujemna, tylko w wypadku tej drugiej przed wyjściem z if'a trzebaby umieścic procedurkę wyświetlającą/zapamiętującą ten znak.
    Grzesiek.

    0
  • #17 07 Cze 2005 18:08
    Czeslaw10
    Poziom 15  

    Program chyba jest Ok.
    Po zanurzeniu czujnika we wrzącej wodzie pokazał 99,2 stopnia we Wrocławiu.
    Nie wiem w jakiej temperaturze wrze woda na tej wysokości?
    Sprawdzę jeszcze temperatury ujemne.
    Dziękuje za pomoc.
    :D

    0
  • Pomocny post
    #18 08 Cze 2005 09:39
    higlos
    Poziom 12  

    Program do czujnika temp ds18b20 ktory mierzy z dokladnoscia dwoch miejsc po przecinku. Sprawdzony ale tak jak juz koledzy mowili wyniki po przecinku bardzo czesto skacza

    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32


    Config Pind.7 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output


    Config Pina.6 = Output
    Config Pina.7 = Output

    Set Portb.0
    Set Portd.4
    Set Portd.5

    Set Portd.7

    Reset Porta.6
    Set Porta.7

    Config 1wire = Portd.6

    Declare Sub Odcz_temp
    Dim Temperatura1 As Byte
    Dim Temperatura2 As Byte
    Dim T1 As Single
    Dim T2 As Single
    Dim Tmp As String * 6
    Dim R As Byte
    Dim Znak As String * 1
    R = &HFF

    Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
    Config Lcd = 16 * 2
    Cls
    Cursor Off '




    Locate 1 , 5
    Lcd "H"
    Waitms 100
    Locate 2 , 7
    Lcd "E"
    Waitms 100
    Locate 1 , 9
    Lcd "L"
    Waitms 100
    Locate 2 , 11
    Lcd "L"
    Waitms 100
    Locate 1 , 13
    Lcd "O"
    Waitms 100



    Do

    Call Odcz_temp

    Cls

    Lcd "Temp: " ; Tmp ; Chr(0) ; "C"

    Loop

    End


    Sub Odcz_temp

    1wreset
    1wwrite &HCC
    1wwrite &H44

    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Temperatura1 = 1wread() 'odczyt z termometru
    Temperatura2 = 1wread()

    1wreset 'podprogram 1wr

    If Temperatura2 >= 248 Then 'w przypadku temperatur ujemnych
    Temperatura1 = R - Temperatura1 'Od 255 Odejmujemy B1
    Temperatura2 = R - Temperatura2 'od 255 odejmujemy B2
    End If
    T1 = Temperatura1 / 16 'Przesuniecie w pawo o 4 bajty
    T2 = Temperatura2 * 16 'przesuniecie w lewo o 4 bajty
    T1 = T1 + T2

    Tmp = Fusing(t1 , "###.&&")

    End Sub

    0
  • #19 08 Cze 2005 11:54
    lechoo
    Poziom 39  

    Wynik po przecinku skacze, bo DS18B20 mierzy temperaturę z rozdzielczością do 1/16 st. C. Tak więc nie ma najmniejszego sensu wyświetlać temperaturę z dokładnością do 2 miejsc po przecinku.

    0
  • #20 08 Cze 2005 12:13
    McRancor
    VIP Zasłużony dla elektroda

    Czeslaw10 napisał:
    Program chyba jest Ok.
    Po zanurzeniu czujnika we wrzącej wodzie pokazał 99,2 stopnia we Wrocławiu.
    Nie wiem w jakiej temperaturze wrze woda na tej wysokości?
    Sprawdzę jeszcze temperatury ujemne.
    Dziękuje za pomoc.
    :D


    Woda we Wrocławiu wrze w zakresie 90-110st. zależnie od tego ile ropy aktualnie w Odrze pływa :)

    0
  • #21 12 Lis 2005 16:07
    Czeslaw10
    Poziom 15  

    Temat zakończony!
    Problem rozwiązany!

    0
  Szukaj w 5mln produktów