0% menganggap dokumen ini bermanfaat (0 suara)
27 tayangan21 halaman

Modul 2 LTF 02

Dokumen tersebut membahas tentang Analog I/O pada praktikum Teknik Fisika di Institut Teknologi Bandung. Praktikum ini mempelajari cara kerja Analog to Digital Converter (ADC) dan Digital to Analog Converter (DAC) untuk mengkonversi sinyal analog menjadi digital dan sebaliknya menggunakan perangkat EScope dan Arduino IDE.

Diunggah oleh

ferdyklmn
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
27 tayangan21 halaman

Modul 2 LTF 02

Dokumen tersebut membahas tentang Analog I/O pada praktikum Teknik Fisika di Institut Teknologi Bandung. Praktikum ini mempelajari cara kerja Analog to Digital Converter (ADC) dan Digital to Analog Converter (DAC) untuk mengkonversi sinyal analog menjadi digital dan sebaliknya menggunakan perangkat EScope dan Arduino IDE.

Diunggah oleh

ferdyklmn
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 21

Institut Teknologi Bandung

Program Studi Teknik Fisika


Praktikum TF2207 Dosen Dr. Ir. Eko Mursito Budi, M.T., IPM
Laboratorium TF II Ashari Budi Nugraha, S.T., M.T.
2 SKS Dr.Eng. Muhammad Iqbal, S.T., M.T.

2 ANALOG I/O

2.1 LATAR BELAKANG

Dalam dunia nyata, terdapat besaran seperti panjang, suhu, tegangan listrik dan lain-lain yang semuanya bersifat
kontinyu (dapat memiliki harga berapa saja). Sementara itu dalam dunia komputer digital, data bersifat diskrit
(memiliki rentang nilai sesuai banyak bit). Oleh karena itu, agar besaran dari dunia nyata dapat dimasukkan ke /
dikeluarkan dari mikroprosesor, diperlukan antarmuka (interface) khusus. Dalam hal ini ada:

• Analog to Digital Converter (ADC)


• Digital to Analog Converter (DAC)

Kita perlu memahami cara kerja berbagai antarmuka tersebut, agar dapat mengaplikasikannya dengan tepat
ke berbagai kasus.

2.2 KOMPETENSI

Kompetensi yang akan dikuasai peserta setelah menyelesaikan praktikum ini dengan baik adalah:
• Mampu menggunakan DAC untuk mengeluarkan tegangan yang tepat.
• Mampu mengukur tegangan dengan ADC dan melaporkan tegangannya yang benar.
• Mampu mengukur tegangan, arus, dan daya dengan INA219.
• Mampu mengambil data dan memrogram kalibrasi ADC dan DAC.
• Mampu memrogram operasi pengukuran operating point.
• Mampu memrogram operasi pengukuran DC-sweep.

TF2207/Modul-2/1
2.3 ALAT & BAHAN

No Item Banyak Keterangan


1 Kit EScope 1 Dari Paket
2 Breadboard dan kabel jumper Secukupnya
3 Resistor (220 Ω) 2

4 Kabel micro USB 1 Disiapkan peserta


5 Komputer (dengan Arduino IDE) 1

2.4 PANDUAN TEKNIS

2.4.1 PERANGKAT KERAS

2.4.1.1 ESCOPE

ESCOPE adalah board pengembangan berbasis ESP32 yang dilengkapi dengan beberapa piranti standar, dan
didesain agar mudah dikoneksikan ke breadboard.

Gambar 2-1 Board ESCOPE

Komponen standar pada ESCOPE meliputi:


• Konektor catu daya 5 Volt, untuk memberi daya ke EScope maupun breadboard
• OLED resolusi 128x32 yang terkoneksi melalui I2C
• INA219 yang juga terkoneksi melalui I2C
• Tiga buat tombol, terkoneksi secara pull-down ke GPIO 13
• Tiga LED (Merah, Kuning, dan Hijau), terkoneksi secara source ke pin GPIO 16, 4, dan 15
• Dua Op-amp sebagai keluaran analog, terkoneksi ke DA pin GPIO 26 dan 25

Selanjutnya terdapat soket AO, AI, dan DI untuk sambungan kabel ke breadboard.

TF2207/Modul-2/2
Detail skema EScope adalah sebagai berikut.

Gambar 2-2 Skema ESCOPE

2.4.1.2 BREADBOARD
Skema rangkaian dan foto komponen yang perlu dirangkai pada breadboard adalah sebagai berikut.

AI0
AI1
DI0
DI1
DI2
DI3

Gambar 2-3 Skema rangkaian pada breadboard

TF2207/Modul-2/3
Nampak bahwa ini adalah rangkaian pembagi tegangan dengan dua resistor biasa. Koneksi rangkaian adalah:

• Output dari AO0 dikoneksikan ke VIN+ (INA219), seraya diukur oleh AI0
• Output dari VIN- (INA219) dikoneksikan ke R8, seraya diukur oleh AI1
• Pin lain R8 dikoneksikan ke R10, seraya diukur oleh DI0
• Pin lain R10 dikoneksikan ke ground

2. 4.2 PEMROGRAMAN DASAR

2.4.2.1 DAC

Digital to Analog Converter (DAC) adalah komponen keluaran yang mampu menghasilkan tegangan listrik sesuai
dengan masukan angka digital (biner) yang diberikan padanya. Spesifikasi DAC pada ESP32 adalah:

• Input: angka digital 8 bit (0 – 255)


• Output: tegangan sesuai VCC (tipikal 0 – 3.3 Volt); arus maksimum 12 mA
• Pin yang sanggup : 2 buah (IO-25 dan IO-26)

Pada EScope, luaran DAC ini disambung ke op-amp sebagai buffer impedance dengan arus maksimum 20 mA.
Konektor untuk DAC ini adalah AO0 dan AO1.

Perintah agar DAC mengeluarkan tegangan tertentu adalah sebagai berikut:

// konstanta sesuai resolusi DAC 8 bit


#define DA_MAX 255
int da_mv_max = 3270;// tegangan maksimum, harus diukur dulu
int da_mv = 2123;// contoh tegangan yg akan dikeluarkan
int da_d = (long)da_mv * DA_MAX / da_mv_max; // konversi tegangan ke biner
dacWrite(AO0, da_d); // menulis ke DA, bisa pin AO0 atau AO1

2.4.2.2 ADC

Analog to Digital Converter (ADC) adalah komponen masukan, mampu menerima tegangan listrik dan
mengubahnya menjadi angka digital. Spesifikasi ADC pada ESP32 adalah:

• Input: tegangan sesuai VCC (tipikal 0 – 3.3 Volt). Namun ada non-linearitas di tegangan rendah
(<100mV) dan tinggi (>3100mV).
• Output: angka digital 12 bit (0 – 4095)
• Waktu konversi : 100 mikro detik.
• Banyak ADC: 6 buah.
• Pin ADC1 : 8 kanal
• Pin ADC2 : 10 kanal

Pada EScope 22, kita bisa menggunakan ADC sebanyak 6 pin, tersedia di konektor AI0-AI1 dan DI0 – DI4. Untuk
memrogram ADC, Teknik dasarnya adalah:

// konstanta sesuai resolusi ADC 12 bit


#define AD_MAX 4095
int ad_mv_max = 3210;// rentang tegangan, harus dikalibrasi ulang

int ad_d = analogRead(AI0); // baca dari pin AI0-AI1 atau DI0 – DI4
int ad_mv = (long) ad_d * ad_mv_max / AD_MAX; // konversi ke tegangan

TF2207/Modul-2/4
2.4.2.3 INA219

INA219 adalah modul bantu untuk membaca tegangan, arus, dan daya listrik; dan terkoneksi ke mikro-kontroller
melalui I2C. Skema INA219 adalah sebagai berikut:

Gambar 2-4 Modul dan skema INA219

Tampak bahwa pada INA219 ini terdapat sebuah Rshunt (harga 10 ohm) yang dialiri listrik dari Supply (pin VIN+)
ke Load (pin VIN-). Tegangan pada VIN+ dan VIN- dapat diukur oleh suatu ADC. Dengan demikian:

• Tegangan pada VIN+ disebut Vsupply.


• Tegangan pada VIN- disebut Vbus.
• Tegangan jatuh pada resistor adalah Vshunt = Vsupply – Vbus.
• Arus yang mengalir adalah Iload = Vshunt / Rshunt.
• Daya yang diberikan ke load adalah Pload = Vbus * Iload.

Untuk memrogram INA219, perintah-perintah dasarnya adalah sebagai berikut:

// muat pustaka yang diperlukan


#include <Wire.h>
#include <Adafruit_INA219.h>

// Pesan obyek INA219


Adafruit_INA219 ina219;

// pada setup, lakukan inisialisasi


void setup() {
ina219.begin();
}

void loop() {
// selanjutnya untuk membaca ada 4 fungsi utama
float shunt_mv = ina219.getShuntVoltage_mV();
float bus_v = ina219.getBusVoltage_V();
float current_ma = ina219.getCurrent_mA();
float power_mw = ina219.getPower_mW();
}

TF2207/Modul-2/5
2.4.2.4 DATA INTEGER & OPERATOR
Untuk memproses data analog digunakan tipe data integer (bulat) sesuai dengan resolusi ADC maupun DAC.
Dalam hal ini :
• DAC memiliki resolusi 8 bit, maka cukup menggunakan tipe data byte.
• ADC memiliki resolusi 12 bit, maka setidaknya harus diproses dengan tipe data word atau int.

Contoh:

byte data1 = 100;


int data2 = 1000;

dacWrite(AO0, data1); // OK
dacWrite(AO1, data2); // output overflow !

data1 = analogRead(AI0); // bisa error


overflow data2 = analogRead(AI1); // OK

Selanjutnya dalam memproses data tersebut, bisa digunakan operator aritmatika dengan tetap memperhatikan
kemampuan tipe data dan precedence operator. Ada kalanya, kita harus menggunakan tipe data long (32 bit)
selama operasi. Misalnya saja:
#define AD_MAX 4095
int ad_mv_max = 3200;
int ad = analogRead(AI0);

int mv1 = ad * ad_mv_max / AD_MAX; // bisa error !


int mv2 = (long) ad * ad_mv_max / AD_MAX; // OK
int mv3 = (long) ad / AD_MAX * ad_mv_max; // selalu error !!

2.4.2.5 DATA FLOAT & MATH

Jika data memang akan menjadi pecahan, maka perlu digunakan tipe data float atau double. Meski demikian,
data float memerlukan memori dan proses yang lama. Karena itu hindarilah menggunakannya selama masih
bisa digunakan tipe data integer (byte, word, int, long, dll).

Ketika harus menggunakan campuran data float dan integer, perhatikan benar kapan harus meng-casting
menjadi tipe data lain. Contoh penggunaan:

#define AD_MAX 4095


int ad_mv_max = 3200;
int ad = analogRead(AI0);

float ad_div1 = ad_mv_max / AD_MAX; // selalu error !


float ad_div2 = (float) ad_mv_max / AD_MAX; // OK
int mv0 = (int) ad_div2 * ad; // Error !!

int mv1 = (int)(ad_div2 * ad); // terpotong ke bawah int


mv2 = (int)(ad_div2 * ad + 0.5); // rounded OK

TF2207/Modul-2/6
2.4.3 ALGORITMA KHUSUS

2.4.3.1 KALIBRASI DAC

Agar dapat menghasilkan luaran tegangan (dalam milivolt) yang benar dengan DAC, maka kita perlu melakukan
konversi dari milivolt ke angka biner terdekat. Dalam hal ini, kurva input/output antara tegangan ke biner adalah linier,
sehingga kita cukup melakukan interpolasi linier, di mana rumusan matematikanya adalah sebagai berikut:

Rumus dasar:

Harga x0, y0, x1, y1 konstanta. Diberikan harga x, carilah y. Maka:

Gambar 2-5 Interpolasi Linier

Dalam kasus ADC :


x0 : tegangan minimum ADC, asumsi selalu 0 Volt
x1 : tegangan maksimum ADC, perlu diukur dulu
y0 : angka biner ADC, selalu 0
y1 : angka maksimum biner, selalu 255 (karena 8 bit)
x : luaran tegangan yang diinginkan
y : angka biner yang harus diberikan ke ADC

Dengan demikian, dalam kalibrasi kita perlu mencari tahu harga tegangan maksimum ADC, yang dalam hal ini
bisa diukur dengan INA219. Setelah itu konversi cukup dengan operasi sederhana:

int da = (long) mv * DA_MAX / da_mv_max;

2.4.3.2 KALIBRASI ADC

Dari hasil bacaan ADC yang berupa angka biner, perlu dilakukan konversi agar bisa diperoleh harga tegangan
yang sebenarnya. Sayangnya, pihak pembuatnya (Espressif) mengakui bahwa ADC ESP32 tidak linier.

Gambar 2-6 Kurva I/O ADC ESP32

TF2207/Modul-2/7
Untuk mengatasi hal ini, salah satu eknik konversi yang mudah adalah membagi daerah kerja ADC menjadi
beberapa area/segmen, dan melakukan interpolasi linier di masing-masing area. Dalam pemrogramannya,
segmen ini disimpan sebagai array look-up table seperti Gambar berikut.

tabel look-up i x y
6000
0 0 0
1 100 500
5000
Y[4] 2 200 2260
Y 3 300 3600
4000

Y[3] 4 400 4800


y 3000 5 500 4900

2000 Array look-up table

1000 Jika X diketahui, cari


segmen yang sesuai
0
0 100 200 300 400 500 600
lalu hitung Y dengan
x X rumus interpolasi linier.
X[3] X[4]

Gambar 2-7 Ilustrasi table look-up untuk kalibrasi

Dengan demikian, proses kalibrasi adalah:

• Berikan masukan tegangan pada ADC dari minimum sampai maksimum dengan kenaikan
tertentu
• Ukur tegangan masukan memakai INA219
• Baca luaran ADC

Hal ini akan dilakukan pada praktikum Percobaan 4.

Susun hasil kalibrasi tersebut sebagai tabel look-up. Kemudian untuk proses pembacaannya:

• Baca ADC (dapat nilai X)


• Cari segmen yang sesuai pada tabel, di mana ( X[i-1] < X <= X[i] ); i = 1 .. N_ROW
• Lakukan interpolasi linier pada segmen tersebut

Implementasi algoritma ini bisa dipelajari pada praktikum Percobaan 5.

2.4.3.3 PENGUKURAN OPERATING POINT (OP)

Pengukuran operating point pada suatu sistem (dalam hal ini rangkaian elektronik) adalah proses di mana alat
ukur (dalam hal ini EScope) melakukan operasi:

1. mengumpankan masukan konstan ke sistem (melalu DAC).


2. menunggu sistem merespon sampai tunak (steady state).
3. mengukur beberapa besaran dari sistem beberapa kali (dengan ADC).
4. mengolah data pengukuran dan menampilkannya (ke Serial Monitor).
5. mengulang Langkah 3-4 beberpa kali (n_data).
6. Jika perlu, menganalisis hasil pengukuran (misalnya menghitung rata-rata).

Diagram aliran data dan output yang diharapkan nampak sebagai berikut:

TF2207/Modul-2/8
OP 250
Mulai DA(mV) Vi+(mV) AD(mV)
250 245 125
Tulis Output 250 256 124
(Masukan sistem) 250 255 127
250 251 124
for 250 249 129
N 250 252 123
--------------------
Baca Input Analisis Data AVG 251,3 125,3
(Luaran Sistem) Print Analisis STDEV 4,0 2,3

Konversi Data
Print Data Selesai

Gambar 2-8 Diagram Aliran Data dan Ilustrasi Tampilan Operasi OP

Pada praktikum Percobaan 6, kita akan melihat implementasi algoritma OP ini.

2.4.3.4 PENGUKURAN DC-SWEEP

Pengukuran DC-sweep pada suatu sistem (dalam hal ini rangkaian elektronik) adalah proses di mana alat ukur
(dalam hal ini EScope) melakukan operasi:

1. mengumpankan masukan dari harga awal tertentu (v_min) ke sistem (melalui DAC).
2. menunggu sistem merespon sampai tunak (steady state).
3. mengukur beberapa besaran dari sistem (dengan ADC).
4. mengolah data pengukuran dan menampilkannya (ke Serial Monitor).
5. Mengulang Langkah 1-4 beberapa kali (ndata), dengan menaikkan harga output secara step hingga
mencapai harga maksimum (v_max).
6. Jika perlu, menganalisis hasil pengukuran (misalnya mencari trendline input/output)

Tampilan luaran yang diharapkan nampak sebagai berikut:

DC 0 500
DA(mV) Vi+(mV) AD(mV)
0 36 0
100 96 92
200 188 187
300 296 290
400 392 387
500 488 484
---------------------

Gambar 2-9 Ilustrasi Tampilan Operasi DC-SWEEP

Kita akan melakukan operasi DC-sweep ini pada Percobaan 7.

TF2207/Modul-2/9
2.5 TUGAS AWAL

Siapkan rangkaian praktikum (sesuai 1.4.1.2) pada breadboard, potret bahwa itu sudah siap.
Sebelum memulai praktikum ini, kerjakan tugas awal berikut:
1. Pelajari rangkaian INA219. Jelaskan bagaimana caranya bisa mengetahui harga tegangan Vsupply.
2. Perhatikan contoh yang diberikan pada data integer (sub 1.4.2.4). Paparkan apa itu overflow, lalu
jelaskan mengapa dan mengapa error ini bisa terjadi ?
dacWrite(AO1, data2); // output overflow !
data1 = analogRead(AI0); // bisa error overflow
3. Pelajari tentang range tipe data int maupun long. Paparkan apa itu operator precedence dan type
casting, lalu jelaskan mengapa operasi ini bisa benar maupun salah
int mv1 = ad * ad_mv_max / AD_MAX; // bisa error !
int mv2 = (long) ad * ad_mv_max / AD_MAX; // OK
int mv3 = (long) ad / AD_MAX * ad_mv_max; // selalu error !!
4. Pelajari tipe data float dan double, dan konversinya ke integer. Jelaskan mengapa operasi ini bisa
benar maupun error:
float ad_div1 = ad_mv_max / AD_MAX; // selalu error !
float ad_div2 = (float) ad_mv_max / AD_MAX; // OK

int mv0 = (int) ad_div2 * ad; // Error !!


int mv1 = (int)(ad_div2 * ad); // terpotong ke bawah
int mv2 = (int)(ad_div2 * ad + 0.5); // rounded OK
5. Sebagai bandingan, pelajari algoritma OP yang dijelaskan pada sub bab algoritma khusus. Kemudian
ingat-ingat kembali operasi DC-SWEEP pada lab TF I lalu. Buatlah flow-chart operasi DC-SWEEP
tersebut.

6. Ambil kode sumber OP yang diberikan pada praktikum ini sebagai bahan awal. Coba modifikasi agar
dapat menjadi program DC-SWEEP untuk dilaksanakan pada akhir praktikum ini.

TF2207/Modul-2/10
2.6 PRAKTIKUM

2.6.1 ANALOG INPUT

Pada praktikum ini kita ingin mempelajari dasar pemrograman ADC. Sebagaimana dijelaskan pada Modul 1,
EScope versi 2022 memiliki 3 buah button yang ada pada papan EScope, yaitu S0, S1, dan S2. Masing-masing
button terhubung dengan satu buah resistor berharga tertentu sehingga membuat suatu rangkaian pembagi
tegangan yang mengalirkan arus dari sumber ke pin BT0 dan ground apabila button ditekan. Berikut ini adalah
skematik dari button yang ada pada EScope versi 2022,

dengan harga R2 = 2,7 kΩ, R7 = 1,2 kΩ, dan R10 = 1 kΩ. Dengan demikian, apabila asumsi VCC sebesar 3300
mV, maka nilai tegangan yang dihasilkan pada variasi skenario penekanan tombol S0, S1, dan S2 adalah :

Skenario Penekanan Tombol Tegangan BT0 (mV)


S0 1482
S1 2135
S2 2269
S0 + S1 2395
S0 + S2 2478
S1 + S2 2644
S0 + S1 + S2 2736

Pada percobaan 1 ini kita akan membaca nilai analog tegangan yang dihasilkan dari skenario penekanan tombol
S0, S1, dan S2 menggunakan mikrokontroller dengan perintah analogRead(). Nilai yang dibaca oleh
analogRead() masih dalam bilangan digital (0 – 4095), untuk mengubahnya ke nilai tegangan dalam milivolt,
perlu dilakukan konversi menggunakan rumus:

Voltagereference
Voltage = × Digital Input Number
2N − 1

Di mana voltagereference adalah 3300 mV, N adalah bit ADC ESP32 (12 bit), dan digital input number adalah nilai
digital yang dibaca melalui perintah analogRead().

Pada percobaan 1 ini tidak menggunakan komponen dan breadboard sama sekali, jadi lepaskan semua jumper
dari EScope.

TF2207/Modul-2/11
Unduh kode M2-01 AnalogInput dan unggah ke EScope. Program ini akan:
• Memunculkan pesan di Serial Monitor untuk menekan tombol secara berurutan sesuai dengan skenario
penekanan tombol pada tabel di atas.
• Nilai input digital (AD) dan nilai tegangan (mv) berdasarkan skenario penekanan ketiga tombol akan
muncul di layar OLED.

Catat nilai AD yang muncul di OLED pada setiap skenario penekanan ketiga tombol. Nilai AD ini akan digunakan
sebagai threshold ketiga analog button ini.

Dari percobaan 1 ini, coba buat analisis mengapa kita perlu mengukur dan menentukan tegangan threshold dari
setiap skenario penekanan tombol?

2.6.2 ANALOG BUTTON

Pada percobaan 2, akan dipelajari penggunaan class AnalogButton dan MultiLED. Kedua class ini sudah
dibuatkan di library TFScope22, sehingga kita tinggal menggunakannya saja. Selain itu, pada percobaan 2 ini kita
akan:
• Memilah tegangan yang dibaca pada pin BT0 menjadi 3 tombol (S0, S1, dan S2) dan menyalakan tiga
buah LED (LED0 – LED1) yang ada pada papan EScope sesuai dengan tombol yang ditekan
• Menampilkan nilai tegangan dari setiap skenario penekanan tombol di OLED

Melalui percobaan 2 ini, kita juga akan dapat mengonversi nilai analog dari setiap skenario penekanan tombol
menjadi nilai digital, kemudian mengatur nyala LED pada papan EScope sesuai dengan nilai digitalnya. Konversi
tersebut ditampilkan pada tabel di bawah ini,

Skenario Penekanan Tombol Nilai Digital Nyala LED


S0 001 LED0
S1 010 LED1
S2 100 LED2
S0 + S1 011 LED0 + LED1
S0 + S2 101 LED0 + LED2
S1 + S2 110 LED1 + LED2
S0 + S1 + S2 111 LED0 + LED1 + LED2

Sama dengan percobaan 1, percobaan ini belum menggunakan komponen dan breadboard. Unduh kode M2-02
AnalogButton dan unggah ke EScope. Perhatikan yang terjadi pada LED dan yang tampil di OLED ketika tombol
ditekan berdasarkan skenario penekanan tombol pada tabel di atas. Buatlah analisis dari apa yang tampil pada
setiap skenario penekanan tombol.

2.6.3 DA-INA

Pada percobaan 3 ini kita ingin mempelajari dasar pemrograman DAC dan INA219, dan membuat tampilan ke
Serial Monitor. Sebelum memulai percobaan, koneksikan jumper sebagai berikut:
• Koneksikan AO0 ke V+;
• V- ke salah satu kaki seri resistor R1+R2 (220+220 ohm);
• Salah satu kaki seri resistor lainnya ke GND

Untuk praktikum gunakan kode sumber M2-03-DA_INA. Pelajari kode sumber itu sebentar, di mana
algoritmanya cukup sederhana menggunakan multi-loop.

Coba unggah kode tersebut ke EScope. Gunakan tombol S0 dan S2 untuk menaikkan dan menurunkan bilangan
output digital. Amati keluaran (bilangan output digital, Vbus, Vshunt, I, dan P) dari Serial Monitor.

TF2207/Modul-2/12
a. Apakah pengukuran Vbus nampak stabil? Makin stabil makin baik, menandakan tegangan DA konstan,
dan pengukuran INA konsisten.
b. Apakah pengukuran Vshunt dan arus (I) cukup signifikan? Mengapa demikian?
c. Apakah pengukuran daya (P) cukup tepat (sesuai rumus perhitungan daya)?

2.6.4 DA-INA-AD

Pada percobaan 4 ini, mulai dilakukan pengukuran dengan ADC. Namun seperti diketahui, ADC ESP32 tidak
linier. Oleh karena itu pada program ini juga dilakukan tahap pertama dari kalibrasi, yaitu mendapatkan data
untuk membuat tabel look-up. Skema rangkaian berbeda dengan percobaan 3 (tidak menggunakan resistor
pada breadboard), di mana pada percobaan 4 ini akan dilakukan:

• EScope mengumpan tegangan dari AO0, yang tersambung ke VIN+ dan AI0.
• EScope membaca tegangan dari AI0 dan INA219.

Untuk praktikum ini gunakan kode sumber M2-04-DA_INA_AD. Bagian kode yang perlu mendapat perhatian
adalah bagian berikut.

• Dipakai loop for untuk mengubah da_out dari minimum hingga maksimum (dalam nilai digital)
• Mengeluarkan sinyal DA (ke AO0)
• Membaca AD (dari AI0) memakai perintah standar.
• Untuk INA, dibaca tegangan shunt dan tegangan bus, lalu dihitung tegangan supply (VIN+).

// mengeluarkan output ramp dari 0 – DA_MAX


for (da_out=0; da_out<=DA_MAX; da_out++) {

dacWrite(AO0, da_out); // keluarkan sinyal ke DA


delay(10); // tunggu tunak

ad_in = analogRead(AI0); // baca AD

// baca INA
float shunt_mv = ina219.getShuntVoltage_mV();
float bus_v = ina219.getBusVoltage_V();

// konversi bacaan ina ke integer tegangan (mV) dengan


pembulatan
ina_mv = …;

printData();
}

Kode 1. Kode membuat tabel look-up

Sementara itu untuk menampilkan hasil ke serial monitor, digunakan fungsi printData(). Dalam hal ini kita
ingin menampilkan data yang mudah di-copy-paste ke spreadsheet, atau nantinya dipakai sebagai kode sumber.

// Fungsi untuk print data ke serial


monitor void printData() {
char buff[40];
// format ke spreadsheet
sprintf(buff,"%4d, %4d, %4d", ad_in, ina_mv, da_out);
// format ke array

TF2207/Modul-2/13
// sprintf(buff,"{%4d, %4d, %4d},", ad_in, ina_mv, da_out);
Serial.println(buff);
}

Kode 2. Kode membuat tabel look-up

Pada saat praktikum, lakukan:


a. sempurnakan kode sumber di atas (tuliskan kode menghitung ina_mv)
b. pastikan printData untuk ke spreadsheet
c. jalankan program, amati luarannya dengan Serial Monitor.
d. salin luaran ke spreadsheet.
e. buatlah grafik i/o antara data ina_mv (VI+) dan da_out (DA). Analisislah linearitasnya.
f. buatlah grafik i/o antara data ad_in (AD) dan ina_mv (VI+). Analisislah linearitasnya.

Konversi V(mV) ke DA (biner 8 bit) Konversi AD (biner 12 bit) ke V (mV)


4000
300
3500
250
y = 0,0825x - 2,4962 3000
200 R²=1 y = 0,7867x + 132,72
2500 R² = 0,9966

150
2000

100 1500

50 1000

500
0
0 500 1000 1500 2000 2500 3000 3500
0
-50 0 500 1000 1500 2000 2500 3000 3500 4000 4500

Gambar 2-10 Contoh grafik konversi V ke DA dan AD ke V

Selanjutnya untuk membuat table look-up :

a. ubah sedikit pada kode program, yaitu dengan memastikan printData() memakai format ke
Array
b. jalankan program, amati luarannya dengan Serial Monitor.
c. Siap-siap menyalin luarannya ke program berikutnya

2.6.5 KALIBRASI

Pada prosedur ini, kita akan memanfaatkan hasil program sebelumnya untuk mendapatkan hasil pengukuran
yang sudah terkalibrasi. Skema pengukuran masih sama, hanya saja algoritma program sedikit berubah.

Dengan demikian program berikutnya ini akan:

• Dipakai loop for untuk mengubah da_mv dari minimum hingga maksimum (dalam nilai mV).
• Konversi da_mv ke nilai digital, lalu mengeluarkan sinyal DA (ke AO0) .
• Membaca AD (dari AI0) dalam biner, lalu dikonversi ke mV.
• Untuk INA, dibaca tegangan shunt dan tegangan bus, lalu dihitung tegangan supply (VIN+).

Penambahan konversi dengan kalibrasi ini membuat program cukup kompleks. Sebagai kode sumber awal,
ambillah program M2-05-KALIBRASI. Pertama-tama, perhatikan table lookup. Tabel dengan 3 kolom ini dibuat
dengan menyalin-tempel dari luaran program sebelumnya.

TF2207/Modul-2/14
// index kolom array kalibrasi
enum {I_AD, I_MV, I_DA, N_COL};
#define N_ROW 256

// isi tabel ini dari hasil program


sebelumnya int tabel[N_ROW][N_COL] = {
{ 0, 32, 0},
{ 0, 48, 1},
{ 0, 56, 2},
{ 0, 68, 3},
{ 0, 80, 4},
{ 9, 88, 5},
{ 28, 104, 6},
{ 38, 116, 7},
. . . . seterusnya sampai 256 baris ...
{4080, 3008, 253},
{4083, 3110, 254},
{4083, 3120, 255},
};

Kode 3. Kode mencacah biner dengan luaran ke OLED

Perhatikan bahwa ada non-lineritas pada awal data (banyak AD = 0) maupun akhir data (ada tiga AD = 4083).
Secara fisis, itu artinya pengukuran hanya cukup valid setelah tegangan 104 mV (baris AD = 0 terakhir) dan 3100
mV (baris AD = 4083 pertama).

Namun untuk memperbaiki converter ini, tabel perlu diperbaiki agar nilai tiap baris unik dan selalu naik
(ascending). Oleh karena itu jika ada data yang sama, sebaiknya diperkirakan secara manual. Misalnya saja
adanya beberapa 0 di awal, diedit sebagai berikut:

/ // index kolom array kalibrasi


enum {I_AD, I_MV, I_DA, N_COL};
#define N_ROW 256

// isi tabel ini dari hasil program sebelumnya


// ubah baris yang nilainya sama jadi ascending proposional
int tabel[N_ROW][N_COL] = {
{ 0, 32, 0},
{ 1, 48, 1}, // ubah 0 menjadi 1 dst sampai 9
{ 2, 56, 2},

TF2207/Modul-2/15
{ 5, 68, 3},
{ 7, 80, 4},
{ 9, 88, 5},
{ 28, 104, 6},
{ 38, 116, 7},
. . . . seterusnya sampai 256 baris ...
{4080, 3008, 253},
{4082, 3110, 254}, // ubah 4083 jadi 4082
{4083, 3120, 255}
};

Kode 4. Tabel Look-up Konversi setelah dikoreksi

Selanjutnya, pelajari proses konversi DA sebagai berikut, menggunakan interpolasi linier. Dalam hal ini titik awal
diambil dari baris-0 tabel, sementara titik akhir dari baris terakhir tabel; dengan asumsi awal DA selalu 0. Dalam
kalkulasi ini, digunakan tipe data float, namun jika bisa sebaiknya pakai bilangan bulat saja.

// Fungsi konversi mV ke DA (biner 0-


255) int mvToDa(int mv) {
// konversi linier
int ofs_mv = tabel[0][I_MV];
int delta_mv = tabel[N_ROW-1][I_MV]-ofs_mv;
int delta_da = tabel[N_ROW-1][I_DA];

// kalkulasi pakai float, bulatkan jadi int lagi


int da = (int) ((float)(mv-ofs_mv) / delta_mv * delta_da);

return constrain(da,0,DA_MAX);
}

Kode 5. Konversi mV ke DA

Proses konversi AD sedikit lebih rumit, karena harus melakukan interpolasi linier multi-segmen. Pelajari bagian
kode sumbernya sebagai berikut:

// Fungsi konversi ad (0-4095) ke mV


int adToMv(int ad) {
// cari index baris pada tabel yang isi AD nya sudah > ad
int idx;
for (idx=1; idx<N_ROW-1; idx++) { if
(tabel[idx][I_AD] >= ad) break;
}

// ambil batas interpolasi linier dari tabel


int ofs_ad = tabel[idx-1][I_AD];
int ofs_mv = tabel[idx-1][I_MV];
int delta_mv = (float)tabel[idx][I_MV]-ofs_mv;
int delta_ad = (float)tabel[idx][I_AD]-ofs_ad;

// konversi ke mV

TF2207/Modul-2/16
int mv = . . .;

return mv;
}
Kode 6. Konversi AD ke mV

Selanjutnya dibanding program sebelumnya, loop pengukuran kini dilakukan dalam mV.

void loop() {
// Header Plot
Serial.println("DA DA(mV) Vi+(mV) AD(mV)");

// loop pengukuran pakai da_mv (mili volt) sesuai batas layak


AD for (da_mv=0; da_mv<=3300; da_mv += 50) {
// tulis ke DA
da_out = mvToDa(da_mv);
dacWrite(AO0, da_out);
delay(10); // tunggu tunak

// baca AD
ad_in = analogRead(AI0);
ad_mv = adToMv(ad_in);

// baca INA
float shunt_mv = ina219.getShuntVoltage_mV();
float bus_v = ina219.getBusVoltage_V();

// konversi bacaan ina ke tegangan (mV)


ina_mv = . . .;

printData();
}

//...
}

Kode 7. Loop pengukuran terkalibrasi

Setelah cukup paham program di atas, cobalah:

a. Isi bagian yang belum lengkap (konversi DA, AD, INA).


b. Jalankan program. Amati luaran pada Serial Monitor.
c. Salin hasilnya ke spreadsheet.
d. Apakah ada data tak sahih di awal dan akhir pengukuran? Jelaskan mengapa tidak sahih, kemudian
buang baris tak sahih tersebut.
e. Hitunglah error antara tegangan yang diinginkan (DA) dengan hasil pengukuran INA maupun
AD. Buatlah grafiknya.
f. Apakah anda dapat mengamati adanya trend error? Jalaskan jika memang ada.
g. Manakah yang lebih dapat dipercaya, hasil DA, INA atau AD ?

TF2207/Modul-2/17
Gambar 2-11 Contoh analisis error

2.6.4 PENGUKURAN OP

Pada prosedur ini, kita akan memanfaatkan hasil program sebelumnya untuk mendapatkan hasil pengukuran
yang sudah terkalibrasi. Perhatikan sekali lagi skema rangkaian, yaitu:
• EScope mengumpan tegangan dari AO0, yang tersambung ke VIN+ dan AI0
• Luaran dari INA VIN- disambung ke R8 (220 Ω) lalu diukur oleh AI1
• R8 disambung ke R9 (220 Ω), diukur oleh DI0
• R9 ke ground

Untuk pengukuran OP ini, dibuat program yang :


• Menerima masukan angka OP dari Serial Monitor (dalam satuan mV).
• Melakukan aksi OP, dan mengeluarkan output ke Serial Monitor berupa tegangan (mV) DA (AI0), VI+,
V1 (AI1), dan V2 (DI0).

Gambar 2-12 Program dengan multi-tab

TF2207/Modul-2/18
Mengingat bahwa program ini cukup kompleks, maka kode sumbernya dipecah menjadi beberapa tab. Arduino
IDE dapat membuat tab ini dengan menggunakan menu “Tab”. Keuntungan menggunakan multitab ini adalah
organisasi kode yang lebih sistematis / berlapis. Dalam hal ini, Arduino IDE akan meng-kompile tab dari awal
(kiri) ke akhir (kanan). Jadi secara lapisan program, letakkan fungsi-fungsi dasar di tab lebih kiri.

Ambillah kode sumber M2-06-OP. Perhatikan bahwa ada 6 tab. Coba simak isinya masing-masing:

• M2-06-OP : file pertama selalu sama dengan nama sketch. Di sini muat library yang diperlukan
program, dan definisikan konstanta dasar.
• 10_escope : berisi fungsi-fungsi dasar escope, seperti sudah dipelajari sebelumnya. Termasuk di
sini adalah tabel kalibrasi dan fungsi konversi.
• 60_serial : fungsi dasar Serial, juga sudah dipelajari sebelumnya.
• 70_data : deklarasi data global, yaitu pin IO dan data pengukuran.
• 71_op : fungsi untuk operasi OP.
• 99_main : program utama berisi setup() dan loop().

Hal yang baru ada di tab 70_data sebagai berikut:

// banyak pin DA
#define N_DA 3

// Pin I/O
int p_ad[N_DA] = {AI0, AI1, DI0};
int p_da = AO0;

// banyak data
pengukuran int ndata=10;

// data pengukuran
int ad_mv[N_DA];
int da_mv;
int ina_mv;
Kode 8. Tab 70_data

Data itu kemudian diolah oleh bagian operasi OP yang ada di tab 71_op. Nampak bahwa isinya adalah satu
fungsi opAction(), sesuai dengan algoritma yang telah dijelaskan.

/*
* Action Operating Condition
*/

void opPrintHeader() {
Serial.println("VDA Vi+ V0 V1 V2");
}

void opPlot() {
char buff[40];
sprintf(buff, "%4d %4d %4d %4d %4d",
da_mv, ina_mv, ad_mv[0], ad_mv[1],
ad_mv[2]); Serial.println(buff);
}

TF2207/Modul-2/19
// Melaksanakan prosedur OP
// Kirim output tertentu ke DA
// lalu ukur dan print ke Serial sebanyak ndata
// lalu hitung rata-rata
void opAction(int op_mv) {

opPrintHeader();

da_mv = op_mv; // simpan op ke data global

// output konstan
dacWriteMv(p_da, da_mv);
delay(100); // tunggu tunak

for (int i=0; i<ndata; i++) {


// baca
ina_mv = inaReadLoadMv();
for(int i=0; i<N_DA; i++) {
ad_mv[i] = analogReadMv(p_ad[i]);
}

// tulis baris
opPlot();
}

// Tambahkan proses hitung rata-rata & stdev


// tampilkan di sini
}

Kode 9. Tab 71_op

Sementara itu tab 99_utama berisi fungsi setup() dan loop(), dengan algoritma yang cukup sederhana.
Cobalah pahami kode sumber tersebut, lalu.

a. Jalankan program tersebut, luncurkan Serial Monitor


b. Pada Serial Monitor, kirim nilai untuk mencoba, misalkan 200.
c. Amati luaran operasi OP ini.
d. Coba salin ke spread sheet
e. Coba lagi nilai yang lain misalkan 1500 dan 3000.
f. Hitung rata-rata dan standar deviasi hasil pengukuran. Apakah menurut anda hasil pengukuran DAC
ESP32 sudah cukup teliti?

2.6.7 PENGUKURAN DC-SWEEP


Pengukuran DC-SWEEP mirip seperti OP, di mana melalui Serial Monitor:

1. Program menampilkan prompt ke user


2. Program menerima masukan 2 angka (mv_awal dan mv_akhir).

TF2207/Modul-2/20
3. Program melakukan operasi DC sweep dan menampilkan hasilnya ke Serial Monitor.
4. Program mengulang dari Langkah 1

Kode sumber untuk pengukuran DC-Sweep ini belum ada. Untuk membuatnya :

• Save-As kode M2-6-OP menjadi M2-7-DC.


• Perhatikan bahwa tab M2-6-OP akan berubah nama menjadi M2-7-DC.
• Gunakan menu tab, tambahkan Tab baru, beri nama 72_dc.
• Tuliskan fungsi-fungsi yang diperlukan untuk operasi DC sweep pada tab tersebut
• Pada tab 99_utama, modifikasi kode loop() untuk menerima input dua angka, dan
kemudian menjalankan operasi dc-sweep.

Cobalah jalankan program yang anda buat.

• Berikan masukan yang sesuai (misalnya 100 3000)


• Salin hasil luarannya ke spreadsheet.
• Coba buat grafiknya untuk laporan.

2. 7 TUGAS TANTANGAN

Pilih salah satu tugas tantangan berikut (tiap orang dalam 1 regu pilih tantangan berbeda), kerjakan dan laporkan
hasilnya

1. Buatlah program agar EScope dapat menjadi VAW Meter (Voltage-Ampere-Watt), menampilkan
pengukuran dengan INA219 ke OLED.

2. Pada program OP, coba tambahkan kemampuan untuk langsung menghitung rata-rata dan standar
deviasi.
3. Pada program DC-Sweep, coba tambahkan kemampuan untuk analisis regresi linier.

2. 8 PUSTAKA

• ADC : https://docs.espressif.com/projects/esp-idf/en/release-
v4.2/esp32s2/api-reference/peripherals/adc.html
• ADC: https://randomnerdtutorials.com/esp32-adc-analog-read-arduino-ide/
• OLED : https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/
• INA219 : https://www.best-microcontroller-projects.com/ina219.html
• INA219: https://diyi0t.com/ina219-tutorial-for-arduino-and-esp/
• Linier Interpolation: https://en.wikipedia.org/wiki/Linear_interpolation
• Linier Regression: https://en.wikipedia.org/wiki/Simple_linear_regression

TF2207/Modul-2/21

Anda mungkin juga menyukai