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

ATMega8 + LM35 - odmierzanie temperatury

milek277 21 Mar 2009 18:25 3042 4
  • #1 6312697
    milek277
    Poziom 11  
    Witam,

    stworzyłem program, który za zadanie ma odczytywać wartość temperatury z czujnika LM35 podłączonego do portu ADC0 i wyświetlać ją na wyświetlaczu LED. Czujnik działa na +5V, Vout idzie przez rezystor 1k. Na samym początku przez przypadek podłączyłem odwrotnie bieguny czujnika, czy przez to mógł zostać on lub ADC ATMegi uszkodzony? Wyświetlacz podłączony jest do portów D i B, poza tym podłączony jest kwarc zegarkowy, gdyż mam zamiar także zaimplementować odmierzanie czasu. Kod wygląda tak:

    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h> 
    #include <avr/sleep.h>
    #include <avr/interrupt.h>
    #include <string.h>  
    
    const unsigned char cyferki[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    const unsigned char ledy[] = {0x02,0x01};
    
    unsigned char led;
    unsigned int tick;
    uint16_t temp;
    int text[8];
    
    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);
    }
    
    SIGNAL (SIG_OUTPUT_COMPARE2)
    {
    	if (++tick == 512)
    	{
    		temp = CzytajADC(0);
    		itoa(temp, text, 10);
    	}
    	
    	led++;
    	if (led == 2) led = 0;
    	
    	PORTB = 0x03;
    	
    	PORTD = cyferki[atoi(text[led])];
    	
    	PORTB = ledy[led];
    }
    
    void StartLED(void)
    {
    	DDRB=_BV(PB0)|_BV(PB1);
    	DDRD=_BV(PD0)|_BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4)|_BV(PD5)|_BV(PD6)|_BV(PD7);
    	ASSR=_BV(AS2);
    	TCNT2=0;
    	OCR2=7;
    	TCCR2=_BV(WGM21)|_BV(CS21);
    	while (ASSR&(_BV(TCN2UB)|_BV(OCR2UB)|_BV(TCR2UB)));
    	TIMSK=_BV(OCIE2);
    }
    
    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;
    }
    



    Mimo to na wyświetlaczu co sekundę wyświetlają się losowo kosmiczne wartości, skokowo od 10 do 90 itp., nawet po odłączeniu czujnika LM35 (jak gdyby nic on nie dawał). Czy to coś nie tak w kodzie, czy sprzęcie?
  • #2 6312955
    Dar.El
    Poziom 41  
    Witam
    Bez problemu możesz sprawdzić czujnik, zmierz napięcie na jego wyjściu. Powinno być 10mV x °C, czyli w temperaturze pokojowej około 220mV.
  • #3 6313430
    milek277
    Poziom 11  
    Aktualnie nie posiadam żadnego miernika napięcia.
  • #4 6317246
    Dar.El
    Poziom 41  
    Bez uniwersalnego miernika nic nie zrobisz. Kup jakiś za 20zł chociaż.
REKLAMA