Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMega8 + LM35 - odmierzanie temperatury

milek277 21 Mar 2009 18:25 2592 4
  • #1 21 Mar 2009 18:25
    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:

    Code:

    #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?

    0 4
  • #2 21 Mar 2009 19:15
    Dar.El
    Poziom 40  

    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.

    0
  • #3 21 Mar 2009 20:51
    milek277
    Poziom 11  

    Aktualnie nie posiadam żadnego miernika napięcia.

    0
  • #4 22 Mar 2009 18:01
    Dar.El
    Poziom 40  

    Bez uniwersalnego miernika nic nie zrobisz. Kup jakiś za 20zł chociaż.

    0