Elektroda.pl
Elektroda.pl
X
Prosz, dodaj wyj徠ek www.elektroda.pl do Adblock.
Dzi瘯i temu, 瞠 ogl康asz reklamy, wspierasz portal i u篡tkownik闚.

[Rozwi您ano] Termometr ATMEGA8 + LM35 w C/C++

U-235 30 Sie 2009 16:39 19150 51
  • #1 30 Sie 2009 16:39
    U-235
    Poziom 11  

    Witam

    Od kilku dni kopie w google oraz na forum szukaj帷 informacji na temat przetwornika ADC zawartego w uP atmega8 oraz sposobu u篡cia go do pomiaru napi璚ia z analogowego czujnika temperatury LM35. Chcia豚ym stworzy uk豉d kt鏎y mierzy temperature oraz wy鈍ietla wynik na dw鏂h modu豉ch 7 segmentowego wy鈍ietlacza led.
    Chcia豚ym aby kto udzieli mi informacji jak odpalic sam przetwornik w C/C++.
    Wiem, 瞠 ten czujnik daje napi璚ie 10mV na ka盥y 蚓.
    Mo瞠 kt鏎y z szanownych forumowicz闚 mia豚y kawa貫k kodu i schemat spe軟iaj帷y nadaj帷y si do tego projektu. Najbardziej zale篡 mi na kodzie.

    Prosz tak瞠 o sprawdzenie czy schemacik, kt鏎y stworzy貫m jest poprawny i czy to urz康zenie ma prawo dzia豉:

    Termometr ATMEGA8 + LM35 w C/C++

    Wszelkie informacje na ten temat mile widziane :D

    0 29
  • #2 31 Sie 2009 01:49
    kordirko
    Poziom 21  

    poczytaj tutaj:
    http://avr.elektroda.eu/?q=node/30

    Do wej軼ia AREF musisz pod陰czy w豉sne zewn皻rzne 廝鏚這 napi璚ia,
    albo skorzysta z wewn皻rznego 廝鏚豉 2,56V, ale wtedy nale篡 mi璠zy AREF i mas wpi望 kondensator.
    Na p造tce masy cyfrowa (GND) i analogowa (AGND) musz by po陰czone, na schemacie tak jakby brakowa這 "kropki" ;).
    Rezystor 10K ze schematu wywal - AVCC nie mo瞠 si r騜ni od VCC mniej ni 0,3V
    - w jego miejsce najlepiej wstawi d豉wik 10uH. Kondensator 10n zmie na 100n.
    Poczytaj tutaj na str. 203 jak producent zaleca 陰czy zasilania:
    http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

    Rezystor 100K mi璠zy wej軼iem a LM35 wywal - w dokumentacji na str. 202 pisze
    瞠by sygna analogowy najlepiej mia impedancj wyj軼iow co najwy瞠j 10K,
    tym szeregowym rezystorem 100K mu "dobijasz" razy 10 ;)

    0
  • #3 31 Sie 2009 17:02
    Anonymous
    U篡tkownik usun掖 konto  
  • #4 31 Sie 2009 22:15
    U-235
    Poziom 11  

    Poprawi貫m schemat wed逝g zalece kolegi, zamieszczam go poni瞠j. Korzystam z zewn皻rznego napi璚ia, m鏬豚ym jeszcze wpi望 rezystor na po陰czeniu AREF do zasilania ale nie wiem czy jest konieczny.
    Bardzo dzi瘯uje za sugestie oraz ciekawe linki.

    Kod jak najbardziej mi si przyda, po ma貫j modyfikacji nadaje si do mojego projektu jako szkielet, bardzo dzi瘯uje :D


    Termometr ATMEGA8 + LM35 w C/C++




    Mam jeszcze jedn pro軸e , chcia豚ym aby kto pom鏬 mi przerobi powy窺zy kodzik tak, 瞠by pasowa do mojego schematu, mo瞠 by z wewn皻rznym napi璚iem odniesienia, wstawie kondensator w odpowiednie miejsce.
    z g鏎y dzi瘯uje ;)

    0
  • #5 12 Wrz 2009 21:30
    tmf
    Moderator Mikrokontrolery Projektowanie

    AVCC i VCC polacz razem bezposrednio, bez dlawika. ATMega8 ma blad w strukturze, w efekcie te dwa napiecia sa wewnatrz zwarte i dlawik nic nie daje. ARef nie lacz bezposrednio z Vcc - na tym pinie pojawia sie napiecie ze zrodla referencyjnego 2,54V i jak zewrzesz z Vcc to nic dobrego z tego nie wyniknie. Podlacz ten pin przez kondensator 10-100nF do masy. LM35 podlacz do ADC przez szeregowy rezystor 330om, kondensator mozesz zostawic. Razem beda one tworzyly filtr dolnoprzepustowy, co poprawi odczyty. Co do ADC - przejrzyj noty aplikacyjne Atmela.

    0
  • #6 15 Wrz 2009 10:28
    peterrrm
    Poziom 14  

    Witam,

    Prosze mi podpowiedzie czy dobrze zrozumia貫m. Ale wydaje mi si, 瞠 uk豉d LM35 nie wymaga bardzo stabilnego napi璚ia i ma貫 wachania napi璚ia nie zmieniaj jego wskaza.Kataog podaje od 5V do 20V. Je郵i si myle to prosz o poprawienie

    0
  • #7 20 Wrz 2009 16:57
    tmf
    Moderator Mikrokontrolery Projektowanie

    LM35 nie potrzebuje stabilnego napiecia, ale ATMega potrzebuje stabilne napiecie referencyjne, zeby poprawnie zmierzyc to co podaje LM35.

    0
  • #9 17 Pa 2009 17:25
    peterrrm
    Poziom 14  

    疾by nie zak豉da nowego tematu, pisze tutaj. Zbudowa貫m uk豉d w oparciu o schemat i powy窺ze uwagi. Niestety pojawi造 sie pewne problemy. Pokazywana temperatura jest bardzo nie stabilna, i nie zmienia si z rozdzielczo軼i 0,5 C ale oko這 1. Pr鏏owa貫m u鈔ednia temperatur z 10 pomiar闚, ale te nie wygl康a to dobrze. Gdzie szuka 廝鏚豉 zak堯ce?

    0
  • #10 17 Pa 2009 18:09
    tmf
    Moderator Mikrokontrolery Projektowanie

    Niestabilne zrodlo referencyjne, szum spowodowany czescia cyfrowa ukladu, zle odsprzegniecie zasilania czesci analogowe, zle prowadzenie mas. Byc moze pomoglby tez szeregowy rezystor z rownoleglym kondensatorem na wejsciu ADC, zgodnie z nota katalogowa LM35.

    0
  • #11 17 Pa 2009 23:33
    peterrrm
    Poziom 14  

    毒騜d這 referencyjne mam wewn皻rzne, przy ka盥ym zasilaniu mam kondensator 100nF do masy, na wej軼iu ADC rezystor 330 Ohm, bez kondensatora bo jak mia貫m (10nF) to skoki by造 jeszcze wi瘯sze. Mas analogow mam z LM35 bezpo鈔ednio do pinu AGND, podobno tak powinno by. Mo瞠 kto si jeszcze wypowie jak u niego z rozdzielczo軼i? nie wiem dlaczego mam tak dziwnie raz jest to 0,5 a raz 1, np. temperatura jest 21,5 potem 22 ale potem ju od razu 23, przy zej軼iu w d馧 to samo.

    0
  • #12 17 Pa 2009 23:59
    atom1477
    Poziom 43  

    Kondensator od ADC1 do AGND raczej daj. Mo瞠 mia貫 go pod陰czonego do GND a nie do AGND.
    Oczywi軼ie AGND i GND te maj by z陰czone, ale chodzi mi o kolejno嗆 pod陰czenia, czyli spos鏏 prowadzenia masy.
    LM35 najgorszy nie jest, ale minimalnej kalibracji wymaga (w okolicach u豉mka stopnia).
    Ale mimo tego skok闚 wynik闚 nie powiniene mie.
    Jak chcesz napi璚ie referencyjne r闚ne 5V, to nie 陰cz AREF z VCC, tylko ustaw napi璚ie referencyjne na AVCC (w konfiguracji przetwornika si to ustawia). A pin AREF pod陰cz kondensatorem 100nF do AGND.
    Acha. I masa czujnika te do AGND a nie gdzie indziej.

    1
  • #13 18 Pa 2009 00:26
    tmf
    Moderator Mikrokontrolery Projektowanie

    No i trzeba sie liczyc z tym, ze ADC ATMegi (wlasnie, jaka to jest, czy nie czasem 8?) nie jest za super i te 10 bitow to bardziej teoria. Troche moze pomoc wylaczanie czesci cyfrowej na czas przetwarzania ADC i usypianie procesora. Jak samplujesz? Nie wlaczasz/wylaczasz czasem ciagle przetwornika?
    Robilem na LM35 i na ATMega8 bez zadnych cudow, acz z oversamplingiem 16 lub 256 razy udawalo mi sie bez problemu uzyskac stabilne odczyty przy rozdzielczosci 0,1-0,2 stopnia.
    Tak mi jeszcze przyszlo do glowy - jak odczytujesz ADC? W przerwaniu kiedy skonczy w trybie free running?

    1
  • #14 18 Pa 2009 00:48
    atom1477
    Poziom 43  

    To jest tryb Single.
    Z t dok豉dno軼i to troch prawda, ale to nie t逝maczy這 by skakania wynik闚.
    Ja i bez Oversamplingu otrzymuj stabilne wyniki. Zmienia si czasami jedynie 1 bit LSB, ale to normalne jak uk豉d jest na granicy dw鏂h warto軼i.
    No i dodam, 瞠 nieodpowiednie pod陰czenie masy w豉郾ie dawa這 efekt skakania wynik闚 o kilka/kilkana軼ie LSB. Jak tylko pod陰czy貫m mas bezpo鈔ednio do AGND to takie skoki od razu usta造.

    1
  • #15 18 Pa 2009 02:26
    peterrrm
    Poziom 14  

    Dzi瘯uje za odpowiedzi!

    Tak to Atmega8. Je郵i chodzi o mase to mam mas czujnika bezpo鈔ednio do AGND i tyle, zgodnie z tym :Link. Z opisu na tamtej stronie wynika, 瞠 masa GND lepiej jak nie jest 陰czona z AGND,wi璚 tak zrobi貫m. Nie usypiam procesora na czas konwersji(ale postaram si to zrobi,mo瞠 kto podpowie jak?). Natomiast chyba mam b陰d og鏊nie w programie, bo wnioskuje po odpowiedziach, 瞠 nie prawid這wo odczytuje i przetwarzam.

    Code:
    double pomiar;      // Zmienna do przechowywania wyniku pomiaru
    
    char buffer_n[5];           // Bufor do przechowywania wyniku konwersji z "double" na ASCII
    double tem=0;



    void Inicjalizacja(void)
    {   
       // Inicjalizacja LCD 
       LCD_Initalize();      // Inicjalizacja wyswietlacza
       LCD_Clear();      
       // Wybranie wewn皻rznego 穋鏚豉 napi璚ia odniesienia   
       ADMUX |= _BV(REFS0);      
       ADMUX |= _BV(REFS1);      
       // Zezwolenie na konwersj   
       ADCSRA |= _BV(ADEN);      
       // Wybranie cz瘰totliwo軼i dla taktowania przetwornika  (1/32 cz瘰totliwosci zegara kontrolera)
       ADCSRA |= ((1<<ADPS0)&(1<<ADPS2));       
    }


    int main(void)
    {
       
       Inicjalizacja();  // Inicjalizacja ADC i LCD
       
       

       while(1)
       {
       ADCSRA |= _BV(ADSC);         // Rozpocz璚ie przetwarzania
          
       while(bit_is_set(ADCSRA,ADSC))   // Oczekiwanie na zako鎍zenie przetwarzania
       {};   
       pomiar=(double)ADCW;              // Zapisanie  wyniku konwersji do zmiennej "pomiar"                           
       tem=(double)pomiar*0.2650602;
             
       
       dtostrf(tem, 1,1,buffer_n);// Konwersja liczby double  do asci
       
       LCD_WriteText("                "); //zamiast: LCD_Clear() ,zapobiega to migotaniu LCDeka
       LCD_GoTo(0,0);
       
       
       LCD_WriteText("t=");
       LCD_WriteText(buffer_n);
       LCD_WriteText("'C");
       _delay_ms(300);
       
    }
       return 0;
       
    }
    Program odczytuje warto嗆 temperatury i po przeliczeniu wy鈍ietla na LCD. Czy taki spos鏏 mo瞠 by przyczyn takich skok闚? i w takim razie jak najlepiej obs逝giwa ADC? Dzi瘯uje

    0
  • #16 18 Pa 2009 12:41
    tmf
    Moderator Mikrokontrolery Projektowanie

    Skoro masz ATMega8 to polacz bezposrednio Vcc i AVcc (ten procesor ma blad i te piny i tak sa wewnetrznie zwarte). Co znaczy, ze GND nie laczysz z AGND? Gdzies przeciez one musza sie laczyc!?
    Przeczytaj sekcje w pdfie ADC noise canceller to zobaczysz o co chodzi.
    Jeszcze jedno - na schemacie masz LM35 podlaczony do ADC1, na tym drugim do ADC3, a w ADMUX masz wybrany ADC0...

    0
  • #18 18 Pa 2009 13:30
    peterrrm
    Poziom 14  

    Tak na schemacie jest ADC1 ale ja mam pod陰czone napewno do ADC0 i tak tez jest w programie. Je郵i chodzi o GND to nigdzie nie 陰cze z AGND zgodnie z tym co jest w podanym przezemnie linku. Ale za chwile spr鏏uje po陰czy.

    0
  • #19 18 Pa 2009 13:48
    atom1477
    Poziom 43  

    No przecie pod陰czenie AGND do GND to OBOWI╴EK.

    0
  • #20 18 Pa 2009 13:56
    peterrrm
    Poziom 14  

    W takim razie dlaczego uk豉d dzia豉 tak samo z po陰czonym GND do AGND i bez niego? nie rozumie. Nie rozumie tez dlateczo mam temperature 22 a potem odrazu 23.3 nie ma nic posredniego?

    0
  • #21 18 Pa 2009 14:06
    atom1477
    Poziom 43  

    Dzia豉 dlatego, 瞠 piny AGND i GND maj jakie minimalne wewn皻rzne po陰czenie (diodami).
    To si tylko tak nazywa: masa analogowa i masa cyfrowa. W rzeczywisto軼i ma to by po陰czone (w tym przypadku). Chodzi tylko o to 瞠 w specjalnym i JEDNYM punkcie. Czasami przez jaki element (np. przez rezystor 0Ω (s takie :D)).

    0
  • #22 18 Pa 2009 14:14
    peterrrm
    Poziom 14  

    Je郵i to po陰czenie b璠zie na nodze procesora AGND i dodatkowo miedzy ADND i ADC0 kondensator, b璠zie ok? Mo瞠 kto jeszcze mia podobny problem z rozdzielczo軼i? wydaje mi si, ze to nie wina Atmegi i przetwarzania ale LM35 to on chyba nie daje warto軼i po鈔ednich.

    0
  • #23 18 Pa 2009 14:22
    atom1477
    Poziom 43  

    Na pewno daje bo to jest czujnik analogowy bez 瘸dnych udziwnie.

    0
  • #24 18 Pa 2009 14:29
    peterrrm
    Poziom 14  

    Dzi瘯i Atom1477 za odp. sprawdza貫m r騜ne po陰czenia i ta Atmega si zachowuje tak jakby mia豉 wewn皻rznie zwarte GND z AGND, np. je郵i przy陰cze mas czujnika do GND a nog AGND zostawi w "powietrzu" wynik przetwarzania jest identyczny jakbym podpi掖 t mas do AGND, dziwne :)

    0
  • #25 19 Pa 2009 22:06
    peterrrm
    Poziom 14  

    Nikt nie wie jaka mo瞠 by przyczyna tak ma貫j rozdzielczo軼i LM35? Mo瞠 kto mia podobny problem.

    0
  • #26 20 Pa 2009 06:38
    r06ert
    Poziom 25  

    Witam!

    Najlepiej to jakby wrzuci kompletny schemat....
    Miedzy LM35 a uK daj prosty filtr RC, np R=1kohm i C = 1uF. Czym to wszystko zasilasz? Napi璚ie zasilania masz dobrze odfiltrowane?

    0
  • #27 20 Pa 2009 11:19
    atom1477
    Poziom 43  

    A zwyk造m woltomierzem zmierzy貫 co si dzieje z napi璚iem na wyj軼iu LM35?

    0
  • #28 21 Pa 2009 19:16
    peterrrm
    Poziom 14  

    Sprawdza貫m woltomierzem. Okazuje si, 瞠 zmiany napi璚ia s p造nne co 1mV (tak mam rozdzielczo嗆 woltomierza)wiec to jest 0.1 stopnia. Wi璚 wina jest w moim uk豉dzie albo w przetwarzaniu. Napi璚ie odniesienia mam wewn皻rzne. Przyjmuj帷 do oblicze teoretycznych 2,56 V , otrzymuje 2,56/1024=0,0025 V rozdzielczo軼i, zak豉daj帷 jednak rzeczywist rozdzielczo嗆 9 bit闚 mamy 0,005 V rozdzielczo軼i a wiec jest to p馧 stopnia. Zastanawiam si w takim razie czy wahania na poziomie +-0,5 stopnia nie s czym normalnym? Ale w takim razie jak to sie ma do rozdzielczo軼i jak Wam si udaje uzyska-dziesi皻ne cz窷ci stopnia. Zamieszczam schemat uk豉du, zasilacz 9V to zwyk造 zasilacz nie stabilizowany. Na schemacie nie ma LCD kt鏎y w rzeczywisto軼i jest i znajduj sie na pinach: PD4,PD5,PD6,PB0,PB1,PB2,PC2.
    Termometr ATMEGA8 + LM35 w C/C++Termometr ATMEGA8 + LM35 w C/C++

    0
  • #29 21 Pa 2009 19:26
    tmf
    Moderator Mikrokontrolery Projektowanie

    Juz ci pisalem - zastosuj noise canceller zgodnie z sugestia w datascheecie ATMegi, prawidlowe prowadzenie mas (pokaz rysunek PCB) i ew. oversampling.

    0
  • #30 21 Pa 2009 21:59
    r06ert
    Poziom 25  

    tmf ma racj, poza tym podaj jak d逝gie masz przewody do LM35?

    0