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