PIC16F87X te ADC MODÜLÜNÜN KULLANIMI Emre YAVUZ Temmuz 2009
PIC16F87X te ADC MODÜLÜ Ü KULLA IMI Bu makalemizde PIC16F87X serisi mikrodenetleyicilerde ADC modülünün temel düzeyde kullanımını anlatacağım. Mikrodenetleyicilerin sadece belli değerlerlerde çıkış verebildiğini, giriş olarak ise belli bir değerin üzerini 1 altını ise 0 olarak yorumladığını biliyoruz ama bazı durumlarda analog değerlere ihtiyaç duyarız, bu değere çıkış olarak ihtiyaç duyduğumuzda bunu PWM ile hallederiz. Giriş olarak ihtiyaç duyduğumuzda ise ADC modülü olan mikrodenetlecilerin bu özelliklerinden faydalanabiliriz. ADC kısaltması Analog-Digital Converter dan gelir, Türkçe ye analog-dijital çevirici olarak tercüme edebiliriz. PIC16F876 da 5 kanal PIC16F877 de 8 kanallı ADC modülü bulunmaktadır, bu modüllerden 10 bitlik giriş alınabilir. Bu kanallar PIC16F876 da Porta da PIC16F877 de ise Porta da ve Porte de bulunur. ADC modülünün işlemlerinde 4 önemli yazmaç vardır. Bunlar ADCON0, ADCON1, ADRESH, ADRESL dir. ADCON lar A/D çevriminin kontrolünü yönetirler. ADRES ler ise sonuçların yazıldığı yazmaçlardır. Burada bir noktayı belirtmemiz yararlı olacaktır, ADCON0 ve ADRESH yazmaçları Bank0 da bulunurken, ADCON1 ve ADRESL yazmaçları Bank1 de bulunur. Banklar doğru ayarlanmazsa program çalışmayacağı için programı yazarken buna dikkat edilmesi gerekir. ---ADCO 0--- ADCO 0,7:6 (ADCS1: ADCS0 (Bit özel isimleri)) Bu yazmaçın 7 ve 6. bitleri TAD değerini ayarlamaya yarar. TAD A/D çevrim periyodudur. Bir çevrim için minimum 12TAD süresi gerekir. TAD süresi için dört seçenek vardır. 00 = Fosc/2 01 = Fosc/8 10 = Fosc/32 11 = Frc (Dahili RC osilatöründen elde edilen zaman) TAD süresi minimum 1.6 mikro saniye olmalıdır. Bunun için 1 Mhz lik bir PIC te Tosc 2, 4 Mhz likte 2 veya 8, 20 MHZ likte ise hepsi seçilebilir. ADCO 0,5:3 (CHS2:CHS0) ADCON0 ın 5-3 arasındaki bitleri hangi kanalın devrede olacağını belirlemeye yarar. Porte deki kanallar sadece PIC16F877 de vardır. 000 = Kanal 0 (RA0) 001 = Kanal 1 (RA1) 010 = Kanal 2 (RA2) 011 = Kanal 3 (RA3) 100 = Kanal 4 (RA5) 101 = Kanal 5 (RE0) 110 = Kanal 6 (RE1) 111 = Kanal 7 (RE2)
ADCO 0,2 (GO/DONE) ADCON0 yazmacının 2. biti durum bitidir. Bu bitin değerini 1 yaparsanız. Çevirme işlemi başlar ve bu bit durum biti şeklini alır, hem işlemi başlatmaya hem de durumunu öğrenmeye yarar, işlem devam ettiği sürece değeri 1 olarak kalır işlem bittiğinde 0 değerini alır. ADCO 0,1 Bu bit boş. 0 olarak değerlendirebilirsiniz ADCO 0,0 Bu bit, A/D çevrimini açıp kapatmaya yarar. 1 ise işlem yapılabilir, 0 ise kapalı hale geçer çevirme işlemi yapılamaz. ---ADCO 1--- ADCO 1,7 (ADFM) Bu bit 10 bitlik sonucun hangi şekilde yazılacağını ayarlamaya yarar. Bahsettiğimiz üzere sonuç için iki adet yazmaç bulunur(adresh ve ADRESL). Bu biti 0 olarak ayarlarsak sonucun büyük haneleri ADRESH ta yer alır son iki hanesi ADRESL nin 7. ve 6. bitine yazılır. 1 olarak ayarlarsak sonucun en büyük iki hanesi ADRESH ın 1. ve 0. bitine yazılır. Diğer küçük haneleri ise ADRESL ye yazılır. ADCO 1,6:4 BU bitlerin bir etkisi yoktur. 0 olarak değerlendirebilirsiniz. ADCO 1,3:0 (PCGF3:PCGF0) Bu bitler hangi kanalları A/D çevrimi için açacağınızı ve referans voltajlarının ne olacağını belirlemeye yarar. Seçeneklere aşağıdaki tablodan bakabilirsiniz.
A harfi Analog giriş anlamına gelir. PIC16F876 kullanıyorsanız. RE2, RE1 ve RE0 da A harfi bulunan kanalları tercih edemezsiniz. Vref, referans voltajı anlamındadır, Vref adı geçmeyen kanallarda referans voltajı Vdd ve Vss olur, sadece Vref+ olan kanallarda artı değerini Vref sütununda belirtilen porttan, Vref+ ve Vref- beraber bulunuyorsa ikisini birden harici olarak belirtilen portlardan vermeniz gerekiyor. Bu referans voltajları A/D çevrimi için oldukça önemlidir Vref+ A/D çevrim sonucunun alabileceği en yüksek değere karşılık gelir. Yani siz referans olarak Vdd yi seçmişseniz, 10 bitlik sonuç 1111111111 şeklindeyse bu sonucunuzun 5 volt olduğu anlamına gelir, harici referans vermeyi seçtiniz ve Vref+ değeri olarak 3 volt verdiniz diyelim o zaman bu en üst değer 3 volt a tekabül eder. Diyelimki Vref- olarak da 1 volt verdiniz o zaman analog çevrimin sonucu sıfır olduğunda bu 1 volta karşılık gelir. Sonuçta bir A/D çevrimi için yapmanız gerekenleri şu şekilde sıralayabiliriz. 1. Hangi kanalları A/D çevrimine açacağınızı ve çevrim sonucunu nasıl yazdırmak istediğinizi göz önünde bulundurarak ADCON1 yazmacının değerini ayarlayın. 2. Çevrimi açmak ve bu çevrimi hangi kanaldan(a/d çevrimini birkaç kanaldan aynı anda yapamazsınız) yapacağınızı ve çevrim periyodunu ayarlamak için ADCON0 yazmacına gerekli değerleri ayarlayın. 3. ADCON0 ın Go/Done bitini 1 yaparak çevirme işlemini başlatın. 4. Go/Done bitinin 0 değerini almasını bekleyin. Bu değerin 0 olması işlemin bittiğinin, sonucunda ADRESH ve ADRESL ye yazıldığını belirtir. 5. Sonuç yazılma ayarlarınızı göz önünde bulundurarak sonucu değerlendirebilirsiniz. Sonucu 10 bit üzerimden değerlendirmeniz gerekir. Elde edilen sonucun kaç volta karşılık geldiğini şu şekilde formülize edebiliriz. ((ADRESH:ADRESL) x (Vref+ - Vref-) ) / 1023 Örnek olarak sonuç değerimiz 0110101010 olsun, referans olarakta Vdd ve Vss yi seçtiğimizi varsayarsak (426x(5-0)) / 1023 den yaklaşık olarak 2.1 volt sonucunu elde ederiz. Makalemizi bir örnekle bitirelim. BA KSEL ADCO 1 ; Bank 1 e geçiyoruz. MOVLW B'00000010' ; ADFM 0 MOVWF ADCO 1 ; Porta daki tüm kanallar A/D ye açık. ; Referanslarımız Vdd ve Vss BA KSEL ADCO 0 ; Bank 0 a geçiyoruz. MOVLW B'01000001' ; Fosc/8 MOVWF ADCO 0 ; Porta daki tüm kanallar A/D ye açık. BSF ADCO 0,2 ; ADC yi çalıştır BTFSC ADCO 0,2 GOTO $-1 ; Đşlemin bitmesini bekle ;Đşlem bittikten sonra büyük kısmı ADRESH ta olan sonucu istediğiniz gibi kullanabilirsiniz.
Bir makalemizin daha sonunda geldik. Başka makalelerde görüşmek üzere. Bağlantılar http://robot.ee.hacettepe.edu.tr/ Kaynaklar PIC16F87X datasheet