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

ATMEGA8 LM35 - niedokładne wyniki pomiaru temperatury, skoki wartości

Chivo 02 Sty 2016 09:56 3138 37
  • #1 15290248
    Chivo
    Poziom 26  
    Witam,

    Zrobiłem prosty termometr na ATMEGA8 oraz LM35. Mój problem polega na tym, ze wyniki pomiaru są niedokładne, np: na wyświetlaczu LED pokazuje na przemian 23 25 stopni. Gdzie tkwi błąd pomiarowy.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 15290389
    Konto nie istnieje
    Konto nie istnieje  
  • #3 15290592
    Chivo
    Poziom 26  
    Wyniki pomiarow zapisze w tablicy i policze srednia. Czy typ zmiennych float jest dobry?
  • #4 15290601
    Konto nie istnieje
    Konto nie istnieje  
  • #5 15290630
    tronics
    Poziom 38  
    Cytat:
    float w uC nigdy nie jest dobry

    Chyba, że masz STM32F4 (lub nowsze) z FPU na pokładzie wtedy żal nie korzystać z float gdy charakter obliczeń tego wymaga. Tutaj zaś mozna wykorzystać reprezentację stałoprzecinkową jeśli ktoś się upiera na wygodnej formie obliczeń, albo po prostu odpowiednio przeskalowywać wynik na typie całkowitoliczbowym. W tak prostym przypadku jak tutaj opisany nie ma większego uzasadnienia do wykorzystania float.
  • #6 15290634
    Konto nie istnieje
    Konto nie istnieje  
  • #8 15291618
    Chivo
    Poziom 26  
    Poprawiłem kod. Po kilku minutach pracy zamiast poprawnej wartości np: 24 na wyświetlaczu pojawia się 00.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 15291682
    Konto nie istnieje
    Konto nie istnieje  
  • #10 15291693
    Chivo
    Poziom 26  
    Czym zastąpić te floaty?
  • #11 15291746
    Konto nie istnieje
    Konto nie istnieje  
  • #12 15291758
    Chivo
    Poziom 26  
    Zmieniłem na coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 15291894
    Konto nie istnieje
    Konto nie istnieje  
  • #14 15291941
    Chivo
    Poziom 26  
    AREF=AVCC=5,03V. Zamiast uint16_t użyję uint32_t. Zależy mi na dokładnym wyniku ponieważ buduję termometr.
  • #15 15292070
    tronics
    Poziom 38  
    LM35 daje 10mV/°C, ma dokładność 0,5°C i nieliniowość ±0,25°C czyli zasadniczo nie ma za bardzo potrzeby mierzyć dokładniej niż 5mV. Przy 5030mV i 10bit ma kolega rodzielczość 4,921mV. "zaokrąglenie" obliczeń nie wpłynie bardzo znacząco na wskazania biorąc pod uwagę odchyłkę samego termometru jak i błędy wprowadzane przez ADC. I ja w tym momencie przyjąłbym spokojnie że 1dz ADC=5mV czyli wynik np. 115 będzie oznaczał 565mV=56,5°C. Zakładając że nie ma błędów LM oraz ADC przy przeliczeniach "dokładnych" miałby kolega wynik 115=564,89mV=56,49°C. Przy wartości odczytanej 60 w pierwszym przypadku byłoby to 300mV czyli 30°C, w drugim (precyzyjnym) 294,7265mV=29,73°C. Kwestia czy koledze bardzo zależy na ultra precyzji reprezentacji wyniku... bo sam pomiar precyzyjny tak czy siak nie będzie. Żeby pomiar był bardziej dokładnie przeprowadzony musiałby kolega mieć bardzo stabilne vref najlepiej zewnętrzne, dodatkowo zakres mierzonych napięć dopasowany do vref (w tym przypadku tak wygodniej) - czyli tutaj np. przez wzmacniacz operacyjny o wzmocnieniu 10x by zminimalizować błędy ADC które sięgają iirc 2LSB
  • #16 15292163
    Konto nie istnieje
    Konto nie istnieje  
  • #17 15292248
    Chivo
    Poziom 26  
    Termometr zbudowalem do domu. Tata ciagle biega po mieszkaniu i sprawdza tradycyjne termometry na scianie. Na podstawie odczytow wie ile palic w piecu. W takim razie zbuduje dojladniejszy uklad.

    Dodano po 15 [minuty]:

    Jakie uklady polecacie jako napiecie odniesienia i WO najlepiej z pojedynczym zasilaniem +5V?
  • #18 15292408
    Konto nie istnieje
    Konto nie istnieje  
  • #19 15293039
    tronics
    Poziom 38  
    Cytat:
    Do termometru nie potrzebujesz.

    Potrzebować nie potrzebuje, ale korzystając z Vref=5V i próbkując sygnał, który będzie przyjmował znając życie 150-400mV ogranicza się jednocześnie do 1/10 całego zakresu pomiarowego ADC czyli w tej sytuacji uzyskiwane odczyty będą w granicach 0-80 z 1024 (zakres 0-1023) co przy niepewności ADC rzędu 2LSB daje dodatkową niepewność praktycznie 1°C; korzystając z WO i przenosząc te odczyty na zakres 1500-4000mV mamy 10x mniejszy wpływ niepewności ADC. Tak, będzie dodatkowy szum, ale przy uśrednianiu się go "wygładzi". Jednocześnie rozjazd Vref od oczekiwanej (zakładam stabilizator LM7805CT z dokładnością 4% napięcia wyjściowego) będzie miał mniejszy wpływ. Oczywiście, opamp wprowadzi dodatkowe przekłamania (choćby dryft temperaturowy jak i precyzja rezystorów w sprzężeniu będą miały znaczenie), ale szczerze jeśli chcemy jak największej dokładności z LM35 na AVR to nie widzę wielu lepszych rozwiązań. Sam korzystałem bez opampa, bo też i nie potrzebowałem bardzo dokładnych pomiarów, wiem też jak bardzo one są wtedy zależne od stabilnego AVcc (jako Vref) - wystarczyło podłączyć się do USB gdzie napięcie spadało do ~4,95V i już wskazania były wyraźnie gorsze niż przy 5,02V za LM7805. Superkondensator 0,22F poprawiał stabilność, ale dla niektórych to może być tzw. "overkill" czyli gruba przesada. Kolega Chivo zrobi jak chce, jeśli rzeczywiście bardzo pragnie dokładniejszych odczytów to wystarczy choćby taki niedobry a popularny LM358, jeśli to ma tylko względnie dobrze pokazywać temperaturę to w tej sytuacji zamiast tych wszystkich obliczeń wystarczy odczyt ADC podzielić przez 2* i mamy wystarczająco dobry pomiar. Kalibracja przez wykorzystanie bandgap to też taki lekki overkill - owszem można dokładniej rzeczywiste Vref określić i odpowiednio przeskalować wynik, ale też wprowadzamy mnóstwo obliczeń gdy wyniku i tak nie poprawimy ze względu na właśnie dość poważną w tej skali niepewność pomiaru samego ADC.
  • #20 15293167
    Konto nie istnieje
    Konto nie istnieje  
  • #21 15294010
    Chivo
    Poziom 26  
    Dziękuję za pomoc - zastosuje zewnętrzne napięcie odniesienia oraz wzmacniacz operacyjny. Mam pytanie o liczby float. Jeżeli zależy mi na dokładności i nie ma znaczenia czy program zajmie 3% czy 30% pamięci to mogę użyć float czy raczej są inne sposoby obliczania liczb ułamkowych?
  • #23 15294289
    tmf
    VIP Zasłużony dla elektroda
    Chivo napisał:
    Dziękuję za pomoc - zastosuje zewnętrzne napięcie odniesienia oraz wzmacniacz operacyjny. Mam pytanie o liczby float. Jeżeli zależy mi na dokładności i nie ma znaczenia czy program zajmie 3% czy 30% pamięci to mogę użyć float czy raczej są inne sposoby obliczania liczb ułamkowych?


    Zewnętrzne nap. odniesienia to dobry pomysł, zewnętrzny WO to IMHO pomysł zbędny. Stosując oversampling spokojnie dostaniesz dodatkowe 2 bity na ADC, a to w zupełności wystarcza jak na LM35 (jeśli mówimy o dokładności).
    Co do float - jeśli masz sporo pamięci to można się nie przejmować za bardzo floatami, niemniej wcale dzięki nim nie zyskasz na dokładności, a wręcz przeciwnie - tracisz ją. Jeśli chcesz się czegoś nauczyć to wykorzystaj arytmetykę stałoprzecinkową, dla której masz wsparcie w avr-gcc.
  • #24 15295435
    DJ ANNUS
    Poziom 31  
    Może odległość czujnika duża ?
    Dlaczego nie zaimplementowałeś DS-a?

    Ile masz czujników?
  • Pomocny post
    #25 15300480
    Sławek-K
    Poziom 15  
    Co prawda w temacie kolega umieścił wątek o termometrze wykorzystującym jako czujnik LM35, ale może "malutka sugestia": Brałeś pod uwagę scalony cyfrowy czujnik typu np DS18B20 ? Ja np w aucie zbudowałem termometr (na ATMEGA8) przy użyciu dwóch czujników DS18B20 (temperatura silnika i w kabinie) oraz DHT22 (zamiennik to AM2302) w nawiewie, który oprócz temperatury mierzy również wilgotność. Zero jakiś strojeń , regulacji itp. No i najważniejsze, pewnie tato będzie zachwycony dwoma wartościami zmierzonymi jednocześnie. Wilgotność w mieszkaniu to także ważny parametr.
  • #26 15580320
    Chivo
    Poziom 26  
    Jezeli w wzorze na obliczenie temperatury wystepuje dzielenie to jak je wykonac bez zmiennej float poniewaz temperatura moze byc rowna 23,5°C?
  • #27 15580403
    Konto nie istnieje
    Konto nie istnieje  
  • #28 15580502
    Chivo
    Poziom 26  
    Czyli np: 23,5°C pomnozyc przez 100 i rodzielic na czesc dziesietna i ulamek? Mozna proszic o fragment kodu?
  • #29 15580516
    Konto nie istnieje
    Konto nie istnieje  
  • #30 15580558
    Chivo
    Poziom 26  
    Nie bardzo rozumiem. Ze wzoru wychodzi float temperatura=23,5 to jak to przedstawic jako int?
REKLAMA