Gömülü Sistemler
Mikrodenetleyicinin ADC Özelliğini Kullanarak Veri Okumak
Hayri KILIÇNisan 20215 dk okuma
GİRİŞ
Bu çalışmadaki amaç bir sensörden ya da bir komponentten -10mV ile 10mV arasında analog sinyal çıkışı almak ve bu sinyali gerekli opamp devresi kurarak yükseltmek, yükseltilen değeri bir mikrodenetleyicinin ADC özelliğini kullanarak okuyabilmektir. Çalışmada -10mV ile 10mV arasında sinyal üretmeyi dirençler kullanarak gerilim bölücü devresi ile elde ettim. Elde ettiğim değeri RC devresi ile filtreledim. Daha sonra ina122 opampı ile sinyali yükselterek mikrodenetleyicinin analog girişine verdim. Kullandığım Mikrodenetleyici Arduino UNO olduğu için harici bir ADC modülü kullanmadım. Çıkışı seri port ekranından okuyarak elde etmek istediğim verilere ulaşmış oldum.
ADC Nedir?
ADC adından da anlaşılabileceği üzere analog sinyali bizim dijital sistemimizin algılayabileceği dijital veri haline dönüştürür. Piyasa da çok çeşitli ADC entegreleri bulunmakla birlikte teknolojinin gelişmesiyle bu ADC ler artık mikroişlemcilerin içerisine girmişlerdir. Mikroişlemcilerde bulunan ADC ler genel olarak 10-12 bit çözünürlüktedirler. Daha fazla çözünürlüğe ihtiyacımız varsa harici olarak entegre şeklinde 16 ve 24 bit olan modellerini de üreticilerden bulabiliriz.
Bu çalışmada ADC özelliğini Arduino mikrodenetleyicisi üzerinden kullandım. Arduino üzerinde ADC işlemi için özelleşmiş pinler bulunur. Bu pinler ile alınan analog sinyal, 10 bitlik sayısal değere çevrilerek kullanılır. Bu değerleri seri port ekrana yazdırıp oradan okumak mümkündür. Çalışmamda bende bu port ekranından faydalandım. Neden ADC’ye ihtiyaç duyduğumuza gelirsek analog sinyaller devamlı sinyallerdir ve sonsuz çözünürlükte değerler alabilir, bu yüzden Arduino analog sinyalleri direkt olarak işleyemez. Bu sinyalleri kullanabileceğimiz bir duruma getirmek için mikrodenetleyicinin Analog Dijital Çevrim ismiyle adlandırılan ADC özelliğini kullanırız.



Şekil 1: Örnek Alma-Tutma

Şekil 2: Örnek Alma
Örnek olarak alınan voltaj değerinin seriport ekranında nasıl okuduğumuzu gösteren kod satırı aşağıdaki gibidir.
| void Loop () { | |
| okunan_deger = analogRead(sensordegeri); // sensorden gelen bilgi okundu değişkene kaydedildi | |
| Serial.print("okunan deger = "); // ekrana okunan değer kelimeleri yazıldı | |
| Serial.println(okunan_deger); // ekrana okunan değer adlı değişkenin değeri yazıldı | |
| Serial.print("Voltaj"); // ekrana volaj kelimesi yazıldı | |
| Serial.println((okunan_deger * 5) / 1023.0); // voltaj değer hesaplanıp ekrana yazıldı | |
| // dilerseniz voltaj = (okunan_deger * 5) / 1023.0 ; yapıp daha sonra ekrana voltaj isimli değişkenide basabilirsiniz. | |
| delay(250); // ms olarak istenildiği gibi ayarlanılabilir. | |
| } |
Op Amp Nedir?
Op Amp ismi İngilizcede İşlevsel Yükseltici anlamına gelen Operational Amplifier‘ın kısaltmasından türemiştir. Op Amp devreleri, isimlerinden de anlaşılacağı üzere elektronik devrelerin işlevselliklerini artırmak amacıyla kullanılan, sinyal yükseltme gücü çok yüksek olan entegre devrelerdir. DC (doğru akım) ile beslenirler, akım ve gerilim kazancı sağlarlar. Buna bağlı olarak da güç yükseltme ve empedans dönüştürme görevleri de yaparlar. İlk Op Amp’lar 1968 yılında Fairchild Semiconductor şirketi tarafından icat edilmiştir.

Şekil 3: Op Amp Sembolü
Genellikle Op Amp’larda iki giriş, bir çıkış ve iki tane de besleme ucu bulunmaktadır. (+) girişe evirmeyen (terslemeyen/non-inverting) uç, (-) giriş ucuna ise eviren (tersleyen/inverting) uç adı verilir. Bu uçlar çıkıştaki faz farkını etkiler. Eviren uca sinyal uygulandığında çıkıştan 180 derecelik faz farklı bir sinyal elde edilir. Evirmeyen uca sinyal uygulandığında ise girişteki sinyal ile çıkıştaki sinyal arasında faz farkı bulunmaz.
Ina122 Op Amp
Ina122 doğrusal düşük gürültülü diferansiyel sinyal alımı için hassas bir amplifikatördür. Çift işlemli op amp tasarımı yalnız kullanılmasına karşın mükemmel performans sağlar. Çok düşük ve durgun bir akıma sahip olup, taşınabilir enstrümantasyon ve veri toplama sistemleri için idealdir. Ayrıca ikili kaynaklarla da çalıştırılabilir. Tarafından bir giriş seviyesi kaydırma ağı kullanan, ortak giriş modu aralığı, negatif değerin altında 0.1V’a kadar uzanır. Paket seçenekleri arasında 8 pimli plastik DIP ve SO-8 bulunur. Ben projemde INA122P, INA122 SP Amp INSTR Amp Single DIP-8 paketinden kullandım.

Şekil 4: INA122P, INA122 SP Amp

Şekil 5: Örnek INA122P Amplifikatör Datasheet’i
Burada Ref terminaline uygulanan voltaj, çıkış sinyaline eklenir. İyi ortak mod reddini korumak için çalışmamda Ref terminalinde düşük empedans sağlamak için bir op amp tamponu kullandım.

Şekil 6: INA122 RG Direnci
INA122’nin kazancı, şekil 4’de gösterildiği gibi tek bir harici direnç (RG) bağlanarak ayarlanır;
Formül :

Formülde bahsedilen RG direncinin kararlılığı, toleransı ve sıcaklık faktörü elde etmek istediğimiz kazancın üzerinden etkilidir.
ARDUİNO ile ADC Uygulaması
Analogdan Dijitale Dönüştürücü (ADC), bir pin üzerindeki analog voltajı dijital bir sayıya dönüştüren çok kullanışlı bir özelliktir. Projemde bu özelliği Arduino üzerinde gösterdim.

Şekil 7: Arduino Analog Pinler
Arduinoda her pinin analogdan dijitale dönüştürme yapma yeteneği yoktur. Arduino kartında, bu pinlerin analog voltajları okuyabildiğini belirtmek için etiketlerinin önünde (A0 ila A5) bir ‘A’ bulunur.
ADC’ler mikrodenetleyici arasında büyük farklılıklar gösterebilir. Arduino’daki ADC, 10 bitlik bir ADC’dir, yani 1.024 (2 ^ 10) ayrık analog seviyeyi algılama yeteneğine sahiptir.
ADC Değerinin Voltajla İlişkilendirilmesi
ADC, oranlı bir değer bildirir . Bu, ADC’nin 5V’nin 1023 olduğunu varsaydığı ve 5V’den küçük herhangi bir şeyin 5V ile 1023 arasında bir oran olacağı anlamına gelir.

Devre Tasarımı
Çalışmamda devre tasarımını Şekil 5’de gösterildiği gibi proteus üzerinden yaptım. Çıkışı virtual terminal üzerinden gördüm. Kendimde bilgisayar ekranında seri port üzerinden gördüm.

Şekil 8: Devre Tasarımı
Arduino Kodları
#define loadcell A5
int duty_suresi=100;
void setup()
{
Serial.begin(9600);
pinMode(9,OUTPUT);
}
void loop()
{
analogWrite(9, HIGH);
delayMicroseconds(duty_suresi); // Yaklşık olarak 10% duty cycle @ 1KHz
analogWrite(9, LOW);
delayMicroseconds(1000-duty_suresi);
int sensorValue = analogRead(loadcell);
Serial.println(sensorValue);
delay(500);
}
Seri Port Ekranı Üzerinde Alınan Verileri Okumak

**
Şekil 9:** Seri Port Ekranında ADC Verileri
Ortalama 120 okuduğumuzu düşünürsek 120*5/1023 = 0,58651 V elde etmiş olduk.
Devrenin BreadBoard Üzerinde Kurulumunun Gerçekleştirilmesi

Şekil 10: BreadBoard Kurulumu Önden Görünüm

Şekil 11: Breadboard Kurulumu Üstten Görünüm
Kaynakça
-
Ege University, http://tec.ege.edu.tr/dersler/2014_B5_ADC.pdf , İzmir Turkey, Jun 2014
-
Peter Beshay Benton H. CalhounJoseph F. Ryan , A Digital Auto-Zeroing Circuit to Reduce Offset in Sub-Threshold Sense Amplifiers, International, Jun 2013
-
ST. Life.auqment Company, https://www.st.com/en/amplifiers-and-comparators/low-offset-voltage-op-amps-lt1-mv.html, USA, 2016
-
Analog Devices INC (ADI) Company, https://www.analog.com/en/education/education-library/tutorials.html, USA, 2014
-
Sparkfun Virual Company, https://learn.sparkfun.com/tutorials/analog-to-digital-conversion/all, Dry Creek Parkway, Niwot, Colorado, 2009