28 Ocak 2016 Perşembe

ATMEGA32 İLE SICAKLIK ÖLÇER

Bu yazımızda ATMEGA32 mikrodenetleyicisine LM35DZ sıcaklık sensörünü bağlayarak sensörün ölçtüğü sıcaklığı 2x16'lık LCD ekran ile Görüntülemeyi anlatacağız



             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


            2)LM35DZ Sensörü Bacak Bağlantısı



                             
şekildede görüldüğü gi düz kısmı size bakacak şekilde en soldaki pin besleme pini(Vs),ortadaki pin çıkış pini(Analog çıkış,Vout),en sağdaki pin ise toprak(GND) pinidir.



           3)LCD Bacakları

Yukarıdaki şekilde görülen 16x2'lik bir LCD displaydir.LCD displayler I2C protokolü ile haberleşir.Biz bu devremizde 1602a LCD displayini seçtik.

                 

Pinlerinin Anlamları ise;

  1. Vss = Displayin toprağıdır.
  2. VDD = Displayin beslemesidri.(5v)
  3. V0 = Kontrast Ayarıdır.
  4. RS = Hafıza seçme pinidir.
  5. R/W = Okuma/ Yazma aktifleştirme pinidir.
  6. E = Aktifleştirme pinidir.
  7. DB PİNLERİ = Veri Yolu pinleri(programlanacak pinlerdir)
  8. A = Arka fon ışığı beslemesidir.
  9. K = Arka fon ışığı toprağıdır.



           4)Devre Şeması



NOT: LCD V0 pini 10k'lık bir potansiyometre ile toprağ bağlanacaktır.Bağlana potansiyometrenin değeri ile oynanarak LCD'nin kontrast ayarı yapılır!!!

Devre Şeması Açıklaması;

  1. Lm35'in 2. ve 3. bacağı arasına 100uF'lıkc elektrolitik kondansatör bağlanmasının nedeni ölçülen değerdeki sapmayı gidermek içindir.
  2. AREF pinin kutupsuz kondansatör ile beslenmeye bağlanmasının nedeni Lm35'in analog sensör olması ve beslemeden gelen DC gerilimin gürültüsünü giderip sensörü verilerini daha hassas yapmaktır
  3. ICSP pinleri ise Programlama için kullanılır.




           5)Devrenin KODU


#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <stdlib.h>
#define enable            5
#define registerselection 6
void send_a_command(unsigned char command);
void send_a_character(unsigned char character);
void send_a_string(char *string_of_characters);
int main(void)
{
    DDRB = 0xFF;
    DDRA = 0;
    DDRD = 0xFF;
    _delay_ms(50);
    
    ADMUX |=(1<<REFS0)|(1<<REFS1);
    ADCSRA |=(1<<ADEN)|(1<<ADATE)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
    
    int16_t COUNTA = 0;
    char SHOWA [3];
     
    send_a_command(0x01); //Clear Screen 0x01 = 00000001
    _delay_ms(50);
    send_a_command(0x38);
    _delay_ms(50);
    send_a_command(0b00001111);
    _delay_ms(50);
    
    ADCSRA |=(1<<ADSC);
    while(1)
    {
        COUNTA = ADC/4;
        send_a_string ("BERK DESIGN");
        send_a_command(0x80 + 0x40 + 0);
        send_a_string ("Temp(C)=");
        send_a_command(0x80 + 0x40 + 8);
        itoa(COUNTA,SHOWA,10);
        send_a_string(SHOWA);
        send_a_string ("      ");
        send_a_command(0x80 + 0);
        
    }    
}
void send_a_command(unsigned char command)
{
    PORTB = command;
    PORTD &= ~ (1<<registerselection);
    PORTD |= 1<<enable;
    _delay_ms(20);
    PORTD &= ~1<<enable;
    PORTB = 0;
}
void send_a_character(unsigned char character)
{
    PORTB = character;
    PORTD |= 1<<registerselection;
    PORTD |= 1<<enable;
    _delay_ms(20);
    PORTD &= ~1<<enable;
    PORTB = 0;
}
void send_a_string(char *string_of_characters)
{
    while(*string_of_characters > 0)
    {
        send_a_character(*string_of_characters++);
    }
}




           

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








0 yorum:

Yorum Gönder