Bu yazımda ADC nedir, nasıl ölçüm yapılır, ayarları nasıl yapılır bunlardan bahsedeceğim.
Dışarıdan gelen analog sinyallerin PIC’in anlayacağı biçime yani dijitale çevrilmesi işlemine ADC(Analog Digital Converter) denir. ADC modülü her PIC’de yoktur. Genellikle üst modellerde bulunmaktadır. Isı, nem, ışık, ses, direnç vs değerlerin işlenebilir veriye dönüşmesi için ADC işleminden geçmek zorundadırlar. Projemizi ADC modülü bulunan PIC16F877 entegresi üzerinden anlatacağım.
ADC’yi kurmak için bazı komutlar bulunmaktadır. Bunlar;
setup_adc(mod);
Bu fonksiyon A/D ölçüm frekansı belirlemektedir.
setup_adc(ADC_OFF); // ADC birimini kullanılmayacak
setup_adc(ADC_CLOCK_INTERNAL); // ADC çalışma frekansı fosilatör
setup_adc(ADC_CLOCK_DIV_2); // ADC çalışma frekansı fosilatör/2
setup_adc(ADC_CLOCK_DIV_8); // ADC çalışma frekansı fosilatör/8
setup_adc(ADC_CLOCK_DIC_32); // ADC çalışma frekansı fosilatör/32
PIC16F877 entegresinde 8 adet ADC pini bulunmaktadır. Bunlar ; RA0/AN0, RA1/AN01 RA2/AN2, RA3/AN3, RA5/AN4, RE0/AN5, RE1/AN6, RE2/AN7 dir.
Hangi pinin ADC olarak kullanılıp kullanılmayacağı setup_adc_ports() komutu ile belirtilir.
setup_adc_ports();
ALL_ANALOG = Tüm A/D pinler analog giriş için kullanılacak
NO_ANALOGS = Analog pinler A/D işlemi için kullanılmayacak
AN0_AN1_AN2_AN4_AN5_AN6_AN7 = RA0, RA1, RA2, RA5, RE0, RE1, RE2 girişleri A/D işlemi için kullanılacak
AN0_AN1_AN2_AN3_AN4 = RA0, RA1, RA2, RA3, RA4 girişleri A/D işlemi için kullanılacak
AN0_AN1_AN3 = RA0, RA1, RA3 girişleri A/D işlemi için kullanılacak
Bunlar gibi bir kaç tane daha port ayarlama modları bulunmaktadır. Bu komutları “C:\Program Files\PICC\Devices\16F877.h” dosyası içinde görebilirsiniz.
setup_adc_channel(kanal);
Hangi pinlerin A/D çevrimi için kullanılacağını ayarladıktan sonra hangi pinin okunacağını seçmek için kullanılan komuttur.
0 = RA0/AN0 1 = RA1/AN1 2 = RA2/AN2 3 = RA3/AN3 4 = RA5/AN4 5 = RE0/AN5 6 = RE1/AN6 7 = RE2/AN7
setup_adc_channel(0); // AN0 ucundaki analog girişi çevrim için haırlanır
setup_adc_channel(5); // AN5 ucundaki analog girişi çevrim için haırlanır
reac_adc();
Bu fonksiyon belirtilen kanaldan alınan sinyalin dijital karşılığını okur ve istenen değişkene atar.
1 2 |
set_adc_channel(1); bilgi = read_adc(); |
AN1 kanalı A/D çevrim için hazırlanmıştır, read_adc() ile dijital değer okunup bilgi değişkenine atanmıştır.
#device ADC = x
ADC modülünün kaç bit olacağını ayarlamak için kullanılır.
Bit sayısı denetleyiciye göre değişmektedir.
#device ADC = 8
#device ADC = 10
#device ADC = 11
#device ADC = 16
PIC16F877 denetleyicisin de 8 ve 10 bit kullanılabilmektedir.
Bu öğrendiklerimiz sonucunda RA0/AN0 pinine bağlı potansiyometreyi okuyup dijital karşılığını LCD de gösteren küçük bir uygulama yapalım.
Bunun için aşağıdaki devreyi tasarlayınız;
Yazılım;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <16f877.h> #device ADC = 10 #fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD #use delay(clock=20000000) #use fast_io(a) #define LCD_ENABLE_PIN PIN_B3 #define LCD_RW_PIN PIN_B2 #define LCD_RS_PIN PIN_B1 #define LCD_DATA4 PIN_B4 #define LCD_DATA5 PIN_B5 #define LCD_DATA6 PIN_B6 #define LCD_DATA7 PIN_B7 #include <lcd.c> int16 bilgi=0; void main() { setup_adc_ports(AN0); setup_adc(ADC_CLOCK_DIV_32); set_tris_a(0x01); set_tris_b(0x00); output_a(0x00); output_b(0x00); lcd_init(); delay_ms(10); while(1) { set_adc_channel(0); delay_us(20); bilgi = read_adc(); printf(lcd_putc,"\f%lu",bilgi); delay_ms(10); } } |
RA0/AN0 pini A/D çevirim için ayarlanmıştır. Pine sinyal girişi olacağı için set_tris_a(0x01) ile pin giriş konumuna alınmıştır. set_adc_channel(0) ile pin ölçülmüştür. Ölçme işlemi için minimum 20 usn beklenmek zorundadır, delay_us(20) ile 20 usn gecikme yapılmıştır. bilgi = read_adc() ile dijital değer okunup bilgi değişkenine atanmıştır ve değer ekrana yazılmıştır.
Dikkat edilmesi gereken ayrıntılar;
ADC işleminde pinlerin giriş veya çıkış olarak ayarlanabilmesi için #use fast_io(a) komutu kullanılmalıdır. Aksi takdirde okuma hatalı yapılır.
ADC 10 bit çevrim yapacağı için maximum voltaj(5V) dijital değeri karşılığı 2^10 = 1024 olacaktır. Bu değeri değişkene atarken değişken int olarak tanımlanmışsa LCD ekranda hatalı sonuçlar görülür. Bunun için en değişken int16(long) yada daha yüksek veri tipi olarak tanımlanmalıdır.
Çok faydalı konular paylaşıyorsun teşekkür ederim