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.
---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:
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) |
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.

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
}

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
}
---
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);
}
---
ESP32 dahili DAC modülünü ticari veya endüstriyel bir ürüne dönüştürürken şu elektriksel kurallara kesinlikle dikkat etmelisiniz:
Henüz yorum yapılmamış. İlk yorumu siz yapın!