logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

DS18B20 zawyża temperaturę powyżej 15°C - wada fabryczna?

patrx 09 Kwi 2008 19:25 2160 14
REKLAMA
  • #1 5012186
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Witam,
    DS18B20 mierzy mi dokładnie od 0 do ok 15'C a powyżej tego zawyża temperaturę - maksymalnie o ok. 3,5'C. Podejrzewam że to jakaś wada fabryczna, czujnik kupiony na allegro. Co robić? Może ktoś sprawdzi u siebie te czujniki z allegro?

    Pozdrawiam
  • REKLAMA
  • #2 5012208
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    na allegro sie nie kupuje takich częsci :D
    Myslisz ze dlaczego to ktos sprzedawał? Bo wadliwe...
    Powiem więcej: gość opychający te częsci moze kupił "próbkowa" serie lekko "innych technicznie" czujników za psie pieniądze...
    Poza tym: zainwestuj 7.50 w NOWY czujnik ( ze sklepu, nie allegro) i zobacz czy masz taki sam rozrzut.

    Jesli tak, to
    a) masz cos z zasilaniem
    b) masz cos z przewodem
    c) zdaje sie ze czujnik sie z blizej nieokreslonych powodów może grzać, po czym mierzy swoją własną "podgrzaną" temperature. Sprawdz zasilanie.

    Jak zasilasz czujnik? parasite czy oddzielny przewód?
    Ilubitową rozdzielczość stosujesz do konwersji?
  • REKLAMA
  • #3 5012249
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Zasilanie jest zewnętrzne na 3 przewodach. Wiem, muszę kupić czujnik w normalnym sklepie bo te z allegro to wszystkie 10szt mi tak działają :(
  • #5 5012381
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Nie napisałeś jak doszedłes do tego ze tak przekłamują? Może jest odwrotnie
  • #6 5012422
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Dzięki za zainteresowanie.
    Czujniki mam następujące:

    DALLAS
    18B20
    0729C3
    +326AG


    Wskazania porównywałem z termometrem rtęciowym. Całośc zanużona w wodzie, czujnik w rurce termokurczliwej.

    Ja nie wiem co to ma być:( Wczoraj na dodatek zamówiełm dodatkowo 20 sztuk bo jeszcze nie wiedziałem, że takie problemy są.
  • REKLAMA
  • #7 5013462
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Koledzy dobrze sugerują, że powodów może być kilka. Trudno podejrzewać, że wszystkie mają tą samą wadę. Proponowałbym zmianę zasilania na dwu przewodową, gdyż zniknie możliwość podejrzewania o złe zasilanie termometru. Może jakiś błąd w programie...?. Prześlij to może tam czegoś będzie można się doszukać.
    Pozdrawiam
  • #8 5014269
    rybol
    Poziom 21  
    Posty: 529
    Pomógł: 19
    Ocena: 4
    w czym pisales program? czy masz poprawne opoznienia? potrzeba ok. 750ms.. (moze masz zla wartosc)
  • #9 5014998
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Program napisany jest w asemblerze. Każdorazowo odczekuję na zakończenie konwersji czyli nie jest na sztywno ustawiony czas opóźnienia.

    Najgorsza jest ta nieliniowość, bo gdyby w całym zakresie zwiększał o stałą wartość to można by dorzucić w programie kalibrację.

    Dziś szukałem czujników po sklepach w mojej miejscowości ale niestety nigdzie nie ma. Nie mam więc możliwości porównania wskazań z czujnikami z innej serii produkcyjnej. :(
  • #10 5015086
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Jak oczekujesz na zakonczenie konwersji? Bo jezeli w trybie parasite to nie ma takiej mozliwości żeby wiedziec kiedy sie konczy konwersja. Nalezy czekac tyle ile napisane w nocie katalogowej i juz. Trudno zgadywać ale może źle coś robisz przy przeliczaniu temperatury?
    Z drugiej strony iloma termometrami rtęciowymi sprawdzałeś bo to może rtęciowe cos mają źle?
  • #11 5015588
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Czujnik pracuje w trybie z zewnętrznym zasilaniem na trzech przewodach.
    Przy pomiarze czekam w pętli na impuls zgłaszający koniec konwersji.

    Cytat:
    Z drugiej strony iloma termometrami rtęciowymi sprawdzałeś bo to może rtęciowe cos mają źle?


    Jak narazie sprawdzałem jednym ale jestem przekonany że zawyża - przy pomiarze temp. ludzkiego ciała pokazuje 40"C. Dziwne jest to że od 0 do 18'C wskazania są poprawne choć możliwe że właśnie tu rozjeżdża się termometr rtęciowy. Jak by się okazało żę ds18b20 zawyża w całym zakresie o te 3,5'C to już by było dobrze. Muszę to jeszcze sprawdzić.
  • Pomocny post
    #12 5015740
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Jakoś nie spotkałem sie z takimi zjawiskami. Mam czujniki z róznych serii nawet z 1995 roku i wszystki wskazują jednakowo (w granicach tolerancji max 0.8 stopnia różnicy. Terstuje poprzez podłączenie 10-20 czujników równocześnie.
    Dobry termometr labolatoryjny kosztuje koło 100zł - taki masz?
  • #13 5016290
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    patrx napisał:

    Jak narazie sprawdzałem jednym ale jestem przekonany że zawyża - przy pomiarze temp. ludzkiego ciała pokazuje 40"C.


    Weryfikacja wskazań z termometrem rtęciowym niewiadomej klasy mija się z celem. Tak jak pisał asembler mnie też wszystkie DS'y działały w granicach błędu z noty katalogowej. Jeżeli zdobędziesz drugi i będą podobne zjawiska to masz skopaną procedurę przeliczania.
    A zlinearyzowanie wskazań w kilku punktach to nie problem :wink:.
  • REKLAMA
  • #14 5016955
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Problem rozwiązany! W programie znalazł się mały błąd ale za to tragiczny w skutkach. Całkowitą część pomiaru wymnażam x10 i dodaję do tego część dziesiętną. Kompletny wynik temperatury mam więc na dwóch bajtach i porównuję to z wartością zadaną termstatu. Wszystko świetnie tylko że to wymnażanie x10 robiłem pośrednio - w pętli która dzesięć razy dodaje do siebie wynik. Okazało się, że pętla owszem wykonywana była dziesięć razy ale w komórkach na start była już wartość załadowana więc w sumie dodawałem to 11 razy. I stąd przekłamania! To jest właśnie pisanie programów w asemblerze - byle przeoczenie, pomyłka i nie ma przebacz.

    Dziękuję wszystkim za cenne podpowiedzi.
    Pozdrawiam
  • #15 5020830
    datch
    Poziom 13  
    Posty: 70
    Pomógł: 2
    Ocena: 6
    Witam tez mam problem z tym termometrem, podczas czytania mam tylko 0xff, czyli w sumie nie odpowiada szukałem błędu w programie no i nic, tu zamieszczam procedury i fragment kodu. Wiem ze nie jest za ładnie napisane, ale dopiero się uczę.(Jak bedzie działac to poprawię)

    
    .equ pDS = PORTD				;port ds'a
    .equ uDS	= pDS -1			;do ustawienia portu ds'a
    .equ pinDS = pDS -2				;do ustawien portu ds'a
    
    ;---------------------macra------------------------------------
    .macro DQ_0
    	sbi uDS,DS
    	cbi pDS,DS
    .endm
    .macro DQ_1
    	cbi uDS,DS
    	sbi pDS,DS
    .endm
    
    ;------------------------------------------------------
    .cseg
    .org 0
    rjmp Reset
    
    Czekaj:					;jeden cykl czeka kolo 10us
    	ldi acc1,0
    	petla:
    		inc acc1
    		nop
    		nop	
    		nop
    		nop
    		nop
    		nop
    		nop
    		cpse acc1,wait	;pomin jesli rowne
    		rjmp petla
    ret
    Czek5us:
    	nop
    	nop
    	nop
    	nop
    	nop
    ret
    Czek1s:
    	ldi acc2,200
    	ldi wait,200
    	petla1:
    		dec acc2
    		rcall Czekaj	
    		rcall Czekaj
    		rcall Czekaj
    		ldi acc1,0
    		cpse acc1,acc2
    		rjmp petla1
    ret
    
    
    
    ;-----------------------procedury ds18b20-------------------------
    
    ResDS:
    	DQ_0
    	ldi wait,60
    	rcall Czekaj
    	DQ_1
    	ldi wait,10
    	rcall Czekaj
    	sbic pinDS,DS
    	rjmp ResDS
    	ldi wait,60
    	rcall Czekaj
    ret
    
    OneBitWriteDS:
    	DQ_0
    	rcall Czek5us			;czekaj okolo 5us
    	sbrc acc3,0				;jezeli pierwszy  bit acc3 jest "0" to pomini DQ_1
    	cbi uDS,DS
    	sbrc acc3,0
    	sbi pDS,DS
    	ldi wait,8
    	rcall Czekaj			;czkej okolo 80us
    	DQ_1
    ret
    OneBitReadDS:
    	DQ_0
    	rcall Czek5us
    	DQ_1
    ;	rcall Czek5us			;czekaj okolo 5us
    	ldi acc3,0b10000000
    	sbis pinDS,DS			;jezeli pinDS nie jest zerowy to ustawi acc3,0x80
    	ldi acc3,0
    	ldi wait,6
    	rcall Czekaj			;czekaj oklolo 60us
    ret
    WriteDS:
    	mov acc3,acc2
    	rcall OneBitWriteDS
    	lsr acc3					;przesun logicznie acc1 w prawo
    	rcall OneBitWriteDS
    	lsr	acc3
    	rcall OneBitWriteDS
    	lsr	acc3
    	rcall OneBitWriteDS
    	lsr	acc3
    	rcall OneBitWriteDS
    	lsr	acc3
    	rcall OneBitWriteDS
    	lsr	acc3
    	rcall OneBitWriteDS
    	lsr	acc3
    	rcall OneBitWriteDS
    ret
    ReadDS:
    	ldi acc2,0
    	rcall OneBitReadDS
    	mov acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    	rcall OneBitReadDS
    	lsr acc2
    	add acc2,acc3
    ret
    
    //reset itp obsluga wys itp
    
    rcall ResDS
    
    ldi acc2,0xCC
    rcall WriteDS			;skip rom
    
    ldi	acc2,0x44			;pomiar
    rcall WriteDS			
    
    rcall Czek1s
    
    rcall ResDS
    ldi acc2,0xCC
    rcall WriteDS
    ldi acc2,0xBE
    
    rcall ReadDS
    mov lsb,acc2
    rcall ReadDS
    mov msb,acc2
    
    


    oo zapomniałbym ma to działac na atmedze8 na wewnetrznym gen. 1mHz
    czyli jeden nop to okolo 1us jezeli sie nie myle. Z góry dzieki.

    Jeszcze dodam ze ds odpowiada na reset (tak mi sie wydaje bo przechodzi przez petle zwarata w procedurze.

Podsumowanie tematu

✨ Problem dotyczył czujników temperatury DS18B20 zakupionych na Allegro, które poprawnie mierzyły temperaturę od 0 do około 15°C, a powyżej tej wartości wskazywały zawyżone odczyty nawet o około 3,5°C. Podejrzewano wadę fabryczną, jednak dyskusja wykazała, że przyczyną mogą być błędy w oprogramowaniu, zasilaniu lub metodzie pomiaru. Czujniki były zasilane zewnętrznie na trzech przewodach, a pomiar realizowany w asemblerze z oczekiwaniem na sygnał zakończenia konwersji. Wskazania porównywano z termometrem rtęciowym, jednak pojawiły się wątpliwości co do jego dokładności. Ostatecznie problem rozwiązał błąd w kodzie asemblera – niepoprawne mnożenie wyniku pomiaru przez 10, spowodowane nadliczbowym dodaniem w pętli sumującej, co prowadziło do systematycznego zawyżenia temperatury. Zalecano zakup czujników z oficjalnych sklepów, a nie z Allegro, oraz weryfikację poprawności procedury przeliczania temperatury i zasilania. Dyskusja podkreśliła znaczenie dokładnej kalibracji i testów w różnych warunkach oraz poprawnej implementacji protokołu pomiarowego DS18B20.
Wygenerowane przez model językowy.
REKLAMA