Dasar ESP32: Konverter Analog-ke-Digital (ADC)

Dalam seri Dasar ESP32 Artikel kami ini akan menjelaskan cara membaca nilai analog dengan ESP32 menggunakan Arduino IDE.

Ini berguna untuk membaca berbagai jenis sensor dan komponen variabel, termasuk, tetapi tidak terbatas pada, trimpot, joystick, slider, dan resistor yang peka terhadap tekanan.

ESP32 ADC Pins

ESP32 termasuk dua SAR ADC 12-bit – ADC1 dan ADC2 – dan mendukung pengukuran pada 18 saluran (pin yang diaktifkan analog). ADC1 tersedia pada delapan GPIO (32 hingga 39), sementara ADC2 tersedia pada sepuluh GPIO (0, 2, 4, 12 hingga 15, dan 25 hingga 27).

Namun, papan DEVKIT V1 DOIT (versi dengan 30 GPIO) hanya memiliki 15 saluran ADC, seperti yang ditunjukkan dalam gambar di bawah ini.

ADC dalam ESP32 Anda memiliki resolusi 12 bit, yang berarti dapat mendeteksi 4096 (2^12) level analog diskrit. Dengan kata lain, akan mengonversi tegangan masukan mulai dari 0 hingga 3.3V (tegangan operasional) menjadi nilai-nilai bilangan bulat mulai dari 0 hingga 4095. Ini menghasilkan resolusi sebesar 3.3 volt / 4096 unit, atau 0.0008 volt (0.8 mV) per unit. Selain itu, resolusi ADC dan rentang saluran dapat diatur secara programatis.

Keterbatasan ADC pada ESP32

Sejujurnya, ADC bukanlah titik kuat ESP32. Ada beberapa keterbatasan yang perlu Anda ketahui.

Tidak Dapat Digunakan saat WiFi Diaktifkan\

Pin-pin ADC2 tidak dapat digunakan saat WiFi diaktifkan. Karena ada kemungkinan besar menggunakan WiFi pada mikrokontroler yang dirancang untuk itu, hanya ADC1 yang dapat digunakan.

Rentang Masukan ADC
ADC ESP32 hanya dapat mengukur tegangan mulai dari 0 hingga 3.3V. Anda tidak dapat mengukur tegangan analog antara 0 hingga 5V secara langsung.

Akurasi ADC Idealnya, Anda akan mengharapkan perilaku linier saat menggunakan ADC, tetapi hal ini tidak terjadi. Konverter ADC pada ESP32 bersifat non-linier. Anda dapat menemukan informasi lebih lanjut tentang hal ini dalam sebuah diskusi di GitHub.

Dalam grafik di bawah ini, non-linieritas pada ujung bawah dan atas tegangan masukan jelas terlihat.


Ini pada dasarnya berarti bahwa ESP32 tidak dapat membedakan antara 3,2V dan 3,3V; nilai yang diukur akan sama (4095). Demikian pula, tidak dapat membedakan antara sinyal 0V dan 0,13V; nilai yang diukur akan sama (0).


Kebisingan Listrik
Kebisingan listrik dari ADC mengindikasikan fluktuasi sedikit dalam pengukuran.

Namun, hal ini dapat diperbaiki dengan menambahkan sebuah kapasitor pada keluaran dan dengan oversampling.


Fungsi analogRead()

Membaca nilai-nilai analog dari pin GPIO adalah hal yang sederhana. Di dalam Arduino IDE, Anda menggunakan fungsi analogRead(), yang menerima nomor pin GPIO yang ingin Anda baca sebagai argumen.

analogRead(GPIO);

Membaca potensiometer
Untuk mendemonstrasikan cara menggunakan ADC pada ESP32, kita akan menggunakan contoh sederhana yang membaca nilai analog dari sebuah potensiometer.

Pemasangan Perangkat
Mari siapkan rangkaian potensiometer sederhana untuk contoh ini.

Mulailah dengan memasukkan potensiometer ke dalam breadboard Anda. Sambungkan pin tengahnya ke pin GPIO 34 pada ESP32 Anda. Terakhir, hubungkan salah satu pin luar potensiometer – tidak masalah mana yang dipilih – ke pin 3V3 ESP32 dan yang lainnya ke ground.

Contoh Kode

Muat sketsa berikut ke ESP32 Anda. Sketsa ini hanya membaca potensiometer dan mencetak hasilnya ke Serial Monitor.

// Potentiometer is connected to GPIO 34 (Analog ADC1_CH6) 
const int potPin = 34;

// variable for storing the potentiometer value
int potValue = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  // Reading potentiometer value
  potValue = analogRead(potPin);
  Serial.print("Analog value: ");
  Serial.println(potValue);
  delay(500);
}

Setelah Anda mengunggah sketsa tersebut, buka monitor serial pada kecepatan baud 115200 dan tekan tombol EN pada ESP32.

Anda seharusnya melihat nilai antara 0 dan 4095, tergantung pada putaran saat ini pada knob, dicetak di monitor serial. Cobalah memutar knob pada potensiometer untuk melihat bagaimana nilai-nilai tersebut berubah.

Penjelasan Kode
Sketsa ini dimulai dengan mendefinisikan pin GPIO ke mana potensiometer terhubung, yang dalam hal ini adalah GPIO 34.

const int potPin = 34;

Sebuah variabel juga didefinisikan untuk menyimpan nilai-nilai potensiometer.

int potValue = 0;

Dalam bagian setup(), kami menginisialisasi komunikasi serial dengan PC.

Serial.begin(115200);


Pada bagian loop, fungsi analogRead() digunakan untuk membaca tegangan pada potPin. Nilai yang dikembalikan disimpan dalam variabel potValue.

potValue = analogRead(potPin);

Terakhir, nilai-nilai yang dibaca dari potensiometer dicetak ke monitor serial.

Serial.print("Analog value: ");
Serial.println(potValue);

potPin tidak perlu diatur sebagai input. Hal ini dilakukan secara otomatis setiap kali Anda memanggil analogRead().

Fungsi-fungsi ADC Lainnya
Ada fungsi-fungsi ADC lain yang mungkin berguna dalam proyek-proyek lain:

analogReadMilliVolts(pin) : mendapatkan nilai ADC untuk pin/kanal ADC tertentu dalam milivolt.

analogReadResolution(bits) : Mengatur bit sampel dan resolusi bacaan. Resolusi default adalah 12 bit. Rentang: dari 9 bit (0 – 511) hingga 12 bit (0 – 4095)

analogSetWidth(bits) :Mengatur bit sampel perangkat keras dan resolusi bacaan. Resolusi default adalah 12 bit. Rentang: 9 hingga 12 bit. 9 bit = 0-511, 10 bit = 0-1023, 11 bit = 0-2047, dan 12 bit = 0-4095.

analogSetCycles(cycles) : Mengatur jumlah siklus per sampel. Default adalah 8. Rentang: 1 hingga 255.

analogSetSamples(samples) : Mengatur jumlah sampel dalam rentang. Default adalah 1 sampel. Ini memiliki efek meningkatkan sensitivitas.

analogSetClockDiv(clockDiv) : Mengatur pembagi untuk clock ADC. Default adalah 1. Rentang: 1 hingga 255.

analogSetAttenuation(attenuation) : Mengatur redaman masukan untuk semua pin ADC. Default adalah ADC_11db. Nilai-nilai yang diterima:

ADC_0db : Mengatur tanpa redaman (Rentang tegangan masukan yang dapat diukur = 100 mV ~ 950 mV)

ADC_2_5db : Mengatur redaman sebesar 1.34 (Rentang tegangan masukan yang dapat diukur = 100 mV ~ 1250 mV).

ADC_6db : Mengatur redaman sebesar 1.5 (Rentang tegangan masukan yang dapat diukur = 150 mV ~ 1750 mV).

ADC_11db : Mengatur redaman sebesar 3.6 (Rentang tegangan masukan yang dapat diukur = 150 mV ~ 2450 mV).

analogSetPinAttenuation(pin, attenuation) : Fungsi ini sama dengan yang sebelumnya, kecuali bahwa ini mengatur redaman masukan untuk pin yang ditentukan.

adcAttachPin(pin) : Melampirkan sebuah pin ke ADC (juga menghapus mode analog lain yang mungkin ada) dan mengembalikan nilai true jika konfigurasi berhasil, jika tidak, mengembalikan nilai false

adcStart(pin) : Memulai konversi ADC pada bus pin yang dilampirkan

adcBusy(pin) :checks if conversion on the pin’s ADC bus is currently running (returns TRUE or FALSE).

resultadcEnd(pin) : Mendapatkan hasil konversi (menunggu jika ADC belum selesai), mengembalikan bilangan bulat 16-bit

Referensi : “ESP32 Basics: Analog-to-digital Converter (ADC)” Last Minute Engineers, https://lastminuteengineers.com/esp32-basics-adc/

Leave a Comment

Your email address will not be published. Required fields are marked *

Select the fields to be shown. Others will be hidden. Drag and drop to rearrange the order.
  • Image
  • Description
  • Capacitance
  • Diameter
  • Height
  • Leakage Current
  • Length
  • Max Operating Temperature
  • Min Operating Temperature
  • Operating temp
  • Operating Temperature Range
  • Operation voltage
  • Power Rating
  • Rated current
  • Rated voltage
  • Resistance
  • Resonant freq
  • Sound output
  • Storage temp
  • Tebal
  • Temperature Coefficient
  • Tolerance
  • Tone
  • Voltage Rating
  • Voltage Rating DC
  • Weight
Compare