Bu yazıda PIC Mikro Denetleyicilerinde bulunan ADC (Analog To Digital Converter) modüllerinin CCS-C derleyicisinde nasıl kullanıldığını anlatmaya çalışacağım.
ADC modülü Analog sinyali Dijital bilgiye dönüştüren donanımdır. ADC girişine uygulanan analog sinyal bir referans voltajı ile karşılaştırılarak ADC çözünürlüğüne uygun sayısal değere çevrilir. Bir örnekleme yaparak konuyu daha iyi anlayalım.
ADC çözünürlüğümüz 10 Bit olsun, 10 bit ile üretilebilecek en büyük sayı 1023 değeridir.
ADC Referans voltajımız ise 5V olsun, bu durumda ADC girişine 2.5V luk bir sinyal uygularsak dönüştürme işlemi sonucunda 511 değeri okunacaktır.
ADC modülümüz de referans 5V olduğuna göre 0-5v arası gerilim, 0-1023 arası bir değer üretecektir
5 / 1023 = 0.0048875
2.5 / 0.0048875 = 511
CCS-C Derleyicisinde Pic mikro denetleyicilerinin ADC donanımlarını kullanabilmek için aşağıdaki fonksiyonlar hazır olarak gelmektedir.
setup_adc()
setup_adc_ports()
set_adc_channel()
read_adc()
adc_done()
Şimdi sırasıyla bu fonksiyonların ne işe yaradıklarını ve kullanım şekillerini izah edelim.
setup_adc()
Bu fonksiyon kullanılarak ADC modülünün ayarları yapılabilir. Aşağıda kullanım örneklerini görebilirsiniz.
setup_adc(ADC_OFF); // ADC modülü kapalı setup_adc(ADC_CLOCK_INTERNAL); // ADC için dahili clock kullanılacak setup_adc(ADC_CLOCK_DIV_8); // Clock 8'e bölünerek kullanılacak
setup_adc_ports()
Bu fonksiyon kullanılarak ADC modülüne bağlı olan ADC kanallarına ait ayarlamalar yapılır. ADC modülüne sahip olan PIC Mikro denetleyicilerinde analog kanal olarak kullanılabilen PIN’ler dijital I/O olarak ta kullanılabilmektedir.
ADC modülünde referans voltajı için iki seçenek mevcuttur. Birinci seçenek ADC’nin referans voltajı olarak çipe uygulanan besleme voltajını kullanmasıdır, bu durumda çipe uygulanan besleme voltajı ne ise ADC modülünün referans voltajı da aynı değer olur.
İkinci seçenek ise başka bir gerilim kaynağını ADC modülüne ait VREF+ ve VREF- Pinlerine uygulamak. Bu şekilde çalıştırabilmek için ADC modülü, vref voltajını harici kullanacak şekilde ayarlanmalıdır.
setup_adc_ports() fonksiyonu kullanılarak referans voltaj ayarlaması ve hangi portun analog hangi portun dijital kullanılacağı ayarlanabilir.
setup_adc_ports(NO_ANALOGS); setup_adc_ports(ALL_ANALOGS); setup_adc_ports(AN0_ANALOG); setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF);
set_adc_channel()
Analog modüle sahip pic mikro denetleyicilerinin bir çoğunda birden fazla analog kanal bulunmaktadır. Bu fonksiyon yardımıyla hangi kanaldan okuma yapılacağı belirtilir.
set_adc_chanel(1); set_adc_chanel(2);
Kanal ayarlaması yapıldıktan sonra yanlış okuma yapmamak için kısa bir süre beklenmesi gerekmektedir. Bu yüzden bu fonksiyonun ardından ortalama 10us’lik bir gecikme kullanmak gerekmektedir.
read_adc()
Bu fonksiyon ayarlamaları yapılmış adc modülünden değer okuması yapmak için kullanılır. Bu fonksiyona aşağıdaki parametreler opsiyonel olarak verilebilmektedir.
ADC_START_AND_READ, (dönüştürme işlemini başlat sonucu oku, hiçbir parametre verilmezse bu geçerlidir)
ADC_START_ONLY (Dönüştürme işlemini başlat ve çık)
ADC_READ_ONLY (En son dönüştürme işlemini oku)
adc_done()
Bu fonksiyon kullanılarak başlamış olan bir ADC dönüştürme işleminin tamamlanıp tamamlanmadığı tespit edilebilir. Fonksiyon çağrıldığında dönüş değeri 1 ise dönüştürme işlemi tamamlanmış 0 ise dönüştürme işlemi devam etmektedir.
Örnek Program
Aşağıdaki örnek ugulamada PIC16f876 denetleyicisinin iki adet analog kanalından okuma yapılarak PORTB ve PORTC’ye bağlı ledler yakılıyor. Program başındaki #device ADC=8 ifadesi, adc_read() fonksiyonunun 8 bitlik değer döndürmesini sağlar.
#include <16F876.h>
#device ADC=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
void main(void)
{
int16 adc_value;
/* adc modülü ayarlanıyor */
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
while(TRUE)
{
/* 1. ADC kanalını seç ve değeri oku*/
set_adc_channel(0);
delay_us(10);
adc_value = read_adc();
/* okunan değere göre ilgili ledleri yak */
output_bit(PIN_C0, (adc_value > 0));
output_bit(PIN_C1, (adc_value > 32));
output_bit(PIN_C2, (adc_value > 64));
output_bit(PIN_C3, (adc_value > 96));
output_bit(PIN_C4, (adc_value > 128));
output_bit(PIN_C5, (adc_value > 160));
output_bit(PIN_C6, (adc_value > 192));
output_bit(PIN_C7, (adc_value > 224));
/* 2. ADC kanalını seç ve değeri oku*/
set_adc_channel(1);
delay_us(10);
adc_value = read_adc();
/* okunan değere göre ilgili ledleri yak */
output_bit(PIN_B0, (adc_value > 0));
output_bit(PIN_B1, (adc_value > 32));
output_bit(PIN_B2, (adc_value > 64));
output_bit(PIN_B3, (adc_value > 96));
output_bit(PIN_B4, (adc_value > 128));
output_bit(PIN_B5, (adc_value > 160));
output_bit(PIN_B6, (adc_value > 192));
output_bit(PIN_B7, (adc_value > 224));
}
}




