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.

Analog-Dijital dönüştürme sonucunu hesaplamak için ADC = (Vg*Coz)/Vmax şeklinde bir formül yazabiliriz.

Bu formülde;

ADC = Analog-Dijital dönüştürme sonucu
Vg = Girişe uygulanan gerilim
Coz = Analog-Dijital dönüştürme çözünürlüğü
Vmax = Analog girişe uygulanabilecek maksimum gerilimdir

Örneğin analog girişe 2V gerilim uyguladığımızı varsayalım ve 10 bit çözünürlüğünde Analog/Dijital dönüştürme sonucunu hesaplayalım;

10 bitlik en büyük sayının 1023 olduğunu ve girişe uygulayabileceğimiz maksimum voltajın 5V olduğunu biliyoruz. Formülümüzü yazalım;

ADC = (Vg*Coz)/Vmax formülünde bilinenleri yerine koyalım;

ADC=(2*1023)/5 = 409,2 olarak bulunur.

Ş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

Yorum Yap

  • serkan
    5 yıl ago  

    abi teşekkür ederiz paylaşım için . ancak anlamadığımız yerler var. ADC=10 açıklamasını anlamadım . output_d yazmışsınız ama içine (0b00) gibi bir şey yazmışsınız. yani hem d ye yaz hem b ye yaz gibi olmuş, burayı da anlamadım. saygılar

    • 5 yıl ago  

      Merhaba,
      ADC=10 kodu Analog – Dijital dönüştürme çözünürlüğünün 10 bit olacağını ayarlamak için kullanılır. Yani analog girişe uygulanan sinyal 5 volt ise, dönüştüme sonucu bize 10 bitlik en yüksek sayı olan 1023 değerini verir. Formülü ise; (5*1023)/5 = 1023’tür. Eğer analog girişe uygulanan sinyal 2 Volt ise dönüştürme sonucu bize (2*1023)/5 = 409,2 sonucunu verir.
      Analog dijital dönüştürme formulü:
      ADC = (Vg*1023)/Vmax
      Formülde;
      ADC = Analog-Dijital dönüştürme sonucu
      Vmax = Analog girişe uygulanabilecek maximum voltaj
      1023 = 10 bit değerindeki en büyük sayı
      Vg = Analog girişe uygulanan gerilimdir.

      Output_d(0b00000111); koduna gelirsek:
      Output_d() = D portuna veri yazacağımızı belirtir.
      0b00000111 = binary sayıyı temsil eder. Yani bir sayının başında 0b varsa program onu binary sayı olarak algılar. Eğer 0x varsa, o sayı hexadecimal sayıdır. Eğer sayı başında hiçbir ifade yoksa, o sayı decimal sayıdır.

      Output_d(0b00000111); komutunun eşdeğerini yazacak olursak;

      output_high(pin_D0);
      output_high(pin_D1);
      output_high(pin_D2);
      output_low(pin_D3);
      output_low(pin_D4);
      output_low(pin_D5);
      output_low(pin_D6);
      output_low(pin_D7);

      şeklinde olurdu.
      Biz yukarıdaki kodların tamamını output_d(0b00000111); komutuyla bir seferde yazmış olduk.

      • serkan
        5 yıl ago  

        şimdi anladım , teşekkürler

  • Ceren
    5 yıl ago  

    PORTA’nın A0 pinini analog giriş, diğer pinlerini de digital giriş olarak ayarlamak istiyorum. Hangi registerda nasıl bir değişiklik yapmam gerekiyo yardımcı olabilir misiniz

    • 5 yıl ago  

      Yukarıdaki kod örneğinde;
      setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
      yerine
      setup_adc_ports(AN0);
      yazarsanız, yalnızca A0 pinini Analog Giriş olarak kullanırsınız.
      A0 haricindeki diğer ADC pinlerini Dijital Giriş-Çıkış olarak kullanabilirsiniz.

  • zafer doğan
    4 yıl ago  

    hocam merhaba ;
    Vref+ olarak Vdd, Vref- olarak Vss gerilimlerini kullanan, RE0, RE1, ve RE2 pinlerinden
    analog değer okuyan, çevrim frekansı focs /2 olan, çevrim sonucunu sola dayalı olarak
    yazdıran ADC konfigürasyonunu CCS C fonksiyonlarını kullanmadan saklayıcılara
    doğrudan erişerek nasıl yazdırabilirim