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.

atmega8 - Pomiar temperatury lm50

azbest 04 Sty 2014 22:14 1590 6
  • #1 04 Sty 2014 22:14
    azbest
    Poziom 10  

    Witam,
    Próbuję zbudować termometr elektroniczny oparty na Atmega8 o wbudowany ADC i układ LM50 i mam mały problem nie mogę poradzić z ustawieniem danych mianowicie:
    Termometr pokazuje mi w temperaturze pokojowej że jest 75 C dotknięcie ręką czujnika ją podnosi. Po podpięciu na krótko lm35 wszystko jest porządku termometr pokazuje realną temperaturę. Problem jest w tym że Lm 35 ma 10mV/C a LM50 ma 19,5mV/C nie potrafię poradzić sobie z przestawienie tego w kodzie ( Bascom AVR )

    oto fragment kodu który wykorzystuje do pomiaru:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Czy w tym fragmencie jest gdzieś problem

    0 6
  • #2 04 Sty 2014 22:31
    Ture11
    Poziom 34  

    Żeby mikroprocesor pokazywał wartość w Woltach, trzeba przemnożyć wynik ADC przez działanie VREF/1023, wychodzi to około 0.0049. Jako, że czujnik lm35 daje 10mV na stopień, to autor tego programu, który przedstawiłeś pominął mnożenie wpierw wyniku przez 0.0049, by potem pomnożyć go przez 1000 (autor chciał uzyskać wynik np. 239 dla temperatury 23,9, by móc wyciągnąć resztę z dzielenia przez 10, jako część "po kropce".

    Zamiast tego, napisał t=W*5. U ciebie LM50 daje prawie dwa razy więcej, niż LM35, więc powinieneś napisać

    t=W*2.5

    Ale uwaga - tu zaczynają się zmienne z kropką - zmienna WORD czy Byte nie może być dalej używana. Dlatego zapisz

    t=w*5
    t=t/2

    Pewnie nie za bardzo ci się to podoba - już piszę dlaczego - Bo program ten ma przyjętą itak niską dokładność - zakładając, że źródłem odniesienia jest AVCC (znam ten program od dłuższego czasu).

    Jeśli chcesz zrobić dokładny pomiar, albo zrozumieć zasadę działania, zrób pomiar tak:

    x to zmienna single

    W=getadc(0)
    x=w*(Vzmierzone przy procesorze / 1023)

    Wtedy wartość otrzymasz w Woltach. teraz wystarczy wprowadzić do programu zależność temperatury od napięcia dla LM50 i działa.
    Problem w tym, że jak wejdziesz w zmienne z przecinkiem, to wtedy już lepiej użyć po prostu instrukcji FUSING() do wyświetlenia zmiennych.

    0
  • #3 04 Sty 2014 22:32
    kicajbas
    Poziom 25  

    Witam
    Z góry zaznaczam, że nie znam Bascoma ale może taki przelicznik:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    To mnożenie x10 jest do pozbycia się przecinka z 19,5

    Pozdr.

    edit:
    Gdy to pisałem nie było jeszcze wpisu kol.Ture11, ale może się do czegoś przydać. :D

    0
  • #4 04 Sty 2014 22:43
    Ture11
    Poziom 34  

    Kolega napisał chyba dobrze, tylko że chyba to się itak nie zmieści w zmiennie WORD (65536), poza tym jakoś nie mogę sobię tego wyobrazić.

    Na jakiej precyzji zależy autorowi? Ostatnio sam podłączałem LM35 no i wynik jest taki, że LM35 daje 1mV na zmianę o 0.1stopnia, a Atmega ma minimalny krok" 4,88mV.
    Lm50 jest w lepszej sytuacji, bo daje blisko 2mV na 0.1 stopnia, ale itak krok blisko 0.3 stopnia będzie wynikał z ADC w mikroprocesorze. Zresztą rozdzielczość 0.3 stopnia byłaby itak super, ale chyba nie do uzyskania przy Amtedze8.

    0
  • #5 05 Sty 2014 00:06
    azbest
    Poziom 10  

    Z dokładnością tak bardzo mi nie zależy to nie będzie sprzęt do laboratorium ani nic w tym stylu użycie czysto amatorskie.


    Ture11

    Na wyjściu LM50 w tej chwili mam 0,728 V czyli muszę teraz 1023/728mV = ok 1,405 a następnie co mam zrobić

    0
  • #6 05 Sty 2014 00:49
    Ture11
    Poziom 34  

    PRZEPRASZAM, POPEŁNIŁEM BŁĄD !!! WZÓR JEST "Vref/1023", a nie, jak pisałem odwrotnie

    Atmega8 żeby mierzyć napięcie musi mieć jakieś odniesienie - napięcie odniesienia czy też inaczej referencyjne.
    Są trzy możliwości - napięcie referencyjne to:

    - napięcie zasilania AVCC (około 5V)
    - napięcie odniesienia wewnętrzne 2,65V
    - napięcie referencyjne z zewnątrz, podane na pin AREF.

    Gdy konfigurujesz ADC, wtedy podajesz mikroprocesorowi, skąd on ma czerpać odniesienie:

    Config adc = single, REFERENCE = AVCC / INTERNAL / OFF

    Jeśli dobrze pamiętam, w twoim programie jest REFERENCE = AVCC - czyli napięcie pobierane z zasilania mikroprocesora. Jeśli zasilasz mikroprocesor z napięcia 5V na przykład ze stabilizatora 7805, to ja na przykład biorę miernik do ręki i mierze napięcie jego zasilania - czasem jest to 4,95V, a czasem 5,01V.

    Przetwornik ADC w atmedze nie podaje napięcie, a jedynie jego reprezentację bitową. Zakres wartości z przetwornika adc to 0...1023, przy czym 1023 odpowiada napięciu referencyjnemu. Dlatego też by poznać jakiej wartości napięcia odpowiada jeden bit zmiany, trzeba napięcie odniesienia podzielić na 1023 - dla odniesienia 5.00V wychodzi to
    0,0048875855327468230694037145650049. Oczywiście, w którymś miejscu trzeba tę wartość przybliżyć. Często przybliża się ją do 0,00488V, czyli 4,88mV.

    Minimalny krok pomiaru będzie wynosił więc 4,88mV

    Dla wartości 1 z ADC napięcie zmierzone to 4,88mV
    Dla wartości 2 - 9,76mV
    itd itd

    Dodano po 7 [minuty]:

    Ogólnie gdy zastosujesz taki wzór, i pomnożysz wynik z ADC przez właśnie 0.00488 to na wyświetlacz możesz wyrzucić napięcie zmierzone przez ADC w WOLTACH. Teraz, dzieląc to napięcie w woltach przez 0,0195 (czyli przez 19,5mV), dostaniesz wartość w stopniach. Teoretycznie.

    Dodano po 8 [minuty]:

    Przyjmijmy, że masz na czujniku 0,728V, co odpowiada temperaturze około 37,3 stopnia. Jeżeli mikroprocesor poda ci na wyświetlaczu taką wartość w Woltach, to trzeba ją podzielić przez 19,5mV by dostać wartość w stopniach. Wynik będzie 37,3. Teraz sprawa wygląda tak, że program przedstawiony przez ciebie działa trochę ilaczej - mnoży on tę wartość przez 10, by usunąć przecinek - wtedy masz wynik 373 zamiast 37,3.
    Mając wynik 373 w twoim programie autor używa dzielenia przez 10 wyniku, by uzyskać ilość stopni przed kropką (373/10 = 37, ponieważ zmienna BYTE lub WORD nie przenosi zmiennych po przecinku). Drugą operacją jest reszta z dzielenie przez 10 " MOD 10", która dla liczby 373 daje wynik 3 (373/10 = 37 reszty 3).

    Twój program ma dwie zmienne po tych operacjach - zmienną zawierającą stopnie oraz zmienną zawierającą ułamki stopni.

    przykładowo zmienne A i B są wynikiem powyższych operacji -

    A = 373/10
    B = 373 MOD 10

    A = 37
    B=3

    teraz po prostu wyświetlasz zmienną A, potem symbol kropki, a potem zmienną B

    Wynik? "37 kropka 3"

    Dodano po 3 [minuty]:

    Zapewne wytłumaczyłem to zbyt zawile...

    Jeśli spowodowałem u ciebie zmieszanie, to po prostu daruj sobie robienie tego dokłanie, i pod linijką

    "t = W * 5"
    dopisz
    "t=t/2"
    Co da ci podział na 2 wartości - bo LM50 daje blisko 2x większe napięcie niż lm35, stąd dzielisz na dwa by dopasować napięcia.

    To co ci podałem z tym dzieleniem przez 4,88mV powodowałoby konieczność niemałej zmiany w Twoim programie, więc to może zostaw na później :-)

    0
  • #7 06 Sty 2014 12:23
    azbest
    Poziom 10  

    Dziękuje za pomoc udało mi się uzyskać w miarę dokładny pomiar temperatury
    oczywiście
    "t = W * 5"
    "t=t/2"

    nie jest za dokładne ale projekt robiłem w celach szkoleniowych nauki obsługi ADC.

    Oczywiście lepsze odczyty udało mi się uzyskać z DS18b20 ale to już całkiem inna zasada działania.
    Jeszcze raz dziękuje i Pozdrawiam.

    0