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

atmega8 i LM35 - dziwne zachowanie

chablak 09 Wrz 2010 09:42 6202 16
  • #1 8491338
    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:

    
    $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.
  • #2 8491375
    Kuniarz
    Moderator Projektowanie
    Podłączyłeś dławik i kondensatorki zgodnie z książkowym przykładem wykorzystania ADC ?
    Może daj dokładnie swój schemat.
    Acha, polecam DS1820 - świetny termometr na 1wire ;-)
    Pomogłem? Kup mi kawę.
  • #3 8491686
    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
  • #4 8491743
    piotr5000
    Poziom 21  
    config portc = &11111110
    portc = &11111110

    powinno pomóc
  • #5 8491872
    Ilmarinen
    Poziom 14  
    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:
    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.
  • #6 8492819
    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.
  • #7 8493022
    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.

    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;)
  • #8 8493361
    Ilmarinen
    Poziom 14  
    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.
  • #9 8493385
    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)
  • #10 8493861
    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:)
  • Pomocny post
    #11 8494054
    Ilmarinen
    Poziom 14  
    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.
  • #12 8494121
    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ę.
  • #13 8494259
    McMonster
    Poziom 32  
    W karcie katalogowej LM35 masz pokazane, jak mierzyć ujemne temperatury.
  • #14 8494286
    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 ?
  • #15 8494300
    Ilmarinen
    Poziom 14  
    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
  • #16 8494339
    gaskoin
    Poziom 38  
    raczej od wzmacniacza :)
  • #17 8494568
    Ilmarinen
    Poziom 14  
    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)
REKLAMA