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.

Dokładność DS18B20. Temperatura jest zaniżana. Kod programu jest ok?

robgold 20 Gru 2006 03:09 3448 21
  • #1 20 Gru 2006 03:09
    robgold
    Poziom 14  

    Witam
    Mam zbudowane obecnie dwa termometry na DS18B20 i delikatnie mowiac zaczynam sie irytowac. Oba mocno zanizaja temperature (o jakies 3 st C)

    Sprawa jest o tyle denerwujaca ze np w dni kiedy nie ma mrozu i temperatura jest na poziomie 1-1.5 st C czujnik pokazuje - 1.8 do -2.2 st C

    Czy tylko mi sie trafily takie "super" dallasy czy ten typ tak ma ?

    Procedurka odczytu wyglada tak

    Code:

    1wreset Pind , 4
    1wwrite &HCC , 1 , Pind , 4
    1wwrite &H44 , 1 , Pind , 4
    1wreset Pind , 4
    wait 1
    1wreset Pind , 4
    1wwrite &HCC , 1 , Pind , 4
    1wwrite &HBE , 1 , Pind , 4
    Mbt = 1wread(1 , Pind , 4)
    Sbt = 1wread(1 , Pind , 4)
    1wreset Pind , 4

    Tout = Makeint(mbt , Sbt)
    Tout = Tout * 10
    Tout = Tout / 16
    If Tout < 0 Then Toutz = 1 Else Toutz = 0
    Toutu = Tout Mod 10
    Tout = Tout / 10


    Wydaje mi sie ze w programie nie ma zadnych bledow...

    0 21
  • #2 20 Gru 2006 08:02
    Father
    Poziom 26  

    ±0.5°C accuracy from –10°C to +85°C, więc nie powinno być takiego rozrzutu temperatury...

    0
  • #3 20 Gru 2006 11:03
    Electix
    Poziom 20  

    Siemka!

    A ja tak się zastanawiam czy czasem te obliczenia których tu dokonujesz nie wprowadzają dodatkowego błędu do wyniku pomiaru? Dlaczego akurat taką metodę obliczania wartości temperatury wybrałeś?

    Pozdrawiam!

    0
  • #4 20 Gru 2006 12:25
    robgold
    Poziom 14  

    tzn ? Co masz na mysli piszac "taka metode" ?

    0
  • #6 20 Gru 2006 13:04
    robgold
    Poziom 14  

    Czyli jest dobrze bo z DS najpierw czyta sie mlodszy bajt (LSB) a potem starsczy (MSB) i tak samo mam w funkcji

    Code:

    Mbt = 1wread(1 , Pind , 4)
    Sbt = 1wread(1 , Pind , 4)
    1wreset Pind , 4

    Tout = Makeint(mbt , Sbt)

    0
  • #7 20 Gru 2006 13:37
    Granat :)
    Poziom 34  

    Wklejam tutaj podprogram w którym czytam dane z termometru a potem je przetwarzam:

    Code:

    Sub Termo
    Disable Interrupts
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt(1) = 1wread(2)
    T = Makeint(odczyt(1) , Odczyt(2))
    If T < 0 Then
    Set Minus
    Else
    Reset Minus
    End If
    T = Abs(t)
    T = T * 10 : T = T / 16
    Przecinek = T Mod 10
    T = T / 10
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Enable Interrupts
    End Sub


    Jeśli to Ci coś pomoże to dobrze, a jak nie to pewnie masz uszkodzone te scalaki.

    Dodano po 1 [minuty]:

    znak minus to zmienna bitowa "minus", temperatura właściwa to zmienna integer "T" i dziesiętne części "przecinek" :)

    0
  • #8 20 Gru 2006 14:24
    Electix
    Poziom 20  

    Elo!

    Jeśli ja mogę coś zasugerować to fragment kodu:

    Code:

    Odczyt(1) = 1wread(2)
    T = Makeint(odczyt(1) , Odczyt(2))

    można zastąpić takim:
    Code:

    T=1wread(2)

    Oczywiście wcześniej deklarujemy zmienną T jako typ INTEGER i tu stwierdzenie: po co wyręczać kompilator, zmienna INTEGER z natury jest ładowana w kolejności LSB i potem MSB zatem bez używania dodatkowych zmiennych i ich przetwarzania możemy od razu mieć wynik gotowy do dalszych obliczeń:)

    0
  • #10 20 Gru 2006 14:45
    robgold
    Poziom 14  

    Ok wszystko fajowo. Tylko skad ta niedokladnosc ? Jeszcze w pokoju by mi nie przeszkadzalo jak by pokazywal 24 zamiast 21 st C ale jak zaczyna przeklamywac na dworze to jest niefajnie :(

    0
  • #11 20 Gru 2006 14:56
    Granat :)
    Poziom 34  

    kup ten termometr przy okazji jak będziesz coś zamawiał w sklepie internetowym i zobacz czy też przekłamuje :)

    a co do nowych termometrów to u mnie było z nimi tak, że każdy nowy termometr przez pierwsze godziny swojego działania pokazuje trochę inną temperaturę niż jest naprawdę, a potem to się zmienia i jest ok :D

    0
  • #12 20 Gru 2006 15:17
    robgold
    Poziom 14  

    Kupowalem, te czujniki sa wlasnie z Arctronic'a. No nic wieczorem zmontuje na plycie testowje na szybko uklad i zobacze rozne dallasy jak sobie radza.

    0
  • #14 20 Gru 2006 16:16
    Electix
    Poziom 20  

    A ja się tak dalej zastanawiam i zasugeruje Ci też inny sposób sprawdzenia. Tu będziesz miał możliwość porównania dokładności obliczeń na danych. Spróbuj może tak:

    Zamiast kodu:

    Code:

    Sub Termo
    Disable Interrupts
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt(1) = 1wread(2)
    T = Makeint(odczyt(1) , Odczyt(2))
    If T < 0 Then
    Set Minus
    Else
    Reset Minus
    End If
    T = Abs(t)
    T = T * 10 : T = T / 16
    Przecinek = T Mod 10
    T = T / 10
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Enable Interrupts
    End Sub

    wstaw kod:
    Code:

    Sub Termo
    Disable Interrupts
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    odczyt = 1wread(2)
    T=odczyt/16
    Tt = Fusing(T , "#.#")
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Enable Interrupts
    End Sub

    przy czym musisz zadeklarować zmienne:
    -odczyt (jako INTEGER)
    -T (jako SINGLE)
    -Tt (jako STRING)
    pomajstruj też z funkcją FUSING i wtedy może wynajdziesz wystarczającą dla siebie dokładność. :)

    0
  • #15 20 Gru 2006 16:21
    Granat :)
    Poziom 34  

    ale przecież tu nie chodzi o dokładność co do miejsc dziesiętnych, nie mówiąc o setnych, tylko o to, że termometr myli się o 3°C

    opcja ze zmieną single i string może i jest prosta w użyciu ale zajmuje bardzo dużo ramu (przynajmniej 6 bajtów, standardowo wystarczą trzy :D , cociaż :P pewnie znajdzie się też ktoś kto zrobił to przy użyciu tylko dwóch bajtów...)

    0
  • #16 20 Gru 2006 16:39
    Electix
    Poziom 20  

    Nasuwa mi się jeszcze jedna myśl. Bo skarżysz się na dokładność DS18B20 a do czego porównywałeś wskazania Twoich czujników temperatury? Masz jakiś termometr wzorcowy? No i jeszcze kwestia tego gdzie masz zamontowany ten czujnik. Ja mieszkam na 4 piętrze i temperatura tu mierzona może różnić się nawet do 2° w stosunku do temperatury w okolicach gruntu. Powietrze potrafi dosyć szybko zmieniać temperaturę, natomiast ściana budynku tak szybko na zmiany temperatur nie reaguje i może albo promieniować ciepło gdy spadnie temperatura powietrza lub pochłaniać ciepło gdy temperatura powietrza wzrośnie i to zjawisko też może zakłócać pomiar. Czujnik należy montować pod oknem żeby uciekające z domu ciepło nie zakłócało pomiarów itd. Może to jest przyczyną? Ja mam układ z czterema czujnikami i sprawdzałem ch wskazania mierząc temperaturę trzymając je razem w jednym miejscu i z reguły różnica był mniejsza niż 0,5°C

    0
  • #17 20 Gru 2006 17:04
    Adam_dz
    Poziom 12  

    Ja mam to samo - dwa termometry z supermarketu, jeden troche mądrzejszy.. z zapamietywaniem min i max temp i obok nich moj - zaniza o jakies 3 st... 3 układy DS18B20 sprawdzalem, dwa na pewno zanizają, 3ci chyba tez.. ale wszystkie DSy obok siebie pokazują w miare to samo.

    0
  • #18 20 Gru 2006 18:45
    robgold
    Poziom 14  

    Porownuje to chocby ze zwyklym rteciowym termometrem i z wlasnymi zmyslami. Jezeli DS na wyokosci parteru pokazuje mi -2 st C a wychodze na dwor i nie ma mrozu (w konuc mroz sie czuje) to cos jest nie tak. Na rteciowym termometrze mam w tym czasie +1st C. W samochodzie termometr na komputerze pokazuje 1.5 st C to albo te dwa termometry klamia albo moj dallas zaniza. Stawiam na dallasa. Sprawdze wszystkie uklady jakie mam i zobaczymy co pokaza.

    0
  • #19 20 Gru 2006 18:50
    Electix
    Poziom 20  

    No chyba na poważnie nie weźmiesz termometrów z supermaketu:) Ja rozumiem porównanie z jakimś termometrem rtęciowym o rozdzielczości 0,1°C lub nawet większej i wtedy można wyciągać wnioski, natomiast porównania do termometrów o których parametrach z reguły nic nie wiemy moim zdaniem są bez sensu...

    Pozdrawiam!

    0
  • #20 05 Sty 2007 02:36
    Arnold_S.
    Poziom 26  

    Podepnę się pod temat, aby swojego nie zakładać.

    Zrobiłem taki program(jak poniżej).
    Kostka DS18B20 odpowiada(obserwuję oscyloskopem) na sygnał Reset z mikrokontrolera.
    Czyli kostka "żyje".
    Ale nie reaguje później na żadne rozkazy(Skip ROM, Convert T, czy inne).
    Okna czasowe są realizowane według zaleceń z datasheet układu DS18B20.
    Więc co tu może nie grać?

    Code:
    .INCLUDE "tn26def.inc"
    
    RJMP Petla_Glowna

    .macro PortOut
       Ldi R16,128
       Out DDRA,R16
    .endm

    .macro Delay0      // Zmienne opóźnienie do transmisji danych.
       Wait:         // Jeden obieg = 0,375us.
          DEC R19
       BRNE Wait
    .endm

    .macro Delay1      // Opóźnienie do Resetu i PresencePulse.
       LDI R17,255
       Delay:
          nop nop nop nop nop nop nop nop
          nop nop nop nop nop nop nop
          DEC R17
       BRNE Delay
    .endm

    .macro Delay2      // Opóźnienie do konwersji Temperatury(44h).
       LDI R18,230
       Mnoznik1:
          DEC R18
          Delay1      // Opóźnienia podstawowe.
          Delay1
          CPI R18,1
       BRNE Mnoznik1   // Mnożenie powyższych opóźnień(R18=230).
    .endm

    .macro Wri0         // Wysłanie bitu "0" na linię.
       PortOut
       Cbi PORTA,7
       Ldi R19,160      // Opóźnienie ???us.
       Delay0
    .endm

    .macro Wri1         // Wysłanie bitu "1" na linię.
       PortOut
       Cbi PORTA,7
       Ldi R19,40
       Delay0
       Sbi PORTA,7
       Ldi R19,120      // Opóźnienie ???us.
       Delay0
    .endm

    .macro Recover      // Zwolnienie linii na T_recovery>1us.
       Ldi R16,0
       Out DDRA,R16
       Ldi R19,5      // Opóźnienie 1,875us.
       Delay0
    .endm

    Petla_Glowna:
    //<==================_MAIN_====================>

    // Stan niski na pin PA7(ATtiny26 generuje Reset).
    Wri0
    Delay1

    // Zwolnienie pinu PA7(ustawienie jako wejścia)...
    Recover
    //...i czekanie na odpowiedź DS18B20("presence pulse").
    Delay1
    // Odpowiedź na Reset jest(bo widzę na oscyloskopie).
     
    // Rozkaz Skip_ROM(CC_hex = 1100_1100_bin).
    Wri0
    Wri0
    Wri1
    Wri1
    Wri0
    Wri0
    Wri1
    Wri1
    Recover
    Delay1

    // Rozkaz Convert_T(44_hex = 0100_0100_bin).
    // Opóźnienia zależne od Delay0(R19 = 1 = jeden obieg = 0,375us).
    Wri0
    Wri0
    Wri1
    Wri0
    Wri0
    Wri0
    Wri1
    Wri0
    Recover

    // Czekanie na konwersję TEMP(>750ms = wyszło 780ms = 3*delay2).
    Delay2
    Delay2
    Delay2

    // Rozkaz Read_ScratchPad(BE_hex = 1011_1110_bin).
    Wri0
    Wri1
    Wri1
    Wri1
    Wri1
    Wri1
    Wri0
    Wri1
    Recover

    // Odbiór danych z DS18B20...
    // Oczywiście nic się nie dzieje...na oscyloskopie płaska linia...
    Delay2

    //<====================_END_===================>
    RJMP Petla_Glowna

    0
  • #21 05 Sty 2007 07:34
    zumek
    Poziom 39  

    Arnold_S. napisał:
    ...Okna czasowe są realizowane według zaleceń z datasheet układu DS18B20.

    Nie bardzo :(
    Zauważ , że każdy timeslot , kończy się zwolnieniem magistrali na >1us , a Ty nie robisz tego , kiedy wysyłasz bit o wartości "0".Gdybyś wysłał na magistralę kolejno 8 bitów o wartości "0" , to DS zinterpretował by to jako Reset(8x60=480).Musisz to poprawić , a wtedy "pogadasz" z DS-em ;)
    Założyłem , że obliczenia dotyczą 8MHz taktowanie proca , a więc początek timeslotu trwa za długo , bo 15us - skróć to do 2 uS.

    Tak w przybliżeniu powinno wyglądać przesłanie 1 bitu(timeslot)
    Wysyłamy "1"
    1wire=0
    czekaj 2us
    1wire=1
    czekaj 58 us

    Wysyłamy "0"
    1wire=0
    czekaj 58us
    1wire=1
    czekaj 2us

    Podane 58us nie jest krytyczne , a ja stosuję 48us.

    Jeśli zaś chodzi o sam program , to:
    a)Makra , to przydatna rzecz , ale ich nadużywanie , to marnotrawstwo pamięci programu :(
    b)Zastosuj jakieś pętle , bo to co masz teraz , wygląda ... nieciekawie ;)
    Tyle mojego ględzenia ;)

    Piotrek

    0
  • #22 05 Sty 2007 07:45
    ArteXL
    Poziom 24  

    Witam, jeżeli chodzi o różnice temperatury mierzonej termometrem bądź czujnikiem a temperaturą "odczuwalną", należy wziąść pod uwagę prędkość wiatru oraz wilgotność powietrza.

    pozdrawiam
    ArteXL

    0