Skocz do zawartości

DS18B20 różne pomiary w różnych układach


Karolus

Pomocna odpowiedź

Mam zbudowane dwa układy których jedna z funkcji jest pomiar temperatury, przy okazji kalibrowania nowo kupionych czujników odkryłem dziwną rzecz, tak dziwną że.... do tej pory zbieram "szczękę z podłogi" 😉

mierzę temperaturę w zbiorniku z cieczą, zakres pomiarowy to 20-35C, w obydwu urządzeniach wykorzystuje odczyt poprzez getTempCByIndex(i), rozdzielczość 12bit, oraz setWaitForConversion(1)

różnica odczytów wynosi ~1C, niby nie tak dużo, ale nie rozumiem dlaczego te same czujniki podpięte do dwóch różnych procesorów dają inne odczyty??

W obydwu układach są dwa termometry i oba zachowują się jednakowo,
jedyna różnica w sprzęcie jest taka że w pierwszym układzie każdy z DSów podpięty jest pod inną linię danych, a zasilanie jest również z pinu procesora (procesor zasilany 5V, więc zasialnie DSa coś w tej okolicy, oczywiście jest 4,7k między pinem zasilającym a danych), w drugim układzie oba DSy podpięte są na to samo wejście procesora a zasilane są bezpośrednio z VCC (3,3V), rezystor podobnie jak w pierwszym układzie 4,7k.

Gdyby to była transmisja analogowa to te różne napięcia mogłyby być źródłem błędów transmisji, ale przy cyfrówce nie powinno to mieć znaczenia (chyba)

długości przewodów nie przekraczają 2m, więc to raczej tez nie stanowi problemu.

Macie jakieś pomysły??

Edytowano przez Karolus
Link do komentarza
Share on other sites

  1. Czujniki mają rozrzuty produkcyjne więc każdy może pokazywać trochę inną temperaturę w tych samych warunkach. Jak rozumiem to uwzględniłeś albo przez kalibrację albo przez zamiany krzyżowe czujników i to nie jest główny problem.
  2. Czujniki pobierają prąd: mało gdy nic nie robią, dużo więcej gdy mierzą. Jeżeli każesz im mierzyć i wysyłać wyniki dość często, moc wydzielana w nich w czasie pracy podgrzewa strukturę i temperatura jedzie w górę. Jeżeli opornik 4.7k jest blisko czujnika to przy 5V i stanie niskim linii danych wydziela się na nim 5mW - to sporo i też jest cieplejszy niż otoczenie. Czujnik zasilany z 5V będzie w czasie pomiaru grzał się bardziej niż ten wiszący na 3V - to chyba jasne? Zajrzyj do danych katalogowych DS18B20 i napisz nam tutaj ile one biorą prądu w obu stanach. Jeśli uwzględnisz rezystancję termiczną obudowy, wyznaczysz sobie średni prąd zasilania i tym samym moc strat przy danym napięciu (sam wiesz jak często każesz im mierzyć i przeczytasz jak  długo trwa konwersja) to masz jak na dłoni rezultat: o ile wzrośnie w środku temperatura w czasie takiej pracy.
  • Lubię! 1
Link do komentarza
Share on other sites

Że czujniki mają rozrzut to oczywiste i tak jak pisałeś ten problem zmniejszam przez kalibrację z czujnikiem wzorcowym, natomiast ja przepinam fizycznie ten sam czujnik z jednego układu do drugiego i wtedy mam różnice w odczycie (czas przepinania to pojedyncze sekundy, więc raczej czujniki nie zdążą się w tym czasie ogrzać/oziębić).
Rezystor jest zamontowany na płytce, a czujniki wiszą na 2m kablach, więc podgrzewanie rezystorem to raczej nie jest.
Rozumiem też że czujnik który jest zawsze zasilany może się podgrzewać, ale żeby było śmieszniej to wyższe wskazanie mam w układzie zasilanym z 3V3 i przy zasilaniu z nóżki procesora (zasilane pojawia się tylko na czas odczytu).
Jak pisałem w obydwu przypadkach rozdzielczość jest 12bitowa (sprawdzałem też na niższej, wynik ten sam), korzystam ze środowiska IDE, w obu przypadkach oczywiście programy kompilowane z tymi samymi bibliotekami na tym samym komputerze. 

Więc tak naprawdę wszystko co napisałeś jest jak najbardziej sensowne i bardzo za nie dziękuje, ale.... u  mnie wygląda to dokładnie odwrotnie, dlatego pisałem o "zębach na podłodze" 😉

Link do komentarza
Share on other sites

1 godzinę temu, Karolus napisał:

zasilane pojawia się tylko na czas odczytu

Być może to jest problem, bo moim zdaniem  jest istotna zmiana trybu pracy. Taki czujnik musi mieć w środku jakieś referencje, źródła prądowe zasilające wzmacniacze analogowe itd itp. I teraz to wszystko pracuje dobrze gdy temperatura struktury jest stabilna i nie ma gradientów na samym krzemie. Być może włączając czujnikowi zasilanie tuż przed pomiarem nie dopuszczasz do stabilizacji termicznej chipu a być może są też zjawiska wolniejszego dochodzenia punktów pracy pewnych bloków do stanu stabilnego (takie czysto prądowo-napięciowo-czasowe typu RC). Spróbuj zatem a) nie wyłączać zasilania wcale lub b) załączać np.na 5/10/30s przed wystartowaniem pierwszego pomiaru, c) włączyć zasilanie i wykonać serię powiedzmy 100 pomiarów co 2s logując wyniki. Czy w takich wypadkach widzisz jakąś stopniową poprawę lub choćby dryft wyników?

EDIT: A swoją szczękę oszczędzaj, przyda się do innych celów. Tu nie ma żadnej magii, tylko zwykłe pomiary. Prędzej czy później znajdziesz rozwiązanie zagadki. To równie dobrze może być np. znacznie gorsze (w sensie zasyfione) zasilanie w jednym z przypadków, bo jest inny zasilacz, stabilizator czy dochodzi rezystancja wewnętrzna pinu procesora pracującego jako zasilanie.

Edytowano przez marek1707
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Zrobiłem właśnie mały eksperyment, wykorzystałem starą płytkę UNO, tam mam i 5 i 3V3, zasilałem tego samego DSa, leżącego w tym samym miejscu (nie dotykając go) , raz z 5V, raz z 3V3 a potem z wyjścia procesora (kluczując zasilanie tylko na czas pomiaru), efekt -> za każdym razem różnica w pomiarach zamyka się w +/- 0,1C, czyli dla 12bitowej rozdzielczości wygląda to na dwa bity.

Więc albo płytka którą miałem szczęście wlutować jest trefna (tylko co może być trefnego na samej płytce..... ) albo wytłumaczenie jest bardzo banalne i dlatego go nie widzę :(

acha, chcąc być pewnym że to nie jakieś nadpisanie zmiennych w programie, wgrałem wczoraj prościutki program który tylko inicjował DSy, odczytywał temperaturę i wyrzucał wynik na terminal, wyniki pomiarów takie same, tzn ~1 stopień niższe niż w drugim układzie.

Jakieś inne pomysły?

Link do komentarza
Share on other sites

Chciałbym dobrze zrozumieć co tam ostatnio robiłeś, bo trochę to skrótowo opisane. Wziąłeś więc UNO - tam wyprowadzony jest tylko procesor 5V. Standardy wszystkich sygnałów są 5V a masz tylko dodatkowe wyjście zasilania 3V - czy  tak? Podłączałeś do tego czujnik w konfiguracji 2- czy 3-przewodowej? Zmieniałeś tylko zasilanie? Bo jeśli zapodałeś mu 3V na VDD a sygnał z pinu procesora był 5V na DQ to czujnik zasilał się z tego wyższego, bo zawsze tak robi (ma w środku diody od DQ i VDD). Skoro szukasz po omacku, to musisz mierzyć i weryfikować napięcia na pinach czujnika - bez tego możesz wyciągać tzw. ruskie wnioski.

2 godziny temu, Karolus napisał:

płytka którą miałem szczęście wlutować

Co to konkretnie za płytka? Spróbuj pisać bardziej konkretnie, nie widzimy co masz na biurku a do tej pory o żadnym z układów używanych w eksperymentach (oprócz UNO ale tu też bez schematu można tylko się domyślać co tam namotałeś) nic nie wiemy. Wygląda, że problem leży poza samym DS18B20 i być może dotyczy konfiguracji jego otoczenia. Opisuj całe układy pomiarowe (także z czego je zasilasz) a nie tylko samo podłączenie czujnika.

Link do komentarza
Share on other sites

Ok, faktycznie troszkę z tego wyszło wróżenie z fusów.

Więc po kolei,:
1. DSy zawsze podpięte trzema przewodami
2. zaniżone wyniki mam na płytkach pro mini w wersji 8MHz/3V3, w nich zasilanie na DSy podaje bezpośrednio z pinu VCC modułu arduino czyli idzie 3V3, sama atmega zasilana jest z 3V3 więc na pinach też więcej nie będzie, podsumowując DSy zasilane są z 3V3, z rezystorem podciągającym 4k7 (to chyba może być problem, 4k7 przy 3V3 chyba jest za duży, przetestuje jak wrócę do domu)
3. pozostałe pomiary robiłem na modułach nano i uno,  zasilając DSy na wszystkie opisane w poprzednim poście sposoby.

Myślałem że jak podpinam DSy trój przewodowo to zasilane są z napięcia podanego na VCC, jeśli mimo takiego podpięcia potrafią się zasilić z linii danych, to dzisiejsze sprawdzenie było g... warte, być może o to właśnie chodziło, DZIĘKI wielki za podrzucony trop, być może o to właśnie chodzi, bo też uważam że to nie problem z samym DSem ale właśnie z układem pomiarowym, tyle że nie wiedząc o tym jak działa układ zasilania w samym DSie, nie widziałem różnicy.

Jak wrócę do domu zrobię dwa eksperymenty:
1. zmienię rezystor podciągający na 2k4 i zobaczę jak to wpłynie na wynik
2. ponieważ atmega "łyknie" na wejściu sygnały 5V to zmienię zasilanie czujnika na 5V (zachowując rezystor 4k7)

Potem napiszę co z tego wyszło, może moje "badania" przydadzą się innym 🙂

 

Link do komentarza
Share on other sites

Dobra, widzę, że będziesz sobie już dalej radził. Na pewno wynik pomiaru jest poprawny w tym sensie, że struktura czujnika grzeje się naprawdę. Z jakiego powodu - to musisz odkryć. Pierwszym strzałem jest oczywiście wyższe zasilanie lub.. większy prąd płynący przez rezystor podczas transmisji. Co prawda większość energii wydziela się na nim, ale przecież tranzystor na krzemie nie robi dokładnie 0V w stanie niskim więc trochę ciepła też dostaje. Dlatego żeby było "sprawiedliwie" system pracujący na 3.3V powinien mieć trochę większy rezystor.

Niepokoi mnie zdanie: 

19 minut temu, Karolus napisał:

atmega "łyknie" na wejściu sygnały 5V

Łyknie gdy sama ma zasilanie 5V. Absolutnie nie możesz jej podawać sygnałów wejściowych wyższych niż jej własne Vcc. Z powodu tego, że podczas komunikacji z DS18B20 pin procesora pracuje w każdym możliwym stanie (wejście, wyjście w stanie 0 i silne wyjście w stanie 1 czyli de facto zwarcie pinu do własnego Vcc) nie możesz mieszać tu napięć. Musisz zrobić środowiska homogeniczne (procesor = czujnik): albo wszystko na 5V albo całość na 3.3V.

No i czekamy na wnioski 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

hmmmmm wydawało mi się że atmega toleruje na I/O poziom 5V przy zasilaniu 3V3, ale właśnie sprawdziłem w karcie katalogowej i niestety masz rację 😞, czyli jeśli zmiana rezystora nie pomoże to pozostaje mi zasilenie z DSa z 5V i dodanie konwertera poziomu z 5 na 3V3 między DQ a wejściem procesora... tylko że dla 3V3 to chyba jednak rezystor powinien być mniejszy a nie jak napisałeś większy, z tego co znalazłem w necie wydajność prądowa zasilania DSa powinna być ~1mA, czyli przy 5V ~4k7, a przy 3V3 coś koło 3k , prawda?

Link do komentarza
Share on other sites

No jasne, przy 3.3V rezystor powinien być mniejszy 🙂 

Jeśli chcesz wiedzieć ile DS jest w stanie pochłonąć prądu z opornika, to musisz spojrzeć na wiersz "Sink current" i masz tam 4mA. To jest gwarancja producenta, że przy wpychaniu tych 4mA napięcie w stanie niskim na linii DQ nie będzie większe jak 0.4V, co zupełnie spokojnie wystarcza do identyfikacji stanu 0 przez drugą stronę. Niestety to oznacza także, że 4mA*0.4V daje 1.6mW mocy w samym tranzystorze wyjściowym w czujniku. Dlatego prąd ten także powinien być minimalizowany i tylko tak duży jak tego wymaga okablowanie. Opornik podciągający odpowiada za "parkowanie" linii DQ w stanie wysokim. Ponieważ druty mają swoje pojemności tworzy się układ RC: im więszy opornik (a więc im mniejszy prąd ładujący pojemność kabla) tym czas "dojazdu" sygnału DQ z aktywnego zera do pasywnej jedynki jest coraz dłuższy i przy pewnej wartości prądu zaczynają łamać się reguły czasowe protokołu 1-wire. Przy 5V ograniczenie prądu pinu DQ zostaje zachowane aż do wartości 1.2kΩ, ale jeśli te 2m przewody dobrze działają z 4.7k to ja bym zostawił. Ewentulanie zmienił na jakieś 3.3k dla 3.3V.

Przy pracy 2-przewodowej, do pojemności kabla dochodzi jeszcze wewnętrzny kondensator samego czujnika - on też "wciąga" ładunek podczas narastania napięcia na linii DQ i dlatego producent rekomenduje tam 4.7k. Teoretycznie w konfiguracji 3-przewodowej i krótkich połączeniach (czujnik na tej samej płytce co procesor?) mógłby wystarczyć sam opornik podciągający pin procesora - jak czasami robi się w I2C.

Ew. konwerter musi być dwukierunkowy, ale ja zamiast tego wziąłbym jakąś płytkę typu Nano Pro w wersji 3.3V/8MHz (goły procesor) i zasilił ją "od tyłu" czyli przez pin Vcc raz z 3.3V a raz z 5V. Wtedy masz czystą sytuację. W drugą stronę (procesor 5V/16MHz) będzie trudniej, bo AVR może nie zadziałać z taką prędkością na Vcc obniżonym do 3.3V.

 

  • Lubię! 1
Link do komentarza
Share on other sites

Ech, nadal jestem głupi, żeby nie powiedzieć głupszy.....

Ponieważ dręczy mnie trochę ten problem różnych odczytów (a lubię wyjaśniać takie sprawy :)) to dalej ciągnę eksperymenty....
Wczoraj zmontowałem na szybko małą płytkę i testowałem różne podłączenia DSa (w sensie różne piny arduino i różne wartości rezystorów), zawsze efekt ten sam, w gotowym urządzeniu mam zaniżony pomiar, na płytce zewnętrznej pomiar jest OK.
Niestety nie znalazłem w domu żadnego tranzystora unipolarnego żeby na szybko zrobić konwerter poziomów, więc eksperymenty w domu zakończyły się bezowocnie.
Potem wpadłem że na jednej płytce prototypowej zamontuje pro mini 3V3 i nano 5V, tak też dziś rano zrobiłem, w obu przypadkach zasilanie z portu USB (pro min zasilane poprzez stabilizator na konwerterze RSa, nano bezpośrednio z USB), do obydwu płytek podpinam naprzemiennie tego samego DS, podłączenie trój przewodowe, napięcie zasilające podane na sztywno z pinu VCC arduino (dla pewności zmierzone napięcia na VCC i DQ DSa przy pro mini 3V3, przy nano 5V), w obu przypadkach podciąg poprzez 4k7.

Efekt .... w obu przypadkach w zasadzie IDENTYCZNE pomiary!!!

zaczynam coraz bardziej wierzyć że albo jakaś trefna seria DSów mi się trafiła (może jakieś pseudo DSy od żółtych braci), albo coś jest nie tak na płytce mojego urządzenia (jakieś delikatne przywarcie, albo coś w tym stylu), niestety nie posiadam w domu oscyloskopu i nie jestem w stanie na szybko go załatwić, żeby zobaczyć czy po zasilaniach jakiś syf nie gania, ale nie bardzo wierze żeby to było to.

Chyba zacznę montować drugą płytkę swojego urządzenia, niestety w tej co mam przez nie uwagę zamiast wlutować arduino w podstawkę, wlutowałem je bezpośrednio w płytkę, więc nie mam możliwości szybkiej podmiany 😞

Ręce opadają, niby problem prosty, a taki skomplikowany .... 

Link do komentarza
Share on other sites

Rzeczywiście, dziwna sprawa. Czyli wiesz już, że problem przenosi się z Twoją tajemniczą płytką, a w zasadzie występuje tylko z nią, czy tak? Jak rozumiem jest to jakiś "mainboard" niosący na sobie płytkę Arduino (jakie?) i pewne otoczenie: zasilanie(?), złącza(?), inne czujniki(?), interfejs użytkownika(?) itd. Zastanawiam się jaki jest model błędu. Jeżeli jest to problem zakłóceń i wpływają one w sposób tendencyjny na wyniki obniżając mniej więcej równomiernie pomiary o ten 1°C, to w dłuższych seriach powinno być średnio to samo. Natomiast jeśli to jakieś przywarcie wymuszające przepływ prądu przez czujnik i grzanie się jego struktury to powinien być widoczny trend. Jakie są wyniki serii 20 czy 100 pomiarów w odstępach np. 1s? Próbowałeś to robić? Czy widać jakiś wzrost i dochodzenie do wartości ustalonej? Acha, czy już wiesz na pewno, że ta feralna płytka+czujnik daje wyniki zmniejszone względem wszystkich innych układów i czujników czy jest odwrotnie: "podejrzany" układ daje więcej niż średnia ze wszystkich "dobrych" zestawów? Bo jeśli mniej, no to dodatkowe grzanie można, wbrew moim/naszym podejrzeniom  wykluczyć. Pozostaje wtedy wpływ zakłóceń impulsowych/szumowych lub przynajmniej na tyle szybkich, że nie widzisz ich multimetrem zapiętym na zasilaniu czujnika. Czy w konfiguracji 3-przewodowej próbowałeś blokować zasilanie tuż przy czujniku kondensatorami np. 100nF+10uF?

Jak rozumiem kable też można wykluczyć włącznie z zakłóceniami generowanymi przez inne urządzenia i wpływającymi na te przewody, bo mierzyłeś ten sam czujnik w tym samym środowisku na tym samym przewodzie zmieniając tylko płytkę procesora, czy tak?

  • Lubię! 1
Link do komentarza
Share on other sites

Więc tak, żeby było jasne co i jak, urządzenie to sterownik do akwarium (kiedyś w DIY opisywałem go) mierzę temperaturę dwoma DSami, a dodatkowo ze starszego układu pomiarowego został mi DS podpięty do RBpi ) dlatego wykryłem te dziwne odczyty i rozpoczęło się tropienie problemu).

Co do samej płytki to nie ma tam nic specjalnego, 3x kanał PWM na IRFie, 4x przekaźnik, wejście na DSy magistrala I2C na której wisi LCD, RTC i PCF8574 o sterowania w/w przekaźnikami, do tego kilka przycisków podpinanych bezpośrednio pod port arduino i buzzer (jak widać nie jest do zbyt skomplikowane urządzenie), acha łączność bezprzewodowa z otoczeniem poprzez NRF24 i bibliotekę mysensors.
Na płytce jest przetwornica 12V/5V (chińszczyzna za 3PLN) ona zasila między innymi arduino (poprzez wejście RAW), być może to jej sprawka, muszę popatrzeć czy mam jakiś liniowy stabilizator może to dobry trop... ale przy niej dosyć duże elektrolity (może przesadziłem i coś się wzbudza...), zasilanie arduino i nrfa odsprzęglone elektrolitami, przy samych pinach.

Dane z wszelkich czujników idą do domoticza i są tam logowane, jak podglądam historię pomiarów z DSów podłączonych do sterownika i nałożę je na historię pomiarów z DSa podłączonego do RBpi to wszelkie trędy temperaturowe są zachowana, widać tylko przesunięcie krzywych historii pomiarów. Więc wszystko wskazuje na stały błąd odczytu i zdecydowanie jest to zaniżenie pomiaru (więc grzanie mi tu nie pasuje....).

Dodatkowo podłączyłem przed chwilą ten feralny czujnik trój przewodowo do "gołego" arduino pro mini 3V3 (dokładnie takie samo jak w feralnym urządzeniu) i.... wynik pomiaru prawidłowy.

Jeśli chodzi o kondensatory to mogę spróbować podczepić coś tylko w okolicy złącza na płytce (ale wtedy i tak po drodze będzie 2m przewodu), przy samym czujniku nie ma mowy to wersję wodoodporne.

 

EDIT: chyba znalazłem DSy (ze starszego zakupu) które działają poprawnie!!!, żeby być pewnym na 100% muszę przedłużyć im kable i "utopić" je w akwarium...

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.