top of page

Atmega 328'de ADC

Gömül sistemlerde bazı konular gerçekten can sıkıcı olabiliyor.Şu yazıyı yazbilemk için ne kadar acı çektiğimi bilemezsiniz. :) Bir konu üzerinde günlerce çalışırsınız ve ter dökdüğünüz saatlerin karşılığını eninde sonunda alırsınız. Bu yazı ATmega328'de ADC birimini ele almaktır.


ADC birimleri fiziksel büyüklüklerden örnekler alarak verileri dijital ortama aktarırlar. Bu sayede fiziksel nicelikler dijital ortamlarda anlamlı hale gelirler. Kullandığımız mikrodnetleyicide 10 bitlik bir ADC birimi mevcuttur. Bu birim iki farklı modda çalıştırılabilmektedir. ADC konusunu bir kaç yazı içerisinde inceleyeceğiz. Bu yazıda ADC'ye ve yazaçlarına göz atıp,ufak bir ön bilgilendirme yapacağız. Diğer yazılarda ise ADC'nin nasıl doğru şekilde yapılandırılacağını ve ölçüm modlarından bahsedeceğiz.


FreeRunning

En basit kullanılabilen ölçüm modudur. ADC'yi bir kere başlatırsınız ve sadece ölçüm sonuçlarını okursunuz. Tek kanalldan ölçüm yaparken sıkıntı olmasa da çok kanaldan ölçüm yaparken bu basitlik yerini zor bir kontrol yöntemine bırakmaktadır. O yüzden bana göre pek kullanışlı değil.


Single Conversation

Benim kullanmayı tercih ettiğim, daha basit bir kontrol yapısıyla yöntebileceğiniz bir moddur. Bu modda ADC ölçümü her bittiğinde ölçümü tekrar başlatırız. Özellikle çoklu kanal ölçümlerinde programcının işini epey kolaylaştırmaktadır.


Ölçüm Çözünürlüğü

ATmega328 içerisinde 10 bit çözünürlükte ölçüm yapabilen bir ADC bulunmakatadır. Duruma göre programcı bu ADC ile 8 bitlik çözünürlükte sonuçlarda alabilir.


Ölçüm Yaparken Dikkat Edilecek Hususlar

ADC birimleri elektriksel gürültülere çok duyarlıdırlar. Bu yüzden devre tasarımı yaparken veri kitapçıklarındaki önerilere uyulması biz amatör tasarımcılar için büyük önem arz etmektedir. Bağlanacak referans gerilim kaynakları temiz olmalıdır. Ayrıca ADC'nin girişlerini boşta bırakmak ADC'nin hem çevresel etkilere mağruz kalmasını hem de kendi oluşturduğu geri tepme (kick back)akımlarından ötürü ölçüm sonuçlarını mahvedebilir. En basitinden girişlere paralel 100nF bir kondanstör atmak bile ADC'nin kanal geçişleri arasında sapıtmasını engeller. Gerektiği taktirde girişlere RC veya LC alçak geçiren filtreler eklenebilir.Donanımsal korumalar bir yere kadar etkili olacağından yazılımsal filtreler aracılığıyla daha doğru ölçüm sonuçları elde edilebilirler.ADC yazaçlarını tanıtarak işe başlayalım.



ADCSRA



ADEN:ADC birimimizi açıp kapattığımız bittir. Gerekli yazaçların ayarları yapıldıktan sonra açabiliriz. FreeRunning modunda ölçüm yaparken kanal değiştirmek için ADC'yi kapatıp açabiliriz. Eğer ADC'yi mevcut ölçüm sırasında kapatırsanız,ADC'yi tekrar açtığınızda ölçüm yapamıyor. ADC'yi kapatmadan önce ADC'nin ölçümünü bitirmesini bekleyin.


ADSC:Ölçümü başlatmak için bu bite mantık 1 değerini yazmamız gerekir. Bu bit FreeRunning Modunda ölçüm esnasında mantık 1 değerini alır.Ölçüm bitinde mantık 0 değerini alır. Ölçümün bittiğini anlamak için aşağıdaki komut kullanılabilir.

while((ADCSRA&ADSC));

Bu satır ölçüm bitene kadar işlemciyi bloklayacaktır. Single Conversation modunda ölçümün bittiğini bu bit ile anlayamazsınız.


ADATE:Bu bite mantık 1 yazarsanız ADC birimi otomatik tetikleme ile çalışacaktır. Otomatik tetikleme kaynakları ADCSRB yazacından seçilirler.


ADIF:Bu bit mantık 1 olduğunda ADC ölçümü bitmiş ve ölçüm sonuçlarını okuduğumuz ADCL ve ADCH yazaçları güncellenmiştir. Her iki ADC modundada ölçümün bittiği bu bayraktan anlaşılabilir.


ADIE:ADC'nin ölçüm tamamlandığında kesme üretmesini istiyorsak bu bite mantık 1 yazarız.


ADPSn: ADCSRA yazacının ilk üç biti ADC'nin çalşıma hızını belirleyen bitlerdir. Bu bitlere yazdığımız değerler ADC birimimizin ne kadar hızlı örnek alacağını belirler.

ADCSRB


ACME:Analog Karşılaştırıcı etkinleştirme biti.Bu bite mantık 1 yazılırsa ADCSRA yazacındaki ADEN biti kapatılır ve analog karşılaştırıcı açılır.ACME bitine mantık 0 yazıldığı taktirde analog karşılaştırıcının ucuna AIN1 girişi uygulanır. Mantık 1 yazıldığında ise karşılaştırıcının negatif ucuna seçilen ADC kanalları bağlanır.


ADTSn: Bu üç bit ADCSRA altındaki ADATE biti etkinleştirildiğinde kullanılabilir. ADC'nin tetikleme kaynakları bu bitler yardımıyla ayarlanır.

Görüldüğü gibi ADC'yi birçok şekilde tetikleyebiliyoruz. Bu bölüme ilerleyen yazılarda daha detaylı inmeyi düşünüyorum.


ADMUX


REFSn:ADC birimleri örnekleme yapabilmek için belirli bir gerilim seviyesini baz alırlar. Buna referans voltajı denir. Eğer referans voltajınız 2,5V ise ADC'niz 0 ie 2,5 V arasındaki gerilimleri ölçebilir. Atmega328'de 10 bitlik ADC olduğuna göre ADC girişindeki gerilimi 0 ile 1023 arasında paylaştırır. REFS1 ve REFS0 bitleri bu referans geriliminin nereden alınacağını belirler.


Örnek vermek gerekirse Arduino,Xplanid Mini gibi geliştirme kartlarında ATmega328'in AREF girişi 100nF'lık bir kondansatör ile toprağa bağlıdır. Bu durumda REFS0 bitine mantık 1 değeri yüklenmelidir. AREF pinine bağlanacak gerilim kaynakları ölçüm sonucunun doğruluğu açısından önemlidir. Buraya girdiğiniz gerilimin temiz olması gerekmektedir. AREF pinine dışarıdan gerilim referansı bağlanacaksa REFS0 ve REFS1 bitleri mantık 0 seviyesinde tutulmalıdır.Özellikle bu pinin doğrudan anahtarlamalı bir güç kaynağının çıkışına bağlamak ölçüm sonuçlarınızda hataya neden olabilir. Bu kısmı belki daha sonra devre tasarımı yaparsak tekrar ele alırız. Görüldüğü üzere ADC birimimizin dahili bir referans gerilim kaynağı da var. Özellikle bu kaynak mikrodenetleyicinin içerisindeki sıcaklık sensörünün referans kaynağı olarak kullanılabilir.


ADLAR:ADCH ve ADCL yazaçlarında ölçüm sonuçları sağa veya sola dayalı olarak saklanabilir. ADLAR biti mantık 1 seviyesine yükseltilirse ADC birimi ölçümlerini sola dayalı olarak gerçekleştirir. Ayrıntılı bilgi için ATmega328'in ADMUX yazacıyla ilgili bölümüne bakabilirsiniz.


MUXn:Mux bitleri ADC'nin kanal seçimini yapmaya yarayan bitlerdir.


Tabloda da görüldüğü gibi MUX bitlerine farklı değerler yükleyerek ADC kanalları arasında geçiş yapabiliriz.


DIDR0

ADC pinleri hem analog hem de dijital giriş olarak kullanılabilir. Eğer güç tasarrufunun çok önemli olduğu bir uygulama ile çalışıyorsanız ilgili bite mantık 1 yazarak dijital giriş önbelleğini temizlemiş olursunuz. Mantık 1 yazılan bitler PIN yazaçlarından mantık 0 olarak okunurlar.




ADCH ve ADCL

Ölçüm sonuçlarımızı bu iki yazaç içerisinden okuruz. Şuan dört farklı tabloyu çizmek zor geldiğinden bu işi size bırakıyorum. :) ATmega328'in veri kitapçığından ilgili yazaçların nasıl kayıt yaptıklarını inceleyin. ADCSRA yazacındaki ADLAR biti mantık 1 seviyesinde ise ADCH ve ADCL yazaçları ölçüm sonuçlarını sola dayalı kayıt ederken, mantık 0 seviyesinde ise sonuçlar sağa dayalı olarak kayıt edilir.


Anlatacak çok şey olsa da bu yazıyı şimdilik noktalıyorum. İlerleyen zamanlarda ADC ile ilgili daha farklı edindiğim verileri sizler ile paylaşmaya çalışacağım. Dahada uzatmayalım yazıyı, yoruldum. :)

Comments


YouTube Profile Image.png

Muhammed Selim ERKÜHÜK

Ege meslek Yüksekokulundan 2020 yılında mezun oldum. Elektronik, fizik ve matematiğe bayılan bir Elektronik Teknikeriyim. :)

  • Facebook
  • Twitter
  • LinkedIn
  • Instagram

Gelecek Çok Yakın!

Değişim çok hızlı gerçekleşiyor! Ayal uydurmak çok zor olsa da tüm beynimi teknolojiye adamış durumdayım. :)

Abone Ol

Thanks for submitting!

bottom of page