2.7- MicroPython ile ADC ve DAC Uygulamaları

Daha öncesinde mikrodenetleyicilerin dijital ile analog dünya arasında bir köprü olduğundan bahsetmiştik. Bu köprü görevini girişte analog-dijital dönüştürücü (ADC) çıkışta ise DAC sağlamaktadır. ESP32 mikrodenetleyicisinde iki adet 12-bit SAR ADC bulunup uygulamalarımızda nispeten yeterli bir çözünürlüğü sağlamaktadır. ADC’nin çalışma mantığını kısaca anlatmak gerekirse ideal ADC, bir kanala uygulanan gerilimi negatif referans ve pozitif referans gerilimleri arasında çözünürlüğüne göre bölümlendirip bize sayısal karşılığını vermektedir. Örneğin 10-bit ADC bize 0 ile 1023 arası sayısal değer vermektedir. Bu ADC’nin referans gerilimi 5 volt olsun, negatif referansı ise 0V (GND) olsun diyelim. Biz ADC’nin kanalına (mikrodenetleyicide karşılık gelen ayağa) 2.5V uyguladığımızda bize 512 sonucunu verecektir. Çözünürlüğü ve referans değerleri bildiğimize göre bunun kaç volta karşılık geldiğini hesaplamamız gayet kolay olur.

ADC’ler dijital elektroniğin uygulanmaya başlandığı yıllardan itibaren kullanılmakta ve geliştirilmektedir. [5]

ESP32’de iki ADC bloku bulunmaktadır. 1. blok GPIO32–39 arasında faaliyet gösterirken 2. blok ise 0, 2, 4, 12–15, 25–27 arasında faaliyet göstermektedir. Dahili ADC referans gerilimi 1.1V civarında olup referans gerilimine yakın okumalarda doğrusallık düşmektedir. Ayrıca 100mV civarının altındaki gerilimler sıfır olarak ölçülmekte ve belli aralıkta gerilimleri okumak için zayıflatma uygulamak gereklidir. ADC’ye uygulanacak zayıflatmalar ve yaklaşık doğrusal ölçümler şu şekildedir.

· ADC.ATTN_0B : Zayıflatma yok (100mV-950mV)
· ADC.ATTN_2_5DB : 2.5 dB zayıflatma (100mV — 1250mV)
· ADC.ATTN_6DB : 6dB zayıflatma (150mV — 1750mV)
· ADC.ATTN_11DB : 11dB zayıflatma (150mV — 2450mV)

Görüldüğü gibi ESP32’nin ADC birimi bir mikrodenetleyiciden beklenen değer aralığında (şase ve besleme gerilimi) ADC ölçümü yapamamaktadır. Bu kısıtlamayı göz önünde bulundurmalı ve gerilim değerine dönüştürmede daha iyi hesaplama için read_uv() metodunu kullanmalıyız.

ADC ayaklarına 3.6 volttan yukarısını asla uygulamamak gereklidir. Batarya gerilimi gibi yüksek gerilimleri ölçmek için gerilim bölücü direnç kullanılmalıdır.

ADC’nin çözünürlüğünü 9–12 bit arasında ayarlamamız mümkündür ve varsayılan olarak 12 bite ayarlıdır. Algılayıcı uygulamalarında yüksek çözünürlüğe ihtiyaç duyulduğundan bunu değiştirmemize gerek kalmayacaktır.

Şimdi analog uygulamalar için devremizi kuralım. Daha önceki karaşimşek devresini bozmadan sadece bir adet trimpot ya da potansiyometre eklememiz yeterlidir.

Programı çalıştırdığınızda bir taraftan da potansiyometreyi çevirin ve değişen değerleri ekrandan takip edin.

Okuma : 1473

16-bit aralikta : 23717

Gerilim okuma (uV): 1353000

Burada read() metodu ile okuduğumuz değer 0–4095 arası değerdir. read_u16() metodu ise 0–4095 arasındaki değeri 0–65535 arasına yaymaktadır. read_uv() metodu ise bize okunan gerilim değerini mikrovolt olarak vermektedir.

Şimdi bir sonraki uygulama için okuduğumuz analog değer üzerinde işlem yapalım. map() fonksiyonu analog verileri değerlendirmek için en sık kullanılan fonksiyonlardan biridir. Bu fonksiyon bir sayısal değer aralığını alıp başka bir sayısal değer aralığına çevirmektedir. Örneğin 0–4095 arasında okuyacağımız değerin 0–10 arasında gösterilmesini istiyorsak şöyle bir program yazmalıyız.

Programın çıktısı şu şekilde olacaktır.

Okuma : 3565
Map 8
Okuma : 3051
Map 7
Okuma : 2786
Map 6

Map fonksiyonu normalde float değer döndürmektedir. Biz bunu tam sayı olarak değerlendirmek istediğimizde int() fonksiyonu ile tam sayı değere çevirmemiz gerekir.

Şimdi daha önce kurduğumuz karaşimşek devresini bargraf gösterge olarak kullanalım. Bargraf göstergeler uzun zamandır batarya durumu, depo doluluk oranı gibi pek çok uygulamada basit ve etkili bir görsellik sunmaktadır. Biz burada 0–3.3V arasını 8 adet LED ile bar şeklinde göstermeye çalışacağız.

Programı çalıştırdıktan sonra potansiyometreyi iki yönde de çevirin ve göstergedeki değişimleri gözleyin. LED’ler arasında bazı durumlarda yanıp sönmeyi gözlemleyebilirsiniz. ADC okumalarında yaşanan gürültü buna benzer sonuçlar ortaya çıkarabilir. Bir sonraki uygulamada basit bir filtre uygulaması yapacağız.

Bu uygulamada her bir ölçümde toplam 100 adet okuma yapılmakta ve bu okumanın ortalaması alınmaktadır. Uygulamada artık LED’lerin daha az titrediğini gözlemleyebilirsiniz. Bunun dışında ADC okumalarında donanımsal olarak pek çok gürültü engelleme yöntemi kullanılmaktadır. En basit olarak düğme arkını engellemekte de kullandığımız alçak geçirgen filtreyi kullanabilirsiniz. Resimde gördüğünüz örnek devre basit uygulamalar için yeterli olacaktır.

Şimdi bir batarya gerilimini okumak isteyelim. Elimizdeki cihazı besleyen 12 voltluk bir akü olsun ve bunun doluluk oranını da kullanıcıya gösterelim. Öncelikle elimizdeki 12 voltluk kurşun asit bataryanın tam şarjda doluluk oranının 12 voltun üzerine çıkabileceğini unutmayalım. Bu durumda ihtiyat miktarı olarak 2 volt bırakalım. 14 voltluk gerilimin bizim ölçebileceğimiz en yüksek gerilim olmasını istediğimizden bunu 3.3 volta çevirmemiz gereklidir. Sonrasında batarya azaldıkça okunan gerilimde de azalma olacaktır. Bunun için analog girişe gerilim bölücü direnç ilave etmemiz gereklidir. Buna en yakın değerlerde olan sabit dirençlerin 3.9K ve 1.2K direnç olduğunu görüyoruz. Bu hesaplamayı aşağıdaki uygulamadan yapabilirsiniz.

https://www.allaboutcircuits.com/tools/voltage-divider-calculator/

Belli başlı değerlerdeki dirençler üretildiğinden sabit direnç kullanacağımız zaman erişebileceğimiz değerlerdeki dirençler arasından seçim yapmamız gereklidir. Eğer hassas direnç değerleri elde etmek istiyorsak bunun için çok turlu trimpot gibi elemanları kullanmalıyız. Sabit dirençleri kullanmak bazen avantajlı olabilmektedir örneğin uygulamada trimpotlar kayma sorunu yaşatabilmektedir.

Batarya okurken bataryanın tam anlamıyla bittiğini ve şarj gerektiğini belli bir gerilim seviyesinin altına düştükten sonra belirlememiz gereklidir. Uygulamada 9 volt en düşük seviyeyken 12 volt ve üstü tam dolu demektir.

ESP32’nin analog yönüyle ön plana çıkan bir mikrodenetleyici olmadığını hatırlatalım. Eğer hassas ve doğru analog ölçümlere ihtiyacınız varsa uygulamada başka bir mikrodenetleyiciden yardım alabilirsiniz. Analog ürünleri ile ön plana çıkan yarı iletken üreticilerinin SPI ya da I2C protokolü ile kolayca programlanabilen hassas ADC modülleri de mevcuttur. Hassas algılayıcı okumalarında harici bir analog modül kullanmak en doğru seçimlerden biri olacaktır. Kitabın ilerleyen bölümlerinde kullanacağımız ADS1115 ADC modülü bu yönde ihtiyacımızı büyük ölçüde karşılayacaktır.

DAC Uygulamaları

ESP32’de DAC çıkışlarını GPIO25 ve GPIO26 ayaklarından alırız. Analog çıkışı gözlemlemek için bir osiloskopa sahip olmanız iyi olsa da multimetre ile de kısıtlı da olsa bir ölçüm yapma imkânınız vardır. Şimdi DAC’lardan sabit gerilim çıkışı elde edip bunu multimetre ile ölçelim.

Daha öncesinde map() fonksiyonunu analog ham değeri gerilim değerine çevirmek için kullanabileceğimiz gibi gerilim değerini DAC ham değerine çevirmek için de kullanabiliriz. Ölçüm yaptığımızda 25 numaralı ayaktan 1.0 Volt civarı, 26 numaralık ayaktan ise 1.5 Volt civarı okuma yapılmaktadır. DAC birimlerinde ADC’lerde olduğu gibi doğrusallık hatalarının gözlemlenebileceğini unutmamak gerekir. Eğer yüksek çözünürlüklü bir DAC kullanma ihtiyacı doğarsa yine harici modül alıp kullanmak daha uygun bir çözüm olacaktır.

Şimdi DAC ile biraz sinyal üretelim ve bunu osiloskopta gözlemleyelim. İlk üreteceğimiz sinyal testere dişi sinyal olacak. Bunun için DAC birimini 0’dan 255’e kadar saydırıp sonrasında sıfırlamak ve tekrar baştan saydırmak gereklidir.

Programı çalıştırdıktan sonra osiloskopun probunu GPIO25’e bağlayalım. Testere dişi sinyal düzgün bir şekilde gözlemlenmektedir.

Sinyalin periyodunu ölçtüğümüzde 5ms olduğunu görmekteyiz. Bu da 200Hz’lik bir sinyal aldığımızı göstermektedir. Şimdi üçgen dalga üretmeyi deneyelim.

Programı çalıştırdığımızda osiloskopta sinyalin görüntüsü şu şekilde olacaktır.

Sinüs sinyal üretmek içinse önce biraz hesaplama yapmamız gereklidir. Sinüs sinyal üretirken hesaplamayı daha önceden yapıp bir tampona kaydetmek sinyal üretirken gecikmelerin önüne geçecektir. Gömülü sistemlerde LUT (Look-up table) adı verilen bu yöntem performansın önemli olduğu yerlerde hafızadan taviz verilerek kullanılmaktadır.

Programı çalıştırdığımızda osiloskopta sinüs sinyali gözlemleyebiliriz.

Burada 100 elemanlı bir dizi oluşturduğumuz için çözünürlük 8-bit olmayacaktır. bytearray nesnesinin eleman sayısını düşürdükçe çözünürlük düşecek ama elde ettiğimiz sinyalin frekansı artacaktır. ESP32’de DAC birimi kendi başına frekans üretememektedir. Bu yüzden elde ettiğimiz frekans kısıtlı olacaktır. Çözünürlük düştükçe aynı görüntüde pikselleşme olması gibi merdivene benzer bir görüntü ortaya çıkmaktadır. DAC çıkışını filtrelemek için elektronikte çeşitli yöntemler kullanılmaktadır.

--

--