CCS C Analog Giriş Okuma

Bilindiği üzere analog sinyal, dijital sinyallerden farklı olarak 0 ile 5V arasında dönüştürme çözünürlüğüne göre n kadar değer alabilirler. Yani dijital sinyallerde enerji var ya da yok (1-0) olarak  2 değerden bahsederken, analog sinyalde,  enerji şu kadar var gibi binlerce değer üzerinden işlem yapılabilir.

Bu durumu şöyle açıklayalım;
Örneğin bir su depomuz var, bu su deposundan dijital giriş ile değer okurken depoda su var, ya da depoda su yok olarak değer okuyabiliriz. Ancak aynı depodan analog giriş ile değer alırken, depoda şu kadar su var diyerek bir ölçü belirtebiliriz.

Analog giriş ile okuma yaparken iki önemli unsur vardır. Birincisi, dönüştürme aralığı, ikincisi ise dönüştürme çözünürlüğü.

Dönüştürme aralığı PIC ve diğer birçok denetleyiciler için 0 ila 5 volt arasıdır. Çözünürlük ise denetleyiciye göre farklılık gösterebilir. Analog dönüştürme çözünürlüğü 8, 10, 14 ya da 16 bit olabilir. Yani bu da demek oluyor ki 10 bit çözünürlüğündeki dönüştürme işlemi, 5V değerindeki gerilimi 2^10 yani 1023 parçaya böler.

Şimdi PIC denetleyicisi ile ADC (Analog Dijital Converter) işlemini CCS C dilinde inceleyelim;

ADC işlemi için öncelikle analog girişleri aktif etmemiz gerekmektedir. Aksi taktirde denetleyicimiz bu girişleri dijital olarak algılayacaktır.

PIC 16F877a denetleyicimiz için analog giriş pinleri aşağıdaki görselde de görüldüğü üzere RA ve RE portlarında toplam 8 adet bulunur. Analog giriş özelliğine sahip pin isimleri AN harfleri ile belirtilir.

16F877a pinout

Öncelikle her zaman olduğu gibi denetleyici dosyamızı içe aktarıyoruz ve ardından ADC çözünürlüğünü tanımlıyoruz. Bu çözünürlük denetleyiciye göre farklılık gösterebilir.

Şimdi Analog – Dijital dönüştürme frekansını belirlemek için bir ayar fonksiyonu kullanacağız. Fonksiyonumuz setup_adc() fonksiyonu olacak. Bu fonksiyonumuz main() fonksiyonu içerisinde tanımlanacaktır. Fonksiyonumuzun alabileceği parametreler aşağıda listelenmiştir.

  1. ADC_OF :ADC kullanılmayacak
  2. ADC_CLOCK_INTERNAL : ADC işlemi için dahili osilatör kullanılacak
  3. ADC_CLOCK_DIV_2 : Denetleyici frekansının yarısı kadarı kullanılacak
  4. ADC_CLOCK_DIV_8 : Denetleyici frekansının 1/8’i kullanılacak
  5. ADC_CLOCK_DIV_32 : Denetleyici frekansının 1/32’si kullanılacak

Ardından yine main fonksiyonumuz içerisinde analog giriş portları ayarlarını yapacağız.  Bunun için setup_adc_ports() fonksiyonunu kullanacağız. 16f877A denetleyicisinde bu fonksiyonumuzun alabileceği parametreler aşağıda verilmiştir;

  1. ALL_ANALOG : Tüm analog girişleri kullan
  2. NO_ANALOG : Analog giriş kullanma
  3. AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF : AN3 hariç tüm pinleri kullan, AN3 pinini “+” referans voltajı olarak kullan, “-” referans voltajını Vss pininden al.
  4. AN0_AN1_AN2_AN3_AN4 : Yalnızca RA portundaki analog girişleri kullan.( “+” referans voltajı Vdd, “-” referans voltajı “Vss” girişinden alınır).
  5. AN0_AN1_AN2_AN4_VSS_VREF
  6. AN0_AN1_AN3
  7. AN0_AN1_VSS_VREF
  8. AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF
  9. AN0_AN1_AN2_AN3_AN4_AN5
  10. AN0_AN l_AN 2_AN 4_AN 5_ VSS_ VREF
  11. AN0_AN1_AN4_AN5_VREF _VREF
  12. AN0_AN1_AN4_VREF _VREF
  13. AN0_AN1_VREF _VREF
  14. AN0
  15. AN0_VREF _VREF

Bu parametreler kullanılan denetleyiciye göre değişiklik gösterebilir. Kullanacağınız denetleyicilerin datasheet dosyalarına bakarak, hangi parametreleri kullanacağınızı öğrenebilirsiniz.

Şimdi setup_adc() fonksiyonu ile dönüştürme frekansımızı belirleyelim ve setup_adc_port() fonksiyonumuzla A portundaki tüm analog girişleri aktif edelim;

Buraya kadar hangi analog girişleri kullanacağımızı ve kaç bit çözünürlüğünde dönüştürme işlemi yapacağımızı tanımladık. Bu noktadan sonra artık analog giriş okumaya başlayabiliriz.

Analog giriş okumada kullanacğımız fonksiyonlarımızdan bir diğeri ise set_adc_channel() fonksiyonudur. Analog kanalları okumadan önce kullanacağımız bu fonksiyon, okunacak kanalı seçmek için kullanılır. Az önce RA portundaki tüm analog destekli pinleri analog giriş olarak tanımlamıştık. Şimdi örneğin AN1 kanalını okumak istersek, bu fonksiyonumuza gireceğimiz parametre “1” değeri olacaktır.

Sözdizimi: set_adc_channel(1) // AN1 analog girişindeki analog değeri okuyacağımızı belirttik

Okuyacağımız analog kanalı yukarıdaki gibi seçtikten sonra analog giriş okuma fonksiyonumuz olan read_adc() fonksiyonu ile, kanaldan analog değeri alacağız.

read_adc() fonksiyonu herhangi bir parametre almaz, bu sebeple fonksiyonun parantezleri arasını boş bırakıyoruz. Ancak fonksiyon geriye 16 bit değerinde bir değer döndüreceği için, bu değeri 16 bitlik bir değişkene atayacağız.

Sözdizimi: int16 bilgi = read_adc() // Analog girişi oku ve okunan değeri 16 bitlik bilgi değişkenine aktar.

Kanal seçip analog değer okumak için kodlarımız şu şekilde olacak;

 

Şimdi yukarıdaki öğrendiğimiz bilgilerle, analog giriş okuma işlemi yapalım:

AN1 girişine bağladığımız potansiyometreyi çevirerek RD portuna bağladığımız ledleri sırasıyla yakıp söndürelim. Kodlarımız aşağıdaki gibi olacak.

Kodlarımızı denetleyicimize yükledikten sonra, aşağıdaki devreyi kurup çalıştıralım;
Potansiyometre ayarı ile oynayarak ledlerin hareketlerini izleyebilirsiniz.

Pic_Analog_Giris_Led

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir