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

ATMega8 i LM35 - pomiar temperatury

milek277 11 Mar 2009 23:26 6705 7
REKLAMA
  • #1 6269828
    milek277
    Poziom 11  
    Witam,

    próbuję zmierzyć temperaturę za pomocą czujnika LM35 podłączonego do pinu ADC0 uC. Próbowałem kilku znalezionych w internecie funkcji, jednak bezskutecznie. Zależy mi na funkcji, która w ostateczności podałaby mi oddzielnie cyfrę dziesiątek i jedności celem wyświetlenia ich na wyświetlaczu LED.
  • REKLAMA
  • REKLAMA
  • #3 6271050
    milek277
    Poziom 11  
    Dzięki, tyle że tam jest kod w BASCOM'ie, a ja znam tylko C i kompiluję w WinAVR.
  • REKLAMA
  • #4 6271305
    kaktus_c++
    Poziom 18  
    Słuchaj: wejdź na stronę firmy propox, znajdź na przykład opis zestawu evbavr04 , tam są przykładowe programy do ściągnięcia na AtMegę8 w języku C. Między innymi program na termometr LM35. I Jeszcze zobacz sobie tam w pdf na samym końcu jest schemat jak podłączyć LM35.
    I kurde wszystko.

    Pozatym ten post powinieneś zadać w dziale mikrokontrolery.
    (A 11 września to największe kłamstwo tego wieku)
  • #5 6277113
    milek277
    Poziom 11  
    Temat był w dziale mikrokontrolery, ale go ktoś przeniósł.

    W tym zestawie evbavr LM35 nie jest bezpośrednio podpięty pod uC, tylko przez jakieś pośrednie urządzonko. U mnie Vout jest bezpośrednio pod ADC0.

    Kod zawarty w evbavr nie działa.
  • #6 6281581
    kaktus_c++
    Poziom 18  
    mam ten zestaw i sprawdzałem czy to działa, i zapewniam Cię że tak.
    Ten LM35 jest podłaczony tylko po przez kondensator i rezystor - to nie jest aż tak skomplikowane, ale jeszcze jest podłączony potencjometr którym regulujesz/kalibrujesz termometr , no i w tym przykładzie tam gdzieś jest wspomniane że trzeba ustawić tym potencjometrem napięcie referencyjne dokładnie 1V, wtedy termometr bedzie wskazywał poprawnie. Ten potencjometr jest chyba też na schemacie i to jest chyba ADJREF , ale nie jestem pewien.

    Więcej Ci nie powiem bo nie wnikałem w to, gdyż dużo łatwiej i prościej jest używać (jak dla mnie) termometru 1-wire DS1820 .
  • REKLAMA
  • #8 6287349
    milek277
    Poziom 11  
    Kod z tego linku się nie kompiluje, niezadeklarowane MUX4, ADATE itp.

    Aktualnie mam taki kod (duża część kodu z Link)

    
    
    int a = 0;
    
    SIGNAL (SIG_OUTPUT_COMPARE2)
    {
    	if (++tick == 512)
    	{
    		tick = 0;	
    		temp = CzytajADC(0);
    
    	char tab[8];
    	itoa(temp, tab, 10);	
    		
    	if (++led == 2) led = 0;
    
    	PORTB = 0x03;/*
    	if(led == 0) PORTD = cyferki[czas[1]];
    	else PORTD = cyferki[czas[0]];*/
    	
    	switch(tab[led])
    	{
    		case '0':
    			a=0;
    			break;
    		case '1':
    			a=1;
    			break;
    		case '2':
    			a=2;
    			break;
    		case '3':
    			a=3;
    			break;
    		case '4':
    			a=4;
    			break;
    		case '5':
    			a=5;
    			break;
    		case '6':
    			a=6;
    			break;
    		case '7':
    			a=7;
    			break;
    		case '8':
    			a=8;
    			break;
    		case '9':
    			a=9;
    			break;
    	}
    	}
    	
    	PORTD = cyferki[a];
    	PORTB = ledy[led];
    }
    
    void StartADC(void)
    {
    	ADMUX = (1<<REFS0);
    	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    }
    
    uint16_t CzytajADC(uint8_t ch)
    {
       ch=ch&0b00000111;
       ADMUX|=ch;
       ADCSRA|=(1<<ADSC);
    
       while(!(ADCSRA & (1<<ADIF)));
       ADCSRA|=(1<<ADIF);
    
       return(ADC);
    }
    
    (...)
    
    int main(void)
    {	
    	//INICJACJA WYŚWIETLACZA LED
    	StartLED();
    
    	//ODPALANIE TERMOMETRU
    	StartADC();
    	
    	//OBSŁUGA PRZERWAŃ
    	sei();
    	
    	//SLEEP MODE - LED WYŚWIETLACZ
    	set_sleep_mode(SLEEP_MODE_PWR_SAVE);
    	
    	//PĘTLA
    	while(1) sleep_mode();
    	
    	return 0;
    }
    
    


    I wywala mi jakieś kosmiczne wartości, właściwie to losowo od 0 do ok. 90. Dlaczego ?
REKLAMA