ESP32 Dahili DAC (Digital-to-Analog Converter) Kullanımı

👤 Yazar: ozcan 📅 Tarih: 07.06.2026 01:16 👁️ Görüntüleme: 19

ESP32 Dahili DAC (Digital-to-Analog Converter) Kullanımı

Mikrodenetleyiciler dünyasında genellikle dijital sinyallerle (0 ve 1) çalışırız. Bir LED'i kısmak veya bir motorun hızını ayarlamak istediğimizde çoğunlukla PWM (Sinyal Genişlik Modülasyonu) tekniğine başvururuz. Ancak PWM, gerçek bir analog sinyal değil, hızlıca açılıp kapanan dijital bir aldatmacadır. Ses üretimi, hassas dalga formu analizi (sinüs, üçgen, testere dişi) veya saf voltaj referansları sağlamak için gerçek bir analog sinyale ihtiyaç duyarız. İşte bu noktada ESP32'nin içinde yerleşik olarak bulunan Donanımsal DAC (Dijitalden Analoga Dönüştürücü) modülü devreye girer.

Bu kılavuzda, ESP32'nin dahili DAC birimini derinlemesine inceleyecek, donanımsal sınırlarını öğrenecek ve projelerinizde kullanabileceğiniz gelişmiş kod mimarilerini göreceğiz.

---

1. Donanım Mimarisi ve Pin Şeması

ESP32, bağımsız olarak kontrol edilebilen iki adet 8-bitlik DAC kanalına sahiptir. Bu kanallar her ESP32 geliştirme kartında (NodeMCU, ESP32-WROOM vb.) aynı fiziksel GPIO pinlerine yönlendirilmiştir:

Voltaj ve Çözünürlük Değerlerinin Hesaplanması

ESP32'nin dahili DAC'ı 8-bit çözünürlüğe sahiptir. Bu durum, 0 ile 3.3V arasındaki çalışma voltajının toplam 256 eşit parçaya ($2^8 = 256$) bölünebileceği anlamına gelir. Her bir adımın üreteceği teorik voltaj değişimi (çözünürlük hassasiyeti) şu formülle hesaplanır:

Hassasiyet = 3.3V / 256 = 0.0128V (Yani adım başına ~12.8 mV)

Aşağıdaki tabloda, DAC yazılımına göndereceğiniz dijital değerlerin çıkışta üreteceği yaklaşık voltaj karşılıklarını görebilirsiniz:

Dijital Değer (8-bit) Çıkış Voltajı (Teorik) Sinyal Durumu
0 0.00 V Minimum (GND)
64 0.82 V Çeyrek Voltaj
128 1.65 V Yarı Voltaj (Ortalama Referans)
192 2.47 V Üç Çeyrek Voltaj
255 3.30 V Maksimum (VCC)
---

2. Arduino IDE ile Uygulama Örnekleri

ESP32'yi Arduino IDE üzerinde programlarken dahili işlevleri kullanmak oldukça pratiktir. DAC pinlerini kullanırken pinMode() tanımı yapmanıza gerek yoktur; ilgili fonksiyon pini otomatik olarak analog çıkış moduna alır.

Örnek 1: Potansiyometre ile Analog Voltaj Takibi (Hassas Kontrol)

ESP32 potansiyometre ile adc -dac kullanım şeması

Bu senaryoda, GPIO 34 pinine bağlı bir potansiyometreden okuduğumuz 12-bitlik (0-4095) ADC değerini, 8-bitlik (0-255) DAC değerine dönüştürüp GPIO 25 pininden dışarı aktarıyoruz. Böylece bir pinden okuduğumuz voltajı diğer pinden dışarı yansıtmış oluyoruz.

// Pin Tanımlamaları
const int potPin = 34; // Analog Giriş Pini (ADC1_CH6)
const int dacPin = 25; // Analog Çıkış Pini (DAC1)

void setup() {
  // ADC çözünürlüğünü 12-bit olarak ayarlıyoruz
  analogReadResolution(12);
}

void loop() {
  // Potansiyometreden 0-4095 arası değer oku
  int potValue = analogRead(potPin);
  
  // 12-bitlik değeri (0-4095), DAC'ın anlayacağı 8-bitlik değere (0-255) ölçeklendir
  int dacValue = map(potValue, 0, 4095, 0, 255);
  
  // Analog voltajı dışarı aktar
  dacWrite(dacPin, dacValue);
  
  delay(10); // Kararlılık için kısa bir gecikme
}

Örnek 2: Matematiksel Fonksiyon ile Sinüs Dalgası (Sinusoid) Üretimi

ESP32 Sinüs dalga resmi

Gerçek bir alternatif akım (AC) sinyali simüle etmek veya ses frekansı üretmek için matematiksel sinüs fonksiyonunu kullanabiliriz. Kod içerisindeki radyan hesabı, DAC pini üzerinden pürüzsüz bir dalga formu akışı sağlar.

const int dacPin = 25;
float derece = 0;

void setup() {
  // DAC çıkışı için özel bir kuruluma gerek yoktur
}

void loop() {
  // Sinüs fonksiyonu -1 ile +1 arasında değer üretir.
  // Bunu DAC'ın çalışacağı 0-255 aralığına uyarlıyoruz.
  // Sinüs değerini 1 ile toplayarak (0 ile 2 arası) yaparız, 127.5 ile çarparak 0-255 aralığına taşırız.
  int dacValue = (sin(derece) + 1.0) * 127.5;
  
  // Hesaplanan değeri DAC pinine gönder
  dacWrite(dacPin, dacValue);
  
  // Dereceyi artır (Bu değer küçüldükçe dalga pürüzsüzleşir, büyüdükçe frekans artar)
  derece += 0.05;
  
  // Hafıza taşmasını önlemek için derece 2*PI (360 derece) olunca sıfırla
  if (derece >= 6.283) {
    derece = 0;
  }
  
  delayMicroseconds(100); // Frekans hızını kontrol etmek için mikro saniye gecikme
}
---

3. İleri Seviye: ESP-IDF Sürücüleri ile Kesintisiz Kontrol

Arduino'nun standart dacWrite() fonksiyonu, işlemci döngüsünü kullanarak arka arkaya sinyal basar. Eğer arka planda Wi-Fi veya Bluetooth gibi yoğun işlemler çalışıyorsa analog sinyalde kesintiler ve bozulmalar (jitter) meydana gelir. Profesyonel projelerde bunun önüne geçmek için ESP32'nin donanımsal sürücülerini doğrudan tetikleriz.

#include <driver/dac.h>

void setup() {
  // Donanımsal düzeyde DAC Kanal 1'i (GPIO 25) etkinleştirir
  dac_output_enable(DAC_CHANNEL_1);
}

void loop() {
  // Doğrudan donanım register'ına yazma işlemi yapılır. 
  // Bu yöntem Arduino fonksiyonlarına göre çok daha hızlı ve kararlıdır.
  
  dac_output_voltage(DAC_CHANNEL_1, 50);  // ~0.64V
  delay(500);
  
  dac_output_voltage(DAC_CHANNEL_1, 150); // ~1.93V
  delay(500);
  
  dac_output_voltage(DAC_CHANNEL_1, 255); // ~3.30V
  delay(500);
}
---

4. Kritik Donanım Sınırları ve Mühendislik Tavsiyeleri

ESP32 dahili DAC modülünü ticari veya endüstriyel bir ürüne dönüştürürken şu elektriksel kurallara kesinlikle dikkat etmelisiniz:

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
Sayfa Başı
Yenidir CMS V0.1