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

[AVR] - [Bascom] Czas odczytu 15szt DS18B20

Jacek Rutkowski 26 Gru 2013 00:57 6507 47
  • #1 26 Gru 2013 00:57
    Jacek Rutkowski
    Poziom 24  

    Witam,
    potrzebuję odczytywać przez ATMEGE temperatury z 15 punktów w zakresie -30 do 95°C z dokładnością 0,5°Club lepszą (pomiar temperatury wewnątrz i zewnątrz pomieszczeń oraz kotła C.O. i bojlera). Obecnie wykorzystuję czujniki LM35 podpięte pod ADC0-ADC6 oraz przez multiplekser CD4051 do ADC7. Dokonuję po 9 pomiarów z każdego kanału odrzucając 1 pomiar i uśredniając pozostałe 8. Kolejne odczyty z jednego czujnika różnią się między sobą max o 0,4°C co jest dla mnie w zupełności wystarczające. Niestety odczyty i przeliczenia wszystkich temperatur zajmują obecnie przy kwarcu ATMegi 14,58MHz ok 40ms.
    Zastanawiam się czy zmiana czujników na DS18B20 spowoduje skrócenie tego czasu.
    Pomiary wystarczyły by jednokrotne ale nie umiem oszacować czasu transmisji dla 15 czujników z wykorzystaniem adresowania 64bit.
    Czy jest ktoś kto ma podobny system i może podać przybliżony czas odczytu?

    0 29
  • Sklep HeluKabel
  • #2 26 Gru 2013 10:14
    Kuniarz
    Moderator Projektowanie

    DSy potrzebują 750ms na pomiar i konwersję danych, ale po wysłaniu komendy, procek może zająć się czymś innym i odpytać ponownie czujniki po tym czasie. Tak z ciekawości - po co Ci aż taka szybkość pomiaru temperatury, która i tak zmienia się powoli ?

    0
  • #4 26 Gru 2013 11:22
    Jacek Rutkowski
    Poziom 24  

    Dokładność DS-a jest wystarczająca dla mnie jednak jak pytałem nie chodzi mi o czas konwersji a o sam czas komunikacji z czujnikami z wykorzystaniem adresowania.
    Tzn. daję komendę konwersji, robię 100 innych rzeczy i odczytuję. Pomiary będą co np. 10s ale procesor to ATMega128 która ma sterować piecem, cyrkulacją CWU zależnie od obecności domowników, pompą CO, oświetleniem schodów, monitorować zużycie prądu, wody, zapisywać logi na karcie SD, sterować częścią urządzeń w domu oraz komunikować się z routerem z OpenWRT. Nie chcę wykorzystywać do wszystkiego samego Routera ze względu na topologię systemu i szukam sposobu na szybkie odczyty temperatur. Odczyt wejść cyfrowych i zapis do wyjść to nie problem nawet przy 64 wejściach i wyjściach.

    0
  • #5 26 Gru 2013 15:16
    yokoon
    Poziom 28  

    Witam.

    A ja wiem, iż DS18B20 mają tolerancję +- 0,5 stopnia.

    Sprawdzałem z termometrem fabrycznym (elektronicznym) w zakresie 10 - 30 stopni.

    0
  • Sklep HeluKabel
  • #6 26 Gru 2013 16:00
    rafikAVR
    Poziom 16  

    yokoon napisał:
    Witam.

    A ja wiem, iż DS18B20 mają tolerancję +- 0,5 stopnia.

    Sprawdzałem z termometrem fabrycznym (elektronicznym) w zakresie 10 - 30 stopni.

    DS18B20 ma rozdzielczość 0.065C przy 12bitach rozdzielczości i czasie konwersji 750ms

    Hmm czas konwersji DS'a zależy od rozdzielczości z jaką odczytujemy temperaturę

    Ja odczytuje temp z 64 dsów w czasie 1s wszystko ,czas kowersjii o timer i inkrementację licznika :D

    0
  • #8 26 Gru 2013 17:40
    yokoon
    Poziom 28  

    piotrva napisał:
    Tak, mają dokładność +- 0,5*C, ale Twój termometr odniesienia to jaką miał dokładność?


    Nie chodziło mi o dokładność ale o róznicę pomiedzy "fabryką" a DS'ami.

    Np. fabryka 20*C
    4 Dsy od 19.5 - 20.5*C

    Czujniki leżały obok siebie.

    0
  • #9 26 Gru 2013 18:40
    piotrva
    Moderator na urlopie...

    Ale jaki to miałeś termometr?
    Co to za fabryczny cud?
    Ja akurat testowałem ds'y w zakresie 0-100 i niestety bliżej 100 już względem laboratoryjnej rtęciówki miał w zależności od egzemplarza nawet 2 stopnie różnicy. Nawet w 20 stopniach ds'y względem siebie mają 0,25-0,5 rozrzutu. Stąd w swojej aplikacji precyzyjnego termometru zastosowałem lm35caz, które kalibrowałem w kilku punktach względem dokładniejszego termometru i udało się dojść do +-0,1

    0
  • #10 26 Gru 2013 22:40
    Jacek Rutkowski
    Poziom 24  

    rafikAVR napisał:
    Hmm czas konwersji DS'a zależy od rozdzielczości z jaką odczytujemy temperaturę

    Ja odczytuje temp z 64 dsów w czasie 1s wszystko ,czas kowersjii o timer i inkrementację licznika :D

    Kolego po raz kolejny powtarzam, nie interesuje mnie czas konwersji a sam czas transmisji ramek danych po 1W.
    Odczyty będą co np. 10s ale chcę wiedzieć ile czasu potrzebuję na odczyt danych z 15DS-ów np. po 1 sekundzie od wydania komendy do wszystkich DS-ów o rozpoczęciu konwersji.
    Proszę czytajcie ze zrozumieniem :cry:

    Dokładność DS-ów i innych podobnych wystarczy to ma służyć do sterowania automatyką pieca CO, CCWU itp. nie chcę pomiarów laboratoryjnych ponieważ czujniki umieszczę w puszkach podtynkowych wystawione tylko czołem z zaślepki.
    Ich wskazania nie będą w 100% prawdziwe ale będą pokazywać trendy.

    0
  • #11 27 Gru 2013 00:36
    Mateusz@
    Poziom 17  

    Chyba niektórzy tutaj sobie posty nabijają albo nie umieją czytać ze zrozumieniem.
    Chwilowo jestem na wyjeździe i nie mam dostępu do sprzętu żeby to sprawdzić w realu ale sprawdziłem w symulatorze.
    Wykonanie takiego fragmentu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Trwa niecałe 20ms. Ale większość czasu zajmuję 1wverify Dsid1(1). Symulowałem to bez dyrektywy $sim. Cyba bez dyrektywy pokazuje rzeczywisty czas wykonywania programu?

    0
  • #12 27 Gru 2013 13:53
    tank_driver
    Poziom 16  

    Na upartego mogę się pobawić dziś wieczorem, wykorzystam TIMER1 do określenia czasu wykonywania tych instrukcji w rzeczywistym układzie. Mateusz dobrze wykombinował, chociaż w/g mnie symulator pewnie nie bierze pod uwagę wielu rzeczy, w tym odpowiedzi ze strony 1WIRE (teoretycznie powinny się one trzymać sztywnych ram czasowych i nie wpływać na prędkość wykonywania instrukcji, ale tyle teoria).
    Tutaj (choć program w C) są dobrze opisane ramy czasowe na magistrali: http://www.jaglarz.com/ja/elektronika/ds18b20.pdf
    Dam znać dziś/jutro, jak już to przećwiczę "na żywo".

    0
  • #13 27 Gru 2013 14:18
    piotrva
    Moderator na urlopie...

    Ja jeszcze dostępu do sprzętu nie mam, ale na pewno ten fragment odczytu nie jest prawidłowy - nie zawiera odczytu całej pamięci a przede wszystkim nie sprawdza sumy kontrolnej CRC odebranych danych - dzięki temu możemy mieć śmieci, które układ uzna za prawidłowy odczyt.

    0
  • #14 27 Gru 2013 18:52
    Jacek Rutkowski
    Poziom 24  

    Interesuje mnie sprawdzenie w realu i najlepiej z sumą kontrolną. Jednak jeśli to jest 20ms na czujnik to i tak mija się z celem. Zależy mi na szybkim odczycie a jak widać ADC jest prawdopodobnie szybszy nawet przy 64 pomiarach. Dokładność 1°C i rozdzielczość 0,1°C jest dla mnie w zupełności wystarczająca. Takie parametry na wewnętrznym ADC uzyskuję.
    Mam topologię gwiazdy ze skrętką cat 5e łącznie ok 150m.
    Czy w takim układzie odczyty z DS-ów są możliwe?

    0
  • #15 27 Gru 2013 19:54
    tank_driver
    Poziom 16  

    Ja nie ryzykuję linii dłuższych niż 50m, chociaż środowisko pracy jest dosyć trudne - blisko skrętki 1wire (w zasadzie TWO WIRE) pracują silniki 3 fazowe po 110kW, często hamowane prądem stałym.
    Maxim twierdzi że można i 500m: http://www.maximintegrated.com/app-notes/index.mvp/id/148
    Nie sprawdzam CRC a błędy zdarzają się raz na kilkadziesiąt pomiarów, szczególnie w czasie rozruchu/hamowania silników. Radzę sobie tak że odrzucam pomiar który jest inny od ostatniego o 2 stopnie (przy czym "ostatni" zapisuję w zmiennej temp do kolejnego porównania), choć to "druciarstwo".
    Aż mnie oświeciło że mogę posilić się CRC:)

    A układ mogę sprawdzić po nowym roku, zabrałem ze sobą Arduino, ale nie mam DS-ów. Chociaż wydaje się że nie ma opcji aby odczytać 15 czujników DS z CRC szybciej niż LM-y po ADC, wysłanie 1 bitu 1W już wymaga 100uS WAIT-ów, gdzie tam reszta komunikacji.

    Pozdrawiam,
    TD

    0
  • #16 01 Sty 2014 15:39
    yokoon
    Poziom 28  

    Kuniarz napisał:
    DSy potrzebują 750ms na pomiar i konwersję danych, ale po wysłaniu komendy, procek może zająć się czymś innym i odpytać ponownie czujniki po tym czasie. Tak z ciekawości - po co Ci aż taka szybkość pomiaru temperatury, która i tak zmienia się powoli ?


    Witam.

    Mam wykonany termometr jednopunktowy na DS18B20 i ATtiny2313.

    W celu nauki i sprawdzenia działania instrukcjji Waitms 750, ja w jej miejsce wstawiłem Timer1 oczywiście skonfigurowany.

    F_cpu = 1000000

    Taimer1 = Timer , Prescale = 1024

    Część odczytu wygłąda tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Program działa prawidłowo.

    W celu sprawdzenia działania usunąłem obie instrukcje:Load i Waitms.

    Po kompilacji i wgraniu programu do procka, dalej był prawidłowy odczyt.
    Obok miłem drugi identyczny zestaw z instrukcją Waitms.

    Co o tym sądzicie ?
    Może działał dlatego, iż był tylko jeden DS.

    0
  • #17 01 Sty 2014 16:09
    piotrva
    Moderator na urlopie...

    Nie, program zadziała nawet przy odczycie od razu po convert_t. Otóż ds w rejestrze cały czas trzyma dane, a są one zmieniane tylko po pomiarze, czyli po ok. 750ms od polecenia konwersji(przy tej resolution).
    Wtedy jednak narażamy się na błędy odczytu, gdy trafimy na moment update rejestrów ds'u.

    0
  • #18 01 Sty 2014 17:27
    yokoon
    Poziom 28  

    Dzięki za podpowiedź.
    Czyli jak zrozumiałem to:

    1wwrite &HCC - pierwszy odczyt do rejestru

    1wwrite &H44 - konwersja

    a Waitms to czas na konwersję.

    0
  • #19 01 Sty 2014 17:48
    tank_driver
    Poziom 16  

    Tutaj masz piękny opis jak to działa i jak to obsłużyć w programie.

    0
  • #20 01 Sty 2014 22:01
    Tom1988p
    Poziom 16  

    Tak czytam i mam wrażenie ze te czujniki chcesz odczytać jeden po drugim co 10s, nie lepiej będzie odczytywać grupami np. po 3 czujniki co 2s?

    Czujnik obsługuję z pomocą timera:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Pisze w C ale komentarze powinny wyjaśnić co i jak działa.

    0
  • #21 02 Sty 2014 08:35
    Jacek Rutkowski
    Poziom 24  

    Wszystkim czujnikom chcę wydać komendę konwersji a następnie po 10 sekundach chcę odczytać wszystkie 15szt, wydać polecenie konwersji odczyt po 10s i tak w kółko.
    Jednak moja ATMega ma wiele innych rzeczy do roboty w głównej pętli i nie chcę aby odczyty temperatur zajmowały jej sekundę czy dwie z tych 10s. Obecnie na 15szt LM35 i wewnętrznym ADC uzyskałem ok 40ms na konwersje i obliczenia i chcę ten czas ograniczyć ponieważ w przerwaniach będzie obsługa czujek ruchu, licznika energii elektrycznej, komunikacji po USART, sterowanie wentylatora i pomp do C.O. i C.C.W.U. zapis logów na karcie SD itp co będzie już zajmować łącznie ok 20% czasu procesora w przerwaniach i pętli głównej a mam jeszcze wiele pomysłów na dodatkowe zadania.

    0
  • #22 02 Sty 2014 09:28
    tank_driver
    Poziom 16  

    Zrozumiałe, skoro priorytetem jest czas odczytu to LM35 wydaje się lepszą opcją.

    Ja mam inny pomysł: gdyby udało się przeczytać jedynie ostatni bajt numeru układu i na tej podstawie je rozróżniać, to zaoszczędzilibyśmy czas odczytu 7*15 = 105 bajtów. Przy ilości 15 sztuk DS-ów z pewnością te ostatnie bajty będą unikalne i pozwolą na jednoznaczną identyfikację układu.

    Kto jest za?

    0
  • #23 02 Sty 2014 11:25
    SylwekK
    Poziom 29  

    Czy nie lepiej by było wykorzystać tu dodatkowej kości tylko dla DS wszak to przy tylu DS-ach ułamek ceny, a później czy to po SPI czy po RS-ie odebrać w głównym procku zebrane temperatury... Tak się tylko zastanawiam głośno ;)

    0
  • #24 02 Sty 2014 15:47
    rekinisko
    Poziom 22  

    A ja komu mogę to odradzam DS-y, same z nimi problemy i nie są dokładne. Czas odczytu i konwersji danych tragiczny. Trafiają się sztuki które po włączeniu nagrzewają się same w sobie zmieniając wskazania nawet o 1,5'C (!). Stanowczo polecam LM56 dla szybkich pomiarów ADC lub LM73 na i2c.

    0
  • #25 02 Sty 2014 19:06
    piotrva
    Moderator na urlopie...

    Popieram przedmówcę.
    Ale co do DSów, skoro i tak wywołujesz w jednym momencie konwersję temperatury, czyli potem DSy trzymają w rejestrach temperaturę z tego właśnie momentu - czemu nie możesz wtedy np. przez 15 sekund pobierać danych i potem masz je już u siebie, a możesz wykorzystać za 10 minut i za godzinę.
    Nie uważam, aby 15 sekund miało jakieś znaczenie w przypadku sterownika kotła CO...

    0
  • #26 04 Sty 2014 02:50
    Jacek Rutkowski
    Poziom 24  

    Witam,
    jak na samym początku pisałem ATMega robi za sterownik do tzw "inteligentnego domu" i poza takimi rzeczami jak sterowaniem pieca i pomp ma rejestrować temperatury, zużycie prądu, sterować obwodami itp i komunikując się z routerem z OpeWRT po porcie szeregowym przekazywać jemu dane i reagować na polecenia załączenia itp. Nie chcę dokładać kolejnych procesorów, które będą zbędnie komplikować układ oraz utrudniać ewentualną diagnostykę.
    Obecnie do LM35 poza ADC wykorzystuję tylko zewnętrzny multiplekser CD4051 w SO16 za 50gr, którego nie muszę oddzielnie programować, dodawać oddzielnego ISP itp.
    W przypadku DS-ów multiplekser oraz złącze na 14 pinów by odpadło. Mógłbym połączyć magistralę na krosownicy razem z LAN-em.

    rekinisko napisał:
    Stanowczo polecam LM56 dla szybkich pomiarów ADC lub LM73 na i2c.

    Jeśli możesz zdradź pod jakim względem lepszy jest LM56 od LM35D do pomiarów przez ADC?
    Dokładność ani cena tego nie potwierdza?

    0
  • #27 04 Sty 2014 10:00
    piotrva
    Moderator na urlopie...

    No ale dalej uważam, że 15 sekund opóźnienia w odczycie temperatury w najgorszym wypadku to w tego typu aplikacji (oczywiście odpowiednio napisanej) żaden problem.

    Poza tym tak czy inaczej testowałeś jak się zachowają pomiary przy umieszczeniu czujników analogowych na dłuższych kablach? ;)

    0
  • #28 04 Sty 2014 13:36
    Jacek Rutkowski
    Poziom 24  

    Problemem nie jest czas od pomiaru do odczytu ale czas potrzebny na transmisję.
    Proszę po raz kolejny zwrócić uwagę na czym mi zależy a nie dokładać własne teorie.
    Chwilowo mam w nowo budowanym domu tylko położone kable a testuję podłączone na krótko tylko 2 czujniki. Robiłem podobny układ do odczytu temperatur z pieca, bojlera itp. na 7szt LM35D z ADC wewnętrznym na skrętce cat 5e po ok 20m czyli dalej niż u mnie i przy zastosowaniu filtrów RC 1kΩ 1µF na wejściu ADC oraz uśrednianiu 16 pomiarów kolejne odczyty różnią się maksymalnie o +-0,2°C jeśli w tym czasie startuje dmuchawa do pieca lub hydrofor. Jeśli nie ma żadnych tego typu anomalii skoki są o +-0,1°C.

    0
  • #29 04 Sty 2014 15:16
    rekinisko
    Poziom 22  

    Jacek Rutkowski napisał:
    ...
    rekinisko napisał:
    Stanowczo polecam LM56 dla szybkich pomiarów ADC lub LM73 na i2c.

    Jeśli możesz zdradź pod jakim względem lepszy jest LM56 od LM35D do pomiarów przez ADC?
    Dokładność ani cena tego nie potwierdza?


    Nie napisałem, że są lepsze czy gorsze, są sprawdzone i mogę je polecić.

    0
  • #30 04 Sty 2014 15:38
    tank_driver
    Poziom 16  

    Myślę że każdy z nas stara się Tobie pomóc, nakierować, chociaż mam wrażenie że najlepsze byłoby gotowe rozwiązanie. Sam pewnie wiesz jak czasochłonnym zajęciem jest pisanie prototypów...

    Masz już te 15 czujników czy nie? Jest na czym poćwiczyć?

    Pozdrawiam,
    TD

    0