ADC Keypad (Analog Klavye)

ADC Keypad (Tuş takımı)

 Bir önceki yazıda matrix 4×4 taramalı keypad’in çalışmasını anlatmıştık. Bu tür tuş takımları için 8 adet pin gerekmektedir. Tarama tekniği ile 16 tuş için 8 girişe kadar giriş pinlerini azaltmıştık. Peki bizim 8 adet girişe ayıracak pinimiz yoksa ne yapacağız?

Bu yazımızda ADC keypad’i yani ADC tuş takımını inceleyeceğiz.

Bu uygulamada;

* ADC interrupt (ADC kesmesi),

* 74HC595 Shift Register entegresi sürmeyi,

* Analog veri okumayı,

* Dirençlerle yapılan gerilim bölücü hesabını öğreneceğiz.

ADC Keypad

Niçin böyle bir keypad’e ihtiyaç duyuldu? Elinizde 8 pin 12F675 türünden pin sayısı az bir mikrodenetleyiciniz var ve butonlarla veri gireceksiniz. Giriş için kullanacağınız buton sayısı 8 adet. Zaten uC pin sayısı 6 adet (8-2=6). Bu durumda en güzel ve pratik çözüm ADC keypad olacaktır. ADC keypad’ten bilgi  kesme ile alınacağından uC meşgul edilmeden sadece tuş basılma durumunda okuma yapılacaktır.

tusTakimi_analogTuş takımı 10k sabit direnç üzerine düşen gerilimin ADC birimine ulaştırılmasıyla çalışmaktadır. Her butonla birlikte 10k direnç gerilim bölücü olarak çalışmaktadır.

Örnek:

B0 butonuna basıldığında 1k direnç ile 10k direnç seri olarak bağlanmakta ve çıkış gerilimi;

Vo=10k*5V/(10k+1k)= 4,545V  yani 4545mV  olacaktır.

Çözünürlük= 5V/1023=0,0048875855327468V olacaktır. Yaklaşık olarak değer başına 4,887 mV düşmektedir.

Çıkış gerimi ADC dönüşüm sonucu değer olarak 4545mV/4,887mV=930 olarak bulunacaktır. (Hatırlayınız 10-bit dönüşümde en yüksek değer 1023’tür.)

Aynı şekilde diğer butonlarda da bu durum oluşacaktır. Programda değerlendirilirken bu sayının 10 aşağısı ve 10 yukarısı arasındaki değerler olarak dikkate alınmalıdır. Çünkü dirençlerin toleransı var ve besleme gerilimi tam 5V olmayabilir.

7 Segment Display Sürülmesi

Tuş takımından basılan tuşun değerinin displayde görüntülenmesi için ortak anot 7segment display 74HC595 entegresiyle sürülmektedir. Bu entegreyle ilgili ayrıntılı bilgi için;

 https://elektrokod.wordpress.com/2013/12/14/74hc595-entegresi-ile-led-animasyonu/

 7 segment displaylerle ilgili ayrıntılı bilgi için;

https://elektrokod.wordpress.com/2013/12/09/7-segment-display-sayici-uygulamasi/

 

MikroC Program Kodları

#define SH_CP GPIO.B1
#define DS GPIO.B2
#define ST_CP GPIO.B4
//----------------------------
const char Ledkod[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
char tuss;
unsigned int analog_deger,tt;
//--------------------------------------
void veriYaz595(char veri)
{
  char i=0;
  ST_CP=0;
  SH_CP=0;
  DS=0;
  for(i=0;i<8;i++)
  {
    if(veri.B7) DS=1;
           else DS=0;
    SH_CP=1;
    asm{NOP;NOP;NOP;NOP;NOP;}
    SH_CP=0;
    veri<<=1;
  }
  ST_CP=1;
  asm{NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}
  ST_CP=0;
}
//---------------------------------------------
char tusCoz(int andeger)
{
  char tus;
  if(andeger>920&&andeger<940) tus=1;
  if(andeger>844&&andeger<864) tus=2;
  if(andeger>722&&andeger<742) tus=3;
  if(andeger>559&&andeger<579) tus=4;
  if(andeger>502&&andeger<522) tus=5;
  if(andeger>400&&andeger<420) tus=6;
  if(andeger>332&&andeger<352) tus=7;
  if(andeger>246&&andeger<266) tus=8;
  return tus;
}
//----------------------------------------
void interrupt()
{
  if(PIR1.ADIF)
  {
    PIR1.ADIF=0;
    tt=(ADRESH<<8)+ADRESL;
    tuss=tusCoz(tt);
    veriYaz595(ledKod[tuss]);
    Delay_us(50);
    ADCON0.B1=1; //ADC dönüşümü başlat (GO/DONE: A/D Conversion Status bit)
  }
}
//------------------------------------------
void main()
{
  ADCON0=0x81;
  ANSEL=1;
  TRISIO=1;
  GPIO=0;
  INTCON.GIE=1;
  INTCON.PEIE=1;
  PIE1.ADIE=1;
  PIR1.ADIF=0;
  ADRESH=0;ADRESL=0;
  Delay_ms(20);
  ADCON0.B1=1; //ADC dönüşümü başlat (GO/DONE: A/D Conversion Status bit)
  do
  {
    // ana program
  }while(1);
}

Not:   devrede kullanılacak dirençler %1 hassasiyetinde 5 band dirençler olmalıdır.

Kaynaklar:

http://er-online.co.uk/minisumo/wiki/ADCKeypadDecoding

Animasyon Videosu

 

 

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s