29 Ocak 2016 Cuma

ATMEGA32 İLE LDR IŞIK SENSÖRÜ

Bu yazımızda ATmega32 mikrodenetleyicisi ile LDR'yi kullanarak ışık(LED)yakıp söndürme işlevini gerçekleyeceğiz.



             1)ATMEGA32 İÇ YAPISI 

                                 

Atmega32 40 adet Pine sahiptir. Bunlar;
  1. 8 tane ADC (Analog Dijital Çevirici)
  2. ICSP Pinleri (MOSI,MISO,SCK,SS) bunlar proglanma pinleri
  3. 2 adet XTAL pini (Kristal Osilatörün Bağlandığı Pinler)
  4. Reset Pini (içindeki programı silmeye yarayan pin)
  5. RX,TX pinleri (seri port haberleşme pinleri)
  6. Vcc ,GND pinleri (denetleyicin beslemesi, aktifleştircisi)
  7. AVcc,GND pinleri (Analog pinleri aktifleştirmek için beslemeler)
  8. AREF pini (analog pinler için referans ayarının yapıldığı pin)
  9. 2 adet INT pini (dış kesme pinleri)
  10. Totalde 32 tane Programlanabilir Pine sahiptir.
Atmega32'nin datasheet'ine baktığımız zaman en fazla 12Mhz'lik kristal ve en fazla 22pF'lık kutupsuz kondansatör ile çalıştığını görürüz. 


                            
Yukarıdaki resimde verilen bağlantı şekli genel mikrodenetleyici kristal bağlama şeklidir.Biz datasheetten okuduğumuz sınır değerlere uygun olarak;
  • C1,C2 kondansatörünü 22pF,XTAL kristalini 8 Mhz seçtik
          
           3) LDR Nedir?

Direnç değeri aydınlıkta azalan, karanlıkta ise artan elemana foto direnç (LDR)denir.Tam  aydınlık bir alanda yani üzerine güneş ışığı düşüyorken direnç değeri 5-10 Ω değerleri arasına kadar düşebilir. Tam karanlık bir ortamda yani üzerine az yada hiç ışık düşmezken  direnç değeri 200 MΩ gibi oldukça yüksek direnç değerleri gösterir. Yani foto direnç, üzerine düşen ışık arttıkça direnç değeri lineer olmayan bir şekilde azalır. Bu yüzden ışık şiddetinin artması direnç değerinin düşmesine, ışık şiddetinin azalması ise direnç değerinin artmasına sebep olur.


                 4)Devre Şeması
                 5)Devrenin KODU



#include <avr/io.h>
#include <util/delay.h>

#define LTHRES 500

// initialize adc
void adc_init()
{
    // AREF = AVcc
    ADMUX = (1<<REFS0);

    // ADC Enable and prescaler of 128
    // 16000000/128 = 125000
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

// read adc value
uint16_t adc_read(uint8_t ch)
{
    // select the corresponding channel 0~7
    // ANDing with '7' will always keep the value
    // of 'ch' between 0 and 7
    ch &= 0b00000111;  // AND operation with 7
    ADMUX = (ADMUX & 0xF8)|ch;     // clears the bottom 3 bits before ORing

    // start single conversion
    // write '1' to ADSC
    ADCSRA |= (1<<ADSC);

    // wait for conversion to complete
    // ADSC becomes '0' again
    // till then, run loop continuously
    while(ADCSRA & (1<<ADSC));

    return (ADC);
}

int main()
{
    uint16_t adc_result0, adc_result1;
    char int_buffer[10];
    DDRC = 0x01;           // to connect led to PC0

    // initialize adc and lcd
    adc_init();



    _delay_ms(50);

    while(1)
    {
        adc_result0 = adc_read(0);      // read adc value at PA0


        // condition for led to glow
        if (adc_result0 < LTHRES)
        PORTC = 0x00;
        else
        PORTC = 0x01;


    }
}





Okuduğunuz için Teşekkür ederim. Size daha iyi anlatım yapabilmem için lütfen yorumlarınızı eksik etmeyin


1 yorum: