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 i LM35 - dziwne zachowanie

chablak 09 Wrz 2010 09:42 5584 16
  • #1 09 Wrz 2010 09:42
    chablak
    Poziom 11  

    Witam

    Chciałem zrobić 3 - kanałowy termometr na atmedze8, lcd 2 * 16 i lm35 (3 szt). Ale na samym początku mam problem a mianowicie, podłączyłem wszystko tak jak na schemacie http://www.avrprojects.net/images/LCD%20Thermometer%20LM35_sch.jpg (tyle że mam inny wyświetlacz). Przerobiłem program z przykładu który znalazłem w internecie - http://www.avrprojects.net/index.php?option=c...rmometer-lm35&catid=37:avr-projects&Itemid=57 i po uruchomieniu wartości wyświetlane skaczą mi jak "szalone". Z tego co wyczytałem w internecie to w LM35 na 10mV przypada 1 stopień C. a ja mierząc napięcie mam wahania między 0.5 a 0,18V (500-180 mV). Na początku myślałem, że mam uszkodzoną atmegę i dla testów zrobiłem pomiar napięcia z przykładu, który mam zamieszczony w książce "Programowanie mikrokontrolerów AVR w języku BASCOM" Marcina Wiązania i pomiar napięcia działa prawidłowo. Zamieniłem potencjometr na LM35 (w celu pomiaru napięcia na nim i znowu skoki napięcia.

    Oto kod mojego programu:

    Code:

    $regfile = "m8def.dat"

    $crystal = 8000000

    'konfiguracja wyswietlacza (...)

    config adc = single, prescaler = auto, reference = avcc

    dim wart_ac as word
    dim v as single

    dim wart_nap as string * 3

    start adc

    do
    wart_ac = getadc(0)
    cls
    cld wart_ac

    lowerline

    v = wart_ac * 0.0049

    wart_nap = fusing(v,"#.&&")

    lcd wart_nap

    waitms 100
    loop
    end


    Korzystając z takiego programu do pomiaru napięcia przy podłączonym LM35 mam cały czas skoki co odświeżenie LCD.

    [/code]

    0 16
  • #3 09 Wrz 2010 11:40
    gaskoin
    Poziom 38  

    Kuniarz napisał:

    Acha, polecam DS1820 - świetny termometr na 1wire ;-)


    Przy 3 takich termometrach na samą temperaturę będzie czekał ponad 2s. Czujniki analogowe mają tą przewagę, że można z nich uzyskać temperaturę wiele szybciej

    0
  • #4 09 Wrz 2010 11:57
    piotr5000
    Poziom 21  

    config portc = &11111110
    portc = &11111110

    powinno pomóc

    0
  • #5 09 Wrz 2010 12:40
    Ilmarinen
    Poziom 12  

    Witam
    Tez się właśnie zajmuje odczytem temperatury na Lm35. Działa, chociaż nie stosuje dławików. Jako napięcie referencyjne wybrałem wewnętrzne napięcie odniesienia 2,56V. Nawet przy najwyższej temperaturze dopuszczalnej napięcie wyjściowe czujnika nie osiąga 5V (150*0.010V= 1,5V), dlatego też 5-cio woltowe napięcie odniesienia nie ma sensu. Przy niższym napięciu referencyjnym osiągamy większą rozdzielczość. Druga sprawa odczyt temperatury/napięcia z dokładnością do dwóch miejsc po przecinku nie ma sensu w czujniku, który ma w najlepszym wypadku 0,5 °C błędu przy 25 °C (zależy od wersji czujnika), dlatego też przykład z książki do odczytu napięcia trzeba zmodyfikować. Ja poradziłem sobie z tym rzutując obliczoną wartość napięcia w single na zmienna typu byte:

    Code:
    dim v as word
    
    dim b as byte
    dim s as single

    v=getadc(0)
    s = v*0.27 'tyle wyszło przy "reference internal" i przemnożeniu wyniku przez 100

    b=s '' po zrzutowaniu mamy łatwą do wyświetlenia wartośc byte

    lcd b ' powinno bezproblemowo wyświetlić


    Mnożenie przez 100 przesuwa wynik np 0.27 na 27.0.
    CO do szybkości odczytu tu sprawa się komplikuje, fakt wartość z przetwornika ADC można odczytać szybciej niż temp. z ds18b20, ale trzeba zwrócić uwagę na stałą czasową obu czujników. Lm35dz ma stała czasowa ok 1.5 minuty. Czyli czas po którym czujnik osiągnie faktyczna temperaturę otoczenia w którym się znajduje jest długi W praktyce czasami musiałem czekać ponad 3 minuty, żeby odczyt jako tako zgodził się ze wskazaniami termometru alkoholowego, którego używałem jako punktu odniesienia. Co do DS18b20 nie wiem nie sprawdzałem. Następną ważną rzeczą jest odfiltrowanie zakłóceń na wejściu do przetwornika ADC, w przypadku stosowania długich przewodów połączeniowych. Czujnik umieściłem na 70 centymetrowym przewodzie i bez zastosowania filtra (prosty rc R 1k i C 100nF) temperatura odczytana była kilka stopni wyższa, niż po zastosowaniu tego filtra.

    0
  • #6 09 Wrz 2010 16:55
    McMonster
    Poziom 32  

    Robiłem podobny układ na płytce stykowej na multipleksowanych wyświetlacach 7-segmentowych i gdzieś wyczytałem, że problem może powodować poprowadzenie przewodu Vout zbyt blisko szybko przełączanych linii cyfrowych, przez co generują się zakłócenia. Miałem tylko jeden moduł płytki stykowej i źle rozplanowałem umieszczenie elementów, więc u mnie to miało wpływ na wynik, użyłem ATmegi48 z domyślnymi ustawieniami ADC, dławikiem na AVCC i kondensatorem na AREF. Ale u mnie przy takim układzie temperatura wyświetlana była raczej wyższa od temperatury otoczenia.

    0
  • #7 09 Wrz 2010 17:42
    chablak
    Poziom 11  

    Ilmarinen skorzystałem z Twojego kodu ale to nic nie zmieniło poza sposobem wyświetlania danych. Dalej są cały czas wahania... Może podałbyś fragment swojego schematu jak masz podłączonego LM35?


    atmega8 i LM35 - dziwne zachowanie

    Dławika nie dałem bo go nie posiadam. [/img]

    piotr5000 mam skonfigurować portc na output? jakoś mi to nie pasuje za bardzo...

    Kuniarz rozumiem że bawiłeś się już na ds1820, ale ja nie poszukuje czujnika tylko mam problem z czujnikiem;)

    0
  • #8 09 Wrz 2010 18:41
    Ilmarinen
    Poziom 12  

    atmega8 i LM35 - dziwne zachowanie
    schemat z zastosowanym filtrem

    Może chodzi o to że podłączyłeś niepotrzebnie pin aref. A jak nie pomorze spróbuj zmienić czujnik może to prze niego sa problemy. Na zasilaniu dorzuć kondensatorki jakiś duży elektrolit i ceramiczny 100nF Nic więcej nie przychodzi mi Do głowy
    może jedynie źle ustawione fuse bity.

    0
  • #9 09 Wrz 2010 18:46
    gaskoin
    Poziom 38  

    Ilmarinen napisał:
    atmega8 i LM35 - dziwne zachowanie
    schemat z zastosowanym filtrem

    Może chodzi o to że podłączyłeś niepotrzebnie pin aref. A jak nie pomorze spróbuj zmienić czujnik może to prze niego sa problemy. Na zasilaniu dorzuć kondensatorki jakiś duży elektrolit i ceramiczny 100nF Nic więcej nie przychodzi mi Do głowy
    może jedynie źle ustawione fuse bity.


    co ma pomiar analogowy napięcia wspólnego z fusebitami?
    Aref jak jest używane wewnętrzne to zaleca się podłączenie go tak jak jest na tym schemacie (kondensatorem do masy)

    0
  • #10 09 Wrz 2010 20:24
    chablak
    Poziom 11  

    po podłączeniu "dodatkowego" kondensatora na zasilaniu (1000 uF / 10V), oraz filtra (RC) odczyty uspokoiły się, a mianowicie w moim pokoju odczyt bezpośrednio z wejścia waha się delikatnie między 70-66 po przeliczeniu sposobem Ilmarinen pokazuje cały czas 18 (nie wiem jak to mam traktować jak 18 stopni czy mV? po przeliczeniu po "książkowemu" wychodzi około 0.33V (ale nie chce mi się wierzyć że mam w pokoju 33 stopnie;) ) termometr rtęciowy pokazywał mi 15 stopni w trakcie testowania. czujnik - odczyt - reaguje już w miarę normalnie na podnoszenie temperatury tylko teraz kwestia przeliczenia odczytu z czujnika na stopnie celcjusza. Może ktoś pomóc w tej kwestii jeszcze? jeżeli ktoś ma jeszcze jakieś uwagi co do samego podłączenia czujnika czekam:)

    0
  • Pomocny post
    #11 09 Wrz 2010 21:02
    Ilmarinen
    Poziom 12  

    przelicznik zależy od zastosowanego napięcia odniesienia przy 2,56v z grubsza jest 1/2 książkowej wartości. Jak dasz napięcie odniesienia internal a przelicznik weźmiesz z vcc wyjdzie ci około 2x więcej (vcc to 0,0049 internal 0.0027). Co do przeliczania na stopnie celsjusza to nic nie trzeba robić. Wersja lm35 dz jest już kalibrowana w stopniach celsjusza, to lm34, jak widać w pierwotnym projekcie z linku jest w stopniach fahrenhaita.

    0
  • #12 09 Wrz 2010 21:15
    chablak
    Poziom 11  

    Wielkie dzięki za wyjaśnienie. Na obecną chwilę mój termometr wskazuje cały czas 17.5 stopnia i nie skacze:) zmieniłem jeszcze kondensator na zasilaniu z 1000 uF na 2200 uF i jest jeszcze lepiej (zero skoków przez 10 min pomiaru).

    Czy może mi ktoś wytłumaczyć różnicę między internal a vcc? ja w programie mam internal i ten przelicznik 0.0027. pomiar w tym przypadku jest zgodny z pomiarem w tym samym momencie miernikiem jaki wykonywałem do sprawdzenia poprawności. I jeszcze jedno co trzeba zrobić aby można było zmierzyć temperaturę ujemną? chciałem zrobić 3 czujniki a mianowicie aby mierzyło mi temperaturę w pokoju, na zewnątrz i przy "piecu do centralnego" aby uruchomić w odpowiednim momencie pompkę.

    0
  • #13 09 Wrz 2010 21:39
    McMonster
    Poziom 32  

    W karcie katalogowej LM35 masz pokazane, jak mierzyć ujemne temperatury.

    0
  • #14 09 Wrz 2010 21:43
    gaskoin
    Poziom 38  

    chablak napisał:

    Czy może mi ktoś wytłumaczyć różnicę między internal a vcc?


    a czy mógłbyś zajrzeć do manuala ?

    -1
  • #15 09 Wrz 2010 21:46
    Ilmarinen
    Poziom 12  

    Przetwornik adc w tym przypadku jest 10 bitowy czyli może przyjąc 2^10 - 1024 stanów. Napięcie referencyjne vcc czyli 5v podzielone na 1024 daje 0,0049
    a napiecie internal 2,56/1024 = 0,0025. Napięcie 2,56 pochodzi z stabilizatora wbudowanego w uC

    0
  • #17 09 Wrz 2010 22:46
    Ilmarinen
    Poziom 12  

    Jak wynika z przestudiowania noty aplikacyjnej faktycznie w strukturze stabilizatora zawarty jest wzmacniacz operacyjny. Stąd moje uogólnienie odnośnie jakiegoś stabilizatora. Co do samego stabilizatora to jest to jeśli sie nie myle układ podobny do zaprezentowanego na wikipedii.
    http://en.wikipedia.org/wiki/Bandgap_voltage_reference
    A definicję stabilizatora mamy nawet po Polsku
    http://pl.wikipedia.org/wiki/Stabilizator_(elektronika)

    0