
Merhaba Arkadaşlar,
Yavaş yavaş yazı serimizin sonuna yaklaşıyoruz. Artık işlemcimize analog dünyamızdan veri aktarma vaktinin geldiğini düşünüyorum. Analog dünyadan sayısal ortama geçiş için işlemcimizin içerisinde bulunan Analog to Digital Converter (ADC) modülünü kullanacağız. Kod bölümüne geçmeden önce kısaca ADC’nin bu geçiş işlemini nasıl yaptığı üzerinde biraz duralım.
Dünyamızda bütün işaretler analog formda bulunmaktadır, ancak bu analog işaretlerin saklanması ve işlenmesi sayısal işaretlere göre daha zordur. Bu nedenle analog verilerimizi 0-1 dünyasına geçirerek kolay depolama, şifreleme ve işleme gibi avantajlardan yararlanabileceğiz. Bu geçişte 3 adım bulunmaktadır.
- Örnekleme
- Kuantalama
- Kodlama
Örnekleme adımında zaman uzayında sürekli olan veriyi parçalıyoruz yani zamanın belirli anlarında örnekler alarak sadece alınan örnekleri sayısal ortama geçiriyoruz. Şimdi neden böyle yaptığımıza gelelim. Bilindiği gibi 1 ve 2 arasında sonsuz tane sayı bulunmaktadır. Bizde analog işaretimizi tamamen sayısala çevirmek isteseydik sonsuz depolama alanına ihtiyacımız olacaktı. Bu nedenle sadece işaretimizin belirli anlarında örnekler alarak o kısımları sayısala geçiriyoruz. Tabi bu durumda ne kadar sıklıkta örnek alacağımız da çok önemli. Az örnek alırsak işareti yeterince iyi bir şekilde temsil edememiş oluruz, gereğinden fazla örnek aldığımızda ise gereksiz depolama alanı ve yüksek işlem gücüne ihtiyaç duyarız. Peki uygun örnekleme sıklığı nedir? Bu soruya cevap Nyquist tarafından gelmiştir. Bu kritere göre analog işaretimizin en yüksek frekanslı bileşeninin 2 katından daha fazla frekansla (yani en az 2 kat) örneklemek gerekmektedir. Pratikte en yüksek frekansın 2.2 katı tercih edilir.
Kuantalama adımında ise bu sefer gerilim eksenini parçalara ayırıyoruz. Bunun nedeni yine sınırlı aralıktaki sınırsız sayıdaki gerilim seviyesini sınırlı sayıya düşürmektir. Genellikle ikinin kuvveti sayısında parçalama işlemi yapılır ve alınan örnekler bu parçalanan seviyelerden (kuantalama seviyesi) en yakın olanına yuvarlanır. Burada bir yuvarlama işlemi gerçekleştiğinden dolayı ortaya bir hata çıkmaktadır. Bu hata maalesef giderilemez ancak azaltılabilir. Bunun için kuantalama seviyelerinin birbirine yaklaştırılması (seviye sayısının arttırılması) gerekmektedir. Ancak hiçbir zaman bu hata sıfırlanamaz.
Kodlama adımında ise her bir kuantalama seviyesine bir kod atanarak sayısallaştırma işlemi tamamlanmaktadır. Aslında görsellerle daha detaylı anlatılabilecek bir konu, ancak amacımız MSP430 programlama olduğundan fazla detaya girmeye gerek yok. Belki istek olursa daha sonra ayrıca anlatabilirim. 🙂
Şimdi ADC modülünü nasıl kullanacağımızı öğrenmek için User’s Guide’ı inceleyelim. User’s Guide çok büyük bir belge ve nereye bakman gerektiğini bilmediğinde içinde kaybolabiliyorsun. Biz ADC ile ilgilendiğimizden hemen ADC10 bölümüne gidiyoruz ve bu modülün kaydedicilerini inceliyoruz. Kaydedicilerdeki hangi bitleri değiştirerek ayarları nasıl yapacağımızı ve modülü nasıl kontrol edeceğimizi öğreniyoruz. Örnek olarak Şekil 1’de verilen ADC10CTL0 kaydedicisine bakacak olursak.

Burada ADC10CTL0 kaydedicisinin bitlerinin hangi ayarlamaları gerçekleştirdiği güzelce açıklanmış. Bizi ilgilendiren ADC10SHTx, ADC10ON, ADC10IE, ENC ve ADC10SC bitleridir. Kısaca bu bitlerin görevlerinden bahsedecek olursak.
- ADC10SHTx: Örnekleme ve tutma süresi örnekleme işleminin clock işaretine göre nasıl gerçekleşeceğini belirtir. (Fazla detay bir konu olduğu için girmiyorum)
- ADC10ON: ADC modülünü aktif etmek için kullanılır.
- ADC10IE: ADC modülünden gelecek kesmeleri aktif hale getirmek için kullanılır.
- ENC: Dönüştürme işleminin aktif edilmesi için kullanılır.
- ADC10SC: Dönüştürme işleminin başlatılması için kullanılır.
Bu arada neden ADC10 isminin verildiğini merak etmiş olabilirsiniz. Bunun nedeni dönüşüm sonucunda her bir örneğin 10 bit ile temsil edilmesidir. Yani 5V analog işareti “03ffh” sayısına karşılık gelir.
Siz de User’s Guide’ı inceleyerek diğer kaydedicilerin görevlerini öğrenebilirsiniz. Her şeyi devletten beklemeyin birazda siz kendiniz öğrenmeye çalışın. 🙂 Şimdi biraz örnek bir program inceleyelim.
#include <msp430.h>
rseg CSTACK
rseg CODE
org 0f800h
reset mov #SFE(CSTACK),SP
mov #WDTPW+WDTHOLD,&WDTCTL
mov #ADC10SHT_2+ADC10ON+ADC10IE,&ADC10CTL0
mov #INCH_1, &ADC10CTL1
bis.b #02h,&ADC10AE0
bis.b #041h,&P1DIR
loop bis #ENC+ADC10SC,&ADC10CTL0
bis #CPUOFF+GIE,SR
jmp loop
ADC10_ISR
bic.b #041h,&P1OUT
cmp #01ffh,&ADC10MEM
jc yak
bis.b #040h,&P1OUT
jmp gec
yak bis.b #01h,&P1OUT
gec bic.w #CPUOFF,0(SP)
reti
common INTVEC
org ADC10_VECTOR
dw ADC10_ISR
org 0fffeh
dw reset
end
Programımızın ilk bölümünde 10. satıra kadar ayarlamaları gerçekleştiriyoruz. Burada ayarlamaları yaparken kütüphanede yapılan tanımlamalardan yararlanıyoruz. Örneğin 7. satırda ADC10CTL0 kaydedicisini ayarlarken “#ADC10SHT_2+ADC10ON+ADC10IE” yerine “#01018h” sayısını yazabilirdik. Ancak bu şekilde kütüphanedeki tanımlamaları kullanmak okunabilirlik açısından daha iyi olmaktadır.
12 ile 14. satırlar arasında yer alan ana program bölümünde ADC’ye dönüştürme işlemine başlamasını söyleyerek işlemcimizi uyutuyoruz. Evet “Status Register” ile işlemcinin çalışma modlarını ayarlayabildiğimizi söylemiştim. Burada bunun bir örneğini görmüş olduk. SR’de yer alan CPUOFF bitini “1” yaptığımızda işlemcimiz uyku moduna geçmektedir. Uyandırma işlemini ise bir kesme ile yapmamız gerekecektir. Örneğin bu uygulamada ADC kesmesi geldiğinde bazı işlemler yapıldıktan sonra 24. satırda işlemciyi uyandırıyoruz.
ADC’nin kesme programı olan “ADC10_ISR” etiketli programa bakacak olursak. Programda ilk olarak kırmızı ve yeşil LED söndürülmektedir. Daha sonra “ADC10MEM” kaydedicisi, yani analogdan dijitale dönüştürülmüş verinin saklandığı kaydedici, “01ffh” sayısı ile karşılaştırılarak karşılaştırma sonucuna göre işlemler yapılmaktadır. Neden “01ffh” sayısı ile karşılaştırdığımızı ve bu karşılaştırma sonucunda hangi işlemlerin yapıldığını size bırakıyorum. Bence bunu yorumlayabilecek seviyeye geldiniz. 🙂
Evet basit bir ADC uygulaması gerçekleştirmiş olduk. Bu arada şuan işlemcim yanımda olmadığından bu programı deneme fırsatım olmadı. İnşallah çalışıyordur. 🙂 Umarım faydalı bir yazı olmuştur efendim. İyi çalışmalar dilerim.
Öncelıkle paylasımlarınız ıcın tesekkur ederız. bu adc kod ornegınde tam olarak kod ne ıslem yapıyor onu soylermısınız rıca etsem
Merhabalar, kısaca özetleyecek olursam ADC’nin 1 numaralı kanalından ölçüm yapılıyor. ADC’nin 1 numaralı kanalının hangisi olduğunu işlemcinizin datasheet’inden bakabilirsiniz. Bu ölçüm değeri eğer 1ffh sayısından büyük ise yeşil LED’in bağlı olduğu pin HIGH seviyesine çekiliyor. Diğer kurumda kırmızı LED’in bağlı olduğu pin HIGH yapılıyor. Bu ölçüm ve kontrol işlemi sürekli olarak tekrarlanıyor.