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;
- 8 tane ADC (Analog Dijital Çevirici)
- ICSP Pinleri (MOSI,MISO,SCK,SS) bunlar proglanma pinleri
- 2 adet XTAL pini (Kristal Osilatörün Bağlandığı Pinler)
- Reset Pini (içindeki programı silmeye yarayan pin)
- RX,TX pinleri (seri port haberleşme pinleri)
- Vcc ,GND pinleri (denetleyicin beslemesi, aktifleştircisi)
- AVcc,GND pinleri (Analog pinleri aktifleştirmek için beslemeler)
- AREF pini (analog pinler için referans ayarının yapıldığı pin)
- 2 adet INT pini (dış kesme pinleri)
- Totalde 32 tane Programlanabilir Pine sahiptir.
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
Teşekkürler.Ellerinize sağlık
YanıtlaSil