Bab 7 Analog-to-Digital Conversion
Last updated
Last updated
Dunia tempat kita tinggal merupakan dunia analog. Semua fenomena alam yang terjadi merupakan fenomena analog, bukan hanya binary 0 atau 1. Contohnya matahari mulai dari terbit sampai terbenam akan menghasilkan intensitas cahaya yang berubah perlahan-lahan tidak hanya nyala dan mati seperti lampu.
Dalam matematika, nilai analog memiliki jumlah nilai yang tak terhingga di antara kedua nilai. Sebagai contoh pada Gambar 1 sebelah kiri menampilkan nilai analog dari tegangan 0-5V. Setelah nilai 2.7V terdapat 2.71V, 2.718V, 2.7182V, dan seterusnya sampai tak terhingga. Akan tetapi mikrokontroler hanya dapat merepresentasikan nilai yang terbatas seperti pada Gambar 1 sebelah kanan. Sebagai contoh tipe data 8-bit hanya bisa menyimpan data dari 0-255. Di antara nilai 139 dan 140 tidak ada nilai lain.
Mikrokontroler membutuhkan module yang bernama analog-to-digital converter (ADC) untuk melakukan konversi dari analog ke digital. ADC akan melakukan konversi dari nilai analog misalnya dari 0-5V ke nilai digital misalnya 0-255. Dengan menggunakan ADC, mikrokontroler dapat membaca nilai tegangan dari misalnya potensiometer atau sensor yang memiliki output tegangan analog.
Dalam elektronik, sinyal merupakan nilai tegangan yang berubah-ubah terhadap waktu. Sinyal analog memiliki sample tegangan tak terhingga terhadap waktu. Selain itu nilai amplitude-nya juga bersifat tak terhingga banyaknya. Sedangkan sinyal digital memiliki sample tegangan yang terbatas terhadap waktu. Selain itu nilai amplitude-nya juga bersifat terbatas.
ADC akan melakukan proses yang bernama sampling untuk mengubah jumlah sample terhadap waktu yang tak terhingga menjadi terbatas. Selain itu ADC juga akan melakukan proses yang bernama quantization untuk mengubah nilai amplitude yang tak terhingga menjadi terbatas.
Gambar 2 atas menampilkan proses sampling. Jumlah sample pada sumbu waktu yang dihasilkan akan menjadi terbatas. Gambar 2 bawah menampilkan proses quantization. Nilai amplitude yang dihasilkan akan menjadi terbatas.
Gambar 3 menampilkan proses ADC ketika membaca sinyal analog. Sinyal tersebut dapat berasal dari sensor. Sinyal yang berwarna merah merupakan sinyal analog, sedangkan sinyal yang berwarna hijau merupakan sinyal digital. Setiap periode sampling, nilai amplitude sinyal tersebut akan diubah menjadi nilai digital.
Proses sampling dan quantization ditentukan oleh kecepatan sampling dan resolusi ADC tersebut. Misalkan ADC dengan kecepatan sampling 1 MSPS dan resolusi 8-bit akan menghasilkan 1 juta sample per detik dan quantization sebanyak 256 step.
Mikrokontroler ESP32 memiliki dua ADC. ADC1 memiliki 8 channel dan ADC2 memiliki 10 channel. Sehingga total ada 18 channel. Setiap channel mewakili satu pin input analog, tetapi tidak semua channel tersebut dapat digunakan untuk aplikasi kita. Hal ini karena ada beberapa channel yang tidak terhubung ke pin dan ada juga channel yang tidak bisa digunakan ketika Wi-Fi aktif.
Range tegangan dari ADC tersebut yaitu dari 0-3.3V. Resolusi default ADC tersebut yaitu 12-bit sehingga nilai output-nya dari 0-4095 (). Walaupun demikian, ADC tersebut dapat dikonfigurasi ke resolusi lain yaitu 9-bit, 10-bit, atau 11-bit.
Pada bagian ini, kita akan belajar mengenai fungsi pada library Arduino yang diperlukan untuk menggunakan ADC. Fungsi analogRead
merupakan fungsi yang perlu kita panggil saat akan membaca nilai ADC. Fungsi tersebut memiliki satu input argument yaitu pin ADC yang akan dibaca nilainya. Nilai return fungsi tersebut bertipe unsigned integer 16-bit yang merupakan nilai ADC yang terbaca.
Light-dependent resistor (LDR) (atau disebut juga photoresistor atau photocell) merupakan jenis resistor yang nilai hambatannya dapat berubah tergantung intensitas cahaya yang diterima pada permukaannya. Gambar 4 menampilkan contoh komponen LDR yang ukurannya bervariasi (dalam skala mm).
Hambatan pada LDR akan berkurang ketika intensitas cahayanya bertambah. Fenomena ini disebut juga photoconductivity. Pada kondisi gelap, LDR dapat memiliki hambatan beberapa mega Ohm (MΩ), sedangkan pada kondisi terang LDR dapat memiliki hambatan beberapa ratus Ohm.
Untuk menggunakan LDR sebagai sensor cahaya, kita perlu merangkai sensor tersebut seperti rangkaian pembagi tegangan. Skematik rangkaian tersebut ditampilkan pada Gambar 5. Tegangan output dari rangkaian pembagi tegangan tersebut akan dibaca oleh ADC.
Untuk menganalisis rangkaian tersebut, kita bisa menggunakan rumus pembagi tegangan seperti pada rumus ini:
Dimana:
adalah tegangan output yang akan dihubungkan ke pin ADC,
adalah tegangan supply,
adalah nilai hambatan resistor tetap, dan
adalah nilai hambatan LDR.
Nilai resistor tetap yang digunakan biasanya yaitu , sedangkan nilai resistor LDR bervariasi dari beberapa ratus sampai beberapa mega Ohm.
Sebagai contoh, jika dalam kondisi gelap LDR memiliki hambatan dan hambatan resistor tetap adalah . Berapa nilai tegangan output yang akan terbaca oleh ADC? Berapa nilai konversi digital ADC-nya jika resolusi ADC yang digunakan adalah 12-bit?
Nilai tegangan output yang terbaca oleh ADC adalah . Pada ADC 12-bit, nilai ini akan dikonversi ke nilai digital .
Pada bagian ini akan dibahas satu contoh program ADC untuk membaca sensor cahaya LDR. Nilai sensor yang dibaca ADC akan dikirim ke PC melalui komunikasi serial, kemudian ditampilkan pada program serial monitor. Program ini bersifat umum untuk pembacaan ADC, apapun sensor yang digunakan asalkan output-nya analog, maka kode pada contoh program ini dapat digunakan.
Untuk dapat menjalankan contoh program ini diperlukan beberapa komponen:
Development board ESP32
LDR
Resistor 10KΩ
Breadboard
Kabel jumper
Ilustrasi koneksi dari LDR ke ESP32 ditampilkan pada gambar 6. Pin yang digunakan untuk menghubungkan LDR ke ESP32 ditampilkan pada tabel berikut ini.
LDR output
D27
Kode berikut ini menampilkan contoh program ADC. Berikut ini penjelasan cara kerja program tersebut:
Pada line 1, kita membuat sebuah variable bertipe integer untuk menyimpan hasil pembacaan ADC.
Pada line 6, kita mengkonfigurasi komunikasi serial.
Pada line 12, kita melakukan pembacaan ADC dengan memanggil fungsi analogRead
, kemudian nilai yang terbaca disimpan pada variable light_sensor
.
Pada line 13, kita mengirim nilai ADC tersebut ke PC.
Pada line 14, kita menambahkan delay sebesar 500ms agar pembacaan nilai ADC tidak terlalu cepat.
Gambar 7 menampilkan hasil dari contoh program ini. Pada kondisi terang, hasil pembacaan ADC sekitar 600, kemudian ketika sensor LDR ditutup dan cahayanya berkurang, maka hasil pembacaan ADC menjadi sekitar 100.
Selain menggunakan serial monitor, kita juga bisa menvisualisasikan nilai sensor cahaya dengan serial plotter seperti pada Gambar 8.
Kode program ADC untuk pembacaan sensor cahaya LDR dapat didapatkan di repository ini: adc-light-sensor.