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

[Rozwiązano] Termometr ATMEGA8 + LM35 w C/C++

U-235 30 Sie 2009 16:39 21619 51
  • #1 6961015
    U-235
    Poziom 12  
    Witam

    Od kilku dni kopie w google oraz na forum szukając informacji na temat przetwornika ADC zawartego w uP atmega8 oraz sposobu użycia go do pomiaru napięcia z analogowego czujnika temperatury LM35. Chciałbym stworzyć układ który mierzy temperature oraz wyświetla wynik na dwóch modułach 7 segmentowego wyświetlacza led.
    Chciałbym aby ktoś udzielił mi informacji jak odpalic sam przetwornik w C/C++.
    Wiem, że ten czujnik daje napięcie 10mV na każdy °C.
    Może któryś z szanownych forumowiczów miałby kawałek kodu i schemat spełniający nadający się do tego projektu. Najbardziej zależy mi na kodzie.

    Proszę także o sprawdzenie czy schemacik, który stworzyłem jest poprawny i czy to urządzenie ma prawo działać:

    Termometr ATMEGA8 + LM35 w C/C++

    Wszelkie informacje na ten temat mile widziane :D
  • #2 6962915
    kordirko
    Poziom 22  
    poczytaj tutaj:
    http://avr.elektroda.eu/?q=node/30

    Do wejścia AREF musisz podłączyć własne zewnętrzne źródło napięcia,
    albo skorzystać z wewnętrznego źródła 2,56V, ale wtedy należy między AREF i masę wpiąć kondensator.
    Na płytce masy cyfrowa (GND) i analogowa (AGND) muszą być połączone, na schemacie tak jakby brakowało "kropki" ;).
    Rezystor 10K ze schematu wywal - AVCC nie może się różnić od VCC mniej niż 0,3V
    - w jego miejsce najlepiej wstawić dławik 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ędzy wejściem a LM35 wywal - w dokumentacji na str. 202 pisze
    żeby sygnał analogowy najlepiej miał impedancję wyjściową co najwyżej 10K,
    tym szeregowym rezystorem 100K mu "dobijasz" razy 10 ;)
  • #3 6964713
    Konto nie istnieje
    Konto nie istnieje  
  • #4 6966157
    U-235
    Poziom 12  
    Poprawiłem schemat według zaleceń kolegi, zamieszczam go poniżej. Korzystam z zewnętrznego napięcia, mógłbym jeszcze wpiąć rezystor na połączeniu AREF do zasilania ale nie wiem czy jest konieczny.
    Bardzo dziękuje za sugestie oraz ciekawe linki.

    Kod jak najbardziej mi się przyda, po małej modyfikacji nadaje się do mojego projektu jako szkielet, bardzo dziękuje :D


    Termometr ATMEGA8 + LM35 w C/C++




    Mam jeszcze jedną prośbe , chciałbym aby ktoś pomógł mi przerobić powyższy kodzik tak, żeby pasował do mojego schematu, może być z wewnętrznym napięciem odniesienia, wstawie kondensator w odpowiednie miejsce.
    z góry dziękuje ;)
  • #5 7010726
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #6 7019448
    peterrrm
    Poziom 14  
    Witam,

    Prosze mi podpowiedzieć czy dobrze zrozumiałem. Ale wydaje mi się, że układ LM35 nie wymaga bardzo stabilnego napięcia i małe wachania napięcia nie zmieniają jego wskazań.Kataog podaje od 5V do 20V. Jeśli się myle to proszę o poprawienie
  • #7 7038489
    tmf
    VIP Zasłużony dla elektroda
    LM35 nie potrzebuje stabilnego napiecia, ale ATMega potrzebuje stabilne napiecie referencyjne, zeby poprawnie zmierzyc to co podaje LM35.
  • #9 7140239
    peterrrm
    Poziom 14  
    Żeby nie zakładać nowego tematu, pisze tutaj. Zbudowałem układ w oparciu o schemat i powyższe uwagi. Niestety pojawiły sie pewne problemy. Pokazywana temperatura jest bardzo nie stabilna, i nie zmienia się z rozdzielczością 0,5 C ale około 1. Próbowałem uśredniać temperaturę z 10 pomiarów, ale też nie wygląda to dobrze. Gdzie szukać źródła zakłóceń?
  • #10 7140436
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #11 7141837
    peterrrm
    Poziom 14  
    Źróżdło referencyjne mam wewnętrzne, przy każdym zasilaniu mam kondensator 100nF do masy, na wejściu ADC rezystor 330 Ohm, bez kondensatora bo jak miałem (10nF) to skoki były jeszcze większe. Masę analogową mam z LM35 bezpośrednio do pinu AGND, podobno tak powinno być. Może ktoś się jeszcze wypowie jak u niego z rozdzielczością? 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ściu w dół to samo.
  • #12 7141934
    Konto nie istnieje
    Poziom 1  
  • #13 7142026
    tmf
    VIP Zasłużony dla elektroda
    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?
  • #14 7142070
    Konto nie istnieje
    Poziom 1  
  • #15 7142204
    peterrrm
    Poziom 14  
    Dziękuje za odpowiedzi!

    Tak to Atmega8. Jeśli chodzi o mase to mam masę czujnika bezpośrednio do AGND i tyle, zgodnie z tym :Link. Z opisu na tamtej stronie wynika, że masa GND lepiej jak nie jest łączona z AGND,więc tak zrobiłem. Nie usypiam procesora na czas konwersji(ale postaram się to zrobić,może ktoś podpowie jak?). Natomiast chyba mam błąd ogólnie w programie, bo wnioskuje po odpowiedziach, że nie prawidłowo odczytuje i przetwarzam.
    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ętrznego żródła napięcia odniesienia	
    	ADMUX |= _BV(REFS0);		
    	ADMUX |= _BV(REFS1);		
    	// Zezwolenie na konwersję	
    	ADCSRA |= _BV(ADEN);		
    	// Wybranie częstotliwości dla taktowania przetwornika  (1/32 częstotliwosci zegara kontrolera) 
    	ADCSRA |= ((1<<ADPS0)&(1<<ADPS2));	 	
    }
    
    
    int main(void)
    {
    	
    	Inicjalizacja();  // Inicjalizacja ADC i LCD
    	
    	
    
    	while(1)
    	{
    	ADCSRA |= _BV(ADSC);         // Rozpoczęcie przetwarzania
    		
    	while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie 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świetla na LCD. Czy taki sposób może być przyczyną takich skoków? i w takim razie jak najlepiej obsługiwać ADC? Dziękuje
  • #16 7143130
    tmf
    VIP Zasłużony dla elektroda
    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...
  • #17 7143179
    Konto nie istnieje
    Poziom 1  
  • #18 7143364
    peterrrm
    Poziom 14  
    Tak na schemacie jest ADC1 ale ja mam podłączone napewno do ADC0 i tak tez jest w programie. Jeśli chodzi o GND to nigdzie nie łącze z AGND zgodnie z tym co jest w podanym przezemnie linku. Ale za chwile spróbuje połączyć.
  • #19 7143483
    Konto nie istnieje
    Poziom 1  
  • #20 7143525
    peterrrm
    Poziom 14  
    W takim razie dlaczego układ działa 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?
  • #21 7143590
    Konto nie istnieje
    Poziom 1  
  • #22 7143637
    peterrrm
    Poziom 14  
    Jeśli to połączenie będzie na nodze procesora AGND i dodatkowo miedzy ADND i ADC0 kondensator, będzie ok? Może ktoś jeszcze miał podobny problem z rozdzielczością? wydaje mi się, ze to nie wina Atmegi i przetwarzania ale LM35 to on chyba nie daje wartości pośrednich.
  • #23 7143674
    Konto nie istnieje
    Poziom 1  
  • #24 7143715
    peterrrm
    Poziom 14  
    Dzięki Atom1477 za odp. sprawdzałem różne połączenia i ta Atmega się zachowuje tak jakby miała wewnętrznie zwarte GND z AGND, np. jeśli przyłącze masę czujnika do GND a nogę AGND zostawię w "powietrzu" wynik przetwarzania jest identyczny jakbym podpiął tę masę do AGND, dziwne :)
  • #25 7149996
    peterrrm
    Poziom 14  
    Nikt nie wie jaka może być przyczyna tak małej rozdzielczości LM35? Może ktoś miał podobny problem.
  • #26 7150831
    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ęcie zasilania masz dobrze odfiltrowane?
  • #27 7151438
    Konto nie istnieje
    Poziom 1  
  • #28 7157557
    peterrrm
    Poziom 14  
    Sprawdzałem woltomierzem. Okazuje się, że zmiany napięcia są płynne co 1mV (taką mam rozdzielczość woltomierza)wiec to jest 0.1 stopnia. Więc wina jest w moim układzie albo w przetwarzaniu. Napięcie odniesienia mam wewnętrzne. Przyjmując do obliczeń teoretycznych 2,56 V , otrzymuje 2,56/1024=0,0025 V rozdzielczości, zakładając jednak rzeczywistą rozdzielczość 9 bitów mamy 0,005 V rozdzielczości 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ścią jaką Wam się udaje uzyskać-dziesiętne części stopnia. Zamieszczam schemat układu, zasilacz 9V to zwykły zasilacz nie stabilizowany. Na schemacie nie ma LCD który w rzeczywistości 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++
  • #29 7157636
    tmf
    VIP Zasłużony dla elektroda
    Juz ci pisalem - zastosuj noise canceller zgodnie z sugestia w datascheecie ATMegi, prawidlowe prowadzenie mas (pokaz rysunek PCB) i ew. oversampling.
  • #30 7158682
    r06ert
    Poziom 25  
    tmf ma rację, poza tym podaj jak długie masz przewody do LM35?
REKLAMA