ESP32 ADC Kullanımı

ESP32 ADC Kullanımı esp32 adc,esp32 adc resolution,esp32 adc pins,esp32 adc sample rate,esp32 adc accuracy

Nesnelerin İnterneti (IoT) projelerinde, akıllı tarım uygulamalarında veya endüstriyel otomasyon sistemlerinde çevremizdeki fiziksel dünyayı mikrodenetleyicilerle anlamlandırabilmek için analog büyüklükleri (sıcaklık, ışık, basınç, voltaj vb.) dijital verilere dönüştürmemiz gerekir. ESP32 Analogtan Dijitale Çevirici (ADC – Analog to Digital Converter) birimi; harici sensörlerden veya potansiyometrelerden gelen değişken voltaj sinyallerini yüksek çözünürlüklü dijital değerlere dönüştüren güçlü bir donanımdır. Bu rehberimizde, ESP32’nin dahili 12-bit SAR ADC mimarisini, giriş zayıflatma (attenuation) ayarlarını, doğrusal olmama (non-linearity) karakteristiğini, Wi-Fi ile ADC2 çatışmasını ve kararlı analog ölçümler yapabilmek için yazılımsal aşırı örnekleme (oversampling) filtreleme tekniklerini derinlemesine inceleyeceğiz.

ESP32 Analog Giriş Okuma Kapak Görseli

Arduino Core kütüphanesi kullanan ESP32 projelerinde, analog verileri okumak için ilgili GPIO numarasını parametre olarak alan dahili analogRead(GPIO) fonksiyonu kullanılır. Bu fonksiyon, pindeki anlık voltaj değerine karşılık gelen dijital bir sayı üretir.

ESP32 ADC Mimarisi ve Çalışma Prensibi

ESP32 entegresi bünyesinde iki adet bağımsız 12-bit SAR (Successive Approximation Register – Ardışık Yaklaşımlı Kaydedici) ADC modülü bulundurur. Bu modüller toplamda 18 kanala kadar analog sinyal okuma kapasitesine sahiptir. SAR ADC teknolojisi, analog giriş voltajını dahili bir referans voltajıyla karşılaştırmak için ikili arama (binary search) algoritmasına benzer bir çalışma yöntemi kullanır. Dahili DAC (Dijitalden Analoga Çevirici) ve karşılaştırıcı (comparator) yardımıyla pindeki voltaj seviyesi adım adım yaklaşılarak 12 çevrimde tamamen çözümlenir.

12-bit çözünürlük sayesinde, analog bir girişten okunan voltaj değeri 2^{12} = 4096 farklı seviyede dijitalleştirilir. Varsayılan zayıflatma (11\text{ dB}) ayarında, pindeki 0\text{ V} ile 3.3\text{ V} arasındaki voltaj aralığı şu şekilde eşlenir:

    \[V_{in} = \frac{\text{ADC\_Degeri}}{4095} \times V_{maks}\]

Burada V_{maks}, uygulanan zayıflatma miktarına bağlı olan maksimum ölçüm sınırıdır. Okunan dijital değer 0 ise pinde tam 0\text{ V}, 4095 ise maksimum ölçüm limiti olan voltaj seviyesi (örn. 3.3\text{ V}) mevcut demektir.

0V ile 3.3V Arası ADC Eşleme Şeması

ESP32 ADC Doğrusal Olmama (Non-Linearity) Problemi

Teorik olarak bir ADC biriminden doğrusal (linear) bir tepki eğrisi beklenir; yani giriş voltajındaki her doğrusal artışın, dijital çıkışta da aynı oranda artışa yol açması gerekir. Ancak ESP32 SoC üzerindeki SAR ADC donanımı tam olarak doğrusal çalışmaz. Eğrinin alt (0\text{ V} - 0.1\text{ V}) ve üst (3.1\text{ V} - 3.3\text{ V}) limitlerinde “ölü bölgeler” (dead zones) mevcuttur. Bu durumun grafiği aşağıdaki gibidir:

ESP32 ADC Doğrusal Olmama Grafiği

Bu konudaki donanımsal kısıtlamaları ve geliştiricilerin paylaştığı çözüm önerilerini detaylıca incelemek isterseniz ESP32 ADC Linearity Issue on GitHub başlığı altındaki tartışmalara göz atabilirsiniz.

Mühendislik Çözümleri: ESP32 ADC’nin bu karakteristik yapısından dolayı, 3.2\text{ V} ile 3.3\text{ V} arasındaki fark algılanamaz ve her iki değer için de 4095 çıkışı üretilir. Benzer şekilde, 0\text{ V} ile 0.1\text{ V} arasında da hep 0 değeri okunur. Yüksek hassasiyet gerektiren endüstriyel sensör projelerinde bu sorunu aşmak amacıyla şu yöntemler uygulanır:

  • Dahili kalibrasyon eFuse değerlerini (fabrikada yazılan V_{ref}) kullanan esp_adc_cal kütüphanesi ile yazılımsal düzeltme tablosu (look-up table) uygulamak.
  • Dış dünyadaki voltaj sınırlarını donanımsal gerilim bölücüler veya op-amp sinyal koşullandırıcılar yardımıyla ADC’nin doğrusal olduğu 0.2\text{ V} - 3.0\text{ V} aralığına sıkıştırmak.
  • Çok yüksek hassasiyet durumunda I2C veri yolu üzerinden çalışan harici bir ADS1115 (16-bit) gibi yüksek çözünürlüklü delta-sigma ADC entegresi kullanmak.

analogRead() Fonksiyonu ve Donanım Kanalları

Arduino IDE ortamında analog girişleri okumak son derece basittir. Sadece ilgili GPIO numarasını argüman olarak iletmeniz yeterlidir:

analogRead(GPIO);

ESP32 çipinde yer alan ADC modülleri ikiye ayrılır:

  • ADC1 (8 Kanal): GPIO 32, GPIO 33, GPIO 34, GPIO 35, GPIO 36, GPIO 37, GPIO 38 ve GPIO 39 pinlerine bağlıdır.
  • ADC2 (10 Kanal): GPIO 0, GPIO 2, GPIO 4, GPIO 12, GPIO 13, GPIO 14, GPIO 15, GPIO 25, GPIO 26 ve GPIO 27 pinlerine bağlıdır.

ESP32 DOIT Devkit V1 (30 pinli popüler versiyon) üzerinde bu kanallardan yalnızca 15 adedi dışarıya taşınmıştır. Aşağıdaki pin diyagramında analog giriş olarak kullanılabilen pinler kırmızı çerçeveler ile işaretlenmiştir:

ESP32 DOIT Devkit V1 Pinout Haritası

ESP32’nin tüm genel amaçlı giriş/çıkış kısıtlamalarını ve bootstrapping pinlerini detaylıca öğrenmek için kapsamlı hazırladığımız ESP32 Pin Referansı Giriş ve Çıkış Pinleri kılavuzumuzu ziyaret edebilirsiniz.

KRİTİK DONANIM UYARISI (Wi-Fi ve ADC2 Çatışması): ESP32 entegresinde yer alan dahili Wi-Fi sürücüsü, kablosuz sinyal genliklerini ölçmek ve RF katını kalibre etmek için ADC2 modülünü kendi iç kaynaklarıyla ortak kullanır. Bu nedenle, ESP32 üzerinde Wi-Fi aktif olarak çalışırken (bağlantı kurulduğunda veya veri transferi esnasında) ADC2 pinlerinden analog okuma yapılamaz. Eğer Wi-Fi kullanan bir projede analog sensör okumak zorundaysanız mutlaka ADC1 (GPIO 32-39) pinlerini tercih etmelisiniz; aksi takdirde okumalarınız kilitlenecek ya da gürültülü anlamsız değerler dönecektir.

Gelişmiş ADC Kontrol ve Konfigürasyon Fonksiyonları

ESP32 SDK’sı ve Arduino Core, analog çeviriciyi projenizin ihtiyaçlarına göre şekillendirebileceğiniz gelişmiş donanımsal fonksiyonlar sunar:

  • analogReadResolution(cozunurluk): ADC okuma çözünürlüğünü bit cinsinden belirler. 9 (0 – 511) ile 12 bit (0 – 4095) arasında ayarlanabilir. Varsayılan değer 12-bit’tir.
  • analogSetWidth(genislik): Donanım düzeyinde örnekleme genişliğini belirler. analogReadResolution ile aynı mantıkta çalışır.
  • analogSetCycles(dongu): Çevrim başına donanımsal örnekleme döngü sayısını ayarlar. Varsayılan 8’dir. 1 ile 255 arasında bir değere ayarlanarak gürültü karakteristiği optimize edilebilir.
  • analogSetSamples(ornek_sayisi): ADC donanımında tek bir okuma esnasında arka planda yapılacak örnekleme adetini belirler. Hassasiyeti artırmada etkilidir.
  • analogSetClockDiv(bolucu): ADC donanım saat frekansı bölücüsünü ayarlar. Varsayılan 1’dir. Örnekleme hızını sınırlayarak empedans uyumsuzluğu gürültülerini engeller.
  • analogSetAttenuation(zayiflatma): Tüm ADC giriş kanalları için zayıflatma (voltaj bölücü) kademesini ayarlar. ESP32’nin dahili ADC çekirdeği aslında en fazla yaklaşık 1.1\text{ V} bandında çalışabilir. Zayıflatma ayarı, bu voltajı düşürmek için dahili direnç ağlarını devreye sokar:
    • ADC_0db: Zayıflatma uygulamaz. Giriş gerilimi en fazla 800\text{ mV} (yaklaşık 1.1\text{ V} limit) olabilir.
    • ADC_2_5db: Giriş sinyali zayıflatılarak maksimum limit yaklaşık 1.5\text{ V} seviyesine taşınır.
    • ADC_6db: Giriş sinyali zayıflatılarak maksimum limit yaklaşık 2.2\text{ V} seviyesine taşınır.
    • ADC_11db: Giriş sinyali zayıflatılarak maksimum limit yaklaşık 3.9\text{ V} (pratikte VDD voltajı olan 3.3\text{ V} ile sınırlıdır) seviyesine taşınır.
  • analogSetPinAttenuation(pin, zayiflatma): Genel ayar yerine sadece parametre olarak belirtilen spesifik bir pinin zayıflatma kademesini konfigüre eder.

Uygulama Projesi: Potansiyometre ile Analog Okuma ve Yazılımsal Filtreleme

Bu uygulamamızda, bir potansiyometrenin orta bacağını ESP32’nin ADC1 kanallarından biri olan GPIO 34 pinine bağlayarak analog değer okuyacağız. Ayrıca, ESP32’nin RF gürültülerinden ve elektriksel dalgalanmalardan etkilenen analog okumalarını stabilize etmek amacıyla, ardışık 16 örnek alarak bunları ortalamaya sokan güçlü bir aşırı örnekleme (oversampling / moving average) filtresi uygulayacağız.

Gerekli Malzemeler

  • ESP32 Geliştirme Kartı (ESP32 DOIT DEVKIT V1 veya uyumlu bir model)
  • 10\text{ k}\Omega Lineer Potansiyometre
  • Breadboard (devre tahtası)
  • Bağlantı kabloları

Devre Şeması

Potansiyometrenin sol bacağını ESP32’nin 3.3\text{ V} pinine, sağ bacağını GND pinine ve ayarlanabilir sinyal üreten orta bacağını ise GPIO 34 (ADC1_CH6) pinine bağlıyoruz:

ESP32 Potansiyometre Bağlantı Şeması

Arduino Proje Kodu

Aşağıdaki kod bloğunda, hem ham (noisy) okuma yapıp hem de çoklu örnekleme kullanarak stabilize edilmiş temiz analog verileri seri port üzerinden bilgisayara aktarıyoruz:

// Potansiyometrenin bağlı olduğu pin (ADC1 kanalı olması kritik)
const int potPin = 34;

// Filtre için örnek sayısı (2'nin kuvveti olması bölme işlemini hızlandırır)
const int ornekSayisi = 16; 

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  // ADC çözünürlüğünü 12-bit olarak konfigüre et (0 - 4095)
  analogReadResolution(12);
  
  // Maksimum 3.3V okuyabilmek için 11dB zayıflatma ayarla
  analogSetPinAttenuation(potPin, ADC_11db);
  
  Serial.println("ESP32 Kararlı ADC Okuma Uygulaması Başlatıldı...");
}

void loop() {
  // Ham tekli okuma (Gürültüye maruz kalabilir)
  int hamOkuma = analogRead(potPin);
  
  // Yazılımsal Oversampling / Filtreleme Uygulaması
  long toplamDefer = 0;
  for (int i = 0; i < ornekSayisi; i++) {
    toplamDefer += analogRead(potPin);
    delayMicroseconds(50); // ADC örnekleme kapasitörünün şarj olması için ufak bekleme
  }
  int filtrelenmisOkuma = toplamDefer / ornekSayisi;
  
  // Okunan dijital değeri voltaj karşılığına dönüştür
  // 11dB altında pratik maksimum voltaj limitimiz 3.3V
  float voltaj = (filtrelenmisOkuma / 4095.0) * 3.3;

  // Seri Monitör ve Çizici formatında verileri yazdır
  Serial.print("Ham_Deger:");
  Serial.print(hamOkuma);
  Serial.print("\tFiltreli_Deger:");
  Serial.print(filtrelenmisOkuma);
  Serial.print("\tHesaplanan_Voltaj:");
  Serial.println(voltaj, 3);
  
  delay(200); // 200 ms aralıklarla güncelle
}
Potansiyometre Fiziksel Dönüş Algısı

Kod yükleme işleminin ardından potansiyometreyi yavaşça çevirerek Seri Monitör veya Seri Çizici (Serial Plotter) ekranlarında gürültünün yazılımsal filtre yardımıyla nasıl sönümlendiğini ve çizginin ne kadar pürüzsüzleştiğini gözlemleyebilirsiniz.

Arduino Seri Monitör Çıktısı

Özetle; ESP32’nin dahili analog modülü, pratik filtreleme teknikleri ve doğru kanal seçimiyle (ADC1) birleştiğinde son derece kararlı ve başarılı ölçümler sunar. Gürültü hassasiyetine dikkat ederek tasarlanan pürüzsüz devreler, projelerinizin doğruluğunu üst seviyeye taşıyacaktır.

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.