Anda di halaman 1dari 24

ADC (Analog to Digital Converter)

Mikrokontroler
June 12, 2015 By Dionisius Andi Kristanto ~ Leave a comment
Share to : Google Facebook Twitter Linkedin Print

Gambar 1 Analog Sinyal (www.maxembedded.com)


Sebagaian besar data yang ada di dunia ini merupakan data analog, misalnya: temperatur,
tekanan, tegangan listrik dll. Sebagai contoh temperatur di dalam boiler sebesar 800 C: saat
boiler dinyalakan, temperatur tersebut tidak akan langsung menunjukkan angka 800, tetapi akan
naik secara bertahap dari temperatur normal, 400 C, 500 C hingga mencapai 800 C. Gambar di
atas merupakan contoh dari sinyal analog.
Data analog yang ada akan diproses menggunakan sebuah sinyal prosessing, sebagai input sinyal
analog, akan tetapi pemrosesan sinyal analog, kurang efiisien dikarenakan akurasi nya relatif
kecil, error yang cukup besar dan kecepatan pemrosesan sendiri yang relatif lambat. Sehingga
data analog yang hendak diproses perlu diubah ke data bentuk digital menggunakan Analog to
Digital Converter (ADC).

Gambar 2 Proses pengakuisisian sinyal (www.maxembedded.com)


Proses akuisisi sinyal terdiri dari tiga tahap, pada tahap pertama adalah tahap
pengindraan/sensing, oleh sensor terhadap besaran fisis yang akan di ukur atau diproses secara
lanjut, dimana sensor sendiri adalah sebuah komponen yang mengubah besaran fisis menjadi
besaran elektrik yang dapat berupa tegangan, arus atau hambatan. Sehingga besaran fisis yang
di-sensing akan diubah menjadi besaran elektrik yang masih merupakan sinyal analog. Tahap
kedua adalah tahap konversi sinyal analog menjadi sinyal digital dengan menggunakan Analog
to Digital Converter(ADC), sehingga dihasilkan sinyal digital, pada tahap ketiga sinyal digital
tersebut kemudian menjadi input pada komponen pemrosesan sinyal, dimana komponen yang
sering digunakan sebagai pemrosesan sinyal adalah mikrokontroler (MCU).
Pada mikrokontroler keluarga AVR seri ATMEGA 8/16/32/8535, fitur ADC sudah build in di
dalam chip. Fitur internal ADC inilah yang menjadi salah satu kelebihan mikrokontroler ini jika
dibandingan dengan beberapa jenis mikrokontroler lainnya, sehingga tidak perlu menggunakan
rangkaian ADC eksternal tambahan. Atmega memiliki resolusi ADC 10 bit yang berarti nilai
ADC memiliki rentang nilai 2 pangkat 10 (2^10) = 1024. Hal tersebut artinya ADC akan
memiliki rentang nilai antara 0 hingga 1024. Selain itu, resolusi ADC juga dapat menggunakan
ADC 8 bit dan Jika ADC 8 bit, maka nilai ADC nya adalah 2^8.
Dengan 8 channel (PA0 PA7), rangkaian internal ADC memiliki catu daya tersendiri yaitu pin
AVCC. Dimana fitur lebih lengkapnya dapat dilihat pada gambar berikut :

10 bit Resolution

5 LSB Integral Non-Liniearity

2 LSB Absolute Accuracy

13 260 s Conversion Time

Up to 15 kSPS at maximum Resolution

8 Multiplexed Single Ended Input Channels

7 Differential Input Channels with Optional Gain of 10x and 200x

Optional left adjustment for ADC result Readout

0 Vcc ADC input Voltage Range

Selectable 2.56V ADC reference Voltage

Free running or Single Conversion Mode

ADC Start Conversion by Auto triggering on Interrupt Sources

Interrupt on ADC Conversion Complete

Sleep Mode Noise Canceler

Rumus konversi nilai sinyal analog menjadi besarnya tegangan dengan nilai ADC adalah sebagai
berikut :

Rumus ADC
Pada rumus di atas, System voltage merupakan besarnya tegangan input ADC atau AVCC.
Sebagai contoh, jika sistem kita menggunakan tagangan 5V , menggunakan resolusi ADC 10 bit
dan tegangan analog sebesar 2.12V, maka berapakah nilai ADC?

Berikut ini adalah salah satu contoh aplikasi dari fitur ADC yang paling sederhana, yaitu
mengubah pembacaan nilai tegangan analog input menjadi nilai data digital atau nilai ADC
dimana tegangan analognya berasal dari potensiometer yang dirangkai sebagai pembagi
tegangan. Jika potensiometer diputar maka nilai tegangan akan berubah, dalam artian semakin
kecil atau semakin besar itu tergantung dari rangkaian pembagi tegangan yang dibuat, sehingga
nilai ADC yang terbaca dan ditampilkan ke LCD juga akan berubah. Mikrokontroler yang
digunakan adalah ATMEGA16 dengan rangkaian sebagai berikut:

Gambar 3 Rangkaian ADC pada Proteus


Pada aplikasi ADC ini digunakan compiler Codevision AVR, dimana untuk mengaktifkan fitur
ADC menggunakan codevison AVR ini adalah dengan memberi tAnda centang pada ADC
enabled seperti pada gambar di bawah ini:

ADC merupakan singkatan dari Analog-to-Digital Converter. Dari asal katanya, ADC
merupakan suatu alat yang digunakan untuk mengubah sinyal-sinyal analog menjadi sinyal
digital. Sinyal analog perlu diubah menjadi sinyal digital dengan tujuan agar sinyal tersebut
dapat diolah, terutama menggunakan komputer digital. Sinyal analog adalah sinyal-sinyal yang
umumnya terdapat di alam, misalnya tegangan listrik, temperatur, kelembaban, intensitas cahaya,
dan sebagainya, yang secara alami sinyal-sinyal tersebut bersifat analog. Salah satu ciri sinyal
analog adalah sifatnya yang kontinu dan dapat bervariasi terhadap waktu.
Tidak seperti sinyal analog, nilai digital yang diperoleh melalui ADC tidak bersifat kontinu.
Sinyal analog akan dicuplik dengan nilai waktu tertentu, yang dikenal sebagai frekuensi
sampling. Amatilah Gambar 1 berikut. Sinyal yang berwarna hijau adalah salah satu bentuk
sinyal analog, asumsi misalnya sinyal tersebut bervariasi dari 0 - 5 Volt. Titik-titik kuning di
sepanjang sinyal berwarna hijau menunjukkan waktu saat sinyal analog tersebut dicuplik untuk
menjadi sinyal digital. Misalnya, pada titik pertama bernilai 2,1 Volt, titik kedua 2,8 Volt, titik
ketiga 2,3 Volt, dan seterusnya. Jumlah dari semua titik yang diperoleh dalam satu detik dikenal
sebagai frekuensi sampling.

arduino_big_sampling.png

Gambar 1. Sinyal Analog dan Rentang Sampling


Baca juga: Penggunaan Detak (Clock) dan Prescaler Pada Proses Sampling

Sudah tentu, ketika semakin banyak suatu sinyal analog dicuplik, maka hasil sinyal digital akan
semakin akurat. Amatilah Gambar 2 berikut. Sinyal analog dicuplik dengan resolusi cuplik 3-bit
(2^3 = 8 variasi) dan 16-bit (2^16 = 65.536 variasi). Terlihat perbedaan yang jelas dari kedua
pencuplikan tersebut, seperti yang terlihat pada Gambar 2.

arduino_sampling2.png

Gambar 2. Perbedaan Sinyal yang Dicuplik dengan Resolusi 3-bit dan 16-bit

Visualisasi data memainkan peranan yang sangat penting dalam analisis keteknikan. Bagaimana
sistem berjalan, bagaimana hasil yang dicapai, serta apa tindakan selanjutnya dalam
memperbaiki sistem sangat dipengaruhi oleh visualisasi terhadap data. Visualisasi data juga
berperan dalam proses simulasi, yaitu tahapan untuk memodelkan suatu sistem sebelum sistem
tersebut secara nyata diimplementasikan.
Pada ulasan sebelumnya, kita telah membahas bagaimana menampilkan data secara 'real-time'
menggunakan MATLAB. Tutorial ini dapat digunakan sebagai acuan untuk ulasan kali ini. Bagi
yang belum membaca, bisa disimak di halaman berikut.
Pada ulasan ini, kita akan membahas bagaimana ploting dua data secara simultan dan real-time
dilakukan. Data dari Arduino akan dikirim dan selanjutnya akan divisualisasikan menggunakan
MATLAB. Istilah simultan dalam pengertian ini tidaklah benar-benar simultan dalam arti yang
sebenarnya. Terdapat beberapa alasan. Alasan pertama adalah ADC pada Arduino bekerja secara
bergiliran. Satu buah ADC pada Arduino, misalnya Arduino UNO, dapat melayani 6 channel.
Jika kita menggunakan semua channel tersebut, maka keenam channel ini dilayani secara
bergiliran. Keenam channel tersebut akan memasuki sebuah rangkaian multiplekser, yaitu suatu
rangkaian yang berguna untuk memilih channel mana yang akan dilayani oleh ADC untuk
selanjutnya dilakukan konversi. Alasan berikutnya mengapa tidak benar-benar simultan adalah
data dikirim secara serial. Data akan dikirim byte-per-byte, bukan secara bersamaan seperti
halnya komunikasi secara paralel.
Istilah real-time juga tidak merujuk benar-benar terjadi disaat itu. Hal ini terjadi sebab
dibutuhkan waktu bagi sistem untuk mengambil data dari Arduino, melakukan konversi oleh
ADC, dan baru selanjutnya dikirim secara serial menuju PC untuk diolah dan ditampilkan oleh
MATLAB. Namun demikian, untuk tujuan yang bersifat praktis, misalnya membaca nilai suatu
sensor (sensor suhu, kelembaban, membaca nilai dari potensiometer, dan sebagainya), maka hasil
ulasan ini mungkin bisa dikatakan sebagai suatu sistem yang 'simultan' dan 'real-time'.
Mari kita kembali menggunakan Arduino sebagai signal generator. Kita akan bangkitkan dua
jenis gelombang, yaitu gelombang sinus dan gelombang kosinus. Dua jenis gelombang ini akan
dikirim ke MATLAB untuk ditampilkan. Mari kita simak koding pada Arduino, sebagai berikut:
?
1

double x;

2
3

void setup() {

4
//kecepatan komunikasi serial

Serial.begin(9600);

x = 0;

8
9

void loop() {

10

Serial.flush();

11

Serial.println(sin(x));

12

//Tunggu sebentar utk komunikasi serial

13

delay(50);

14

Serial.flush();

15

Serial.println(cos(x));

16

//Tunggu sebentar utk komunikasi serial


delay(50);

17

x += .05;

18

if(x >= 2*3.14)

19
20

x = 0;
}

21

Untuk koding MATLAB, bisa dilihat seperti berikut :


?
1 clear
2 clc
3
4 %Inisialisasi serial dan grafik
5
6

serialPort = 'COM33';

% isi dgn COM yg sesuai

judulGrafik = 'Logger Data Serial';

% Judul grafik

7 xLabel = 'Waktu (detik)';

% x-axis label

8 yLabel = 'Data';

% y-axis label

9 plotGrid = 'on';

% aktifkan grid

1
0 max = 2;

min = -2;

% minimum axis-y

1 lebarScroll = 20;
1

% display data pada grafik

% maksimum axis-y

delay = .01;

% waktu cuplik

1
2
%Inisialisasi variabel

1
3 waktu = 0;
1 data = 0;
4

cacah = 0;

1
5
%Persiapkan grafik

1
6 plotGraph = plot(waktu,data,'o',...
1
7

'LineWidth',1,...
'MarkerSize',3,...

1
8

'MarkerEdgeColor','k',...
'MarkerFaceColor','r');

1
9

2 title(judulGrafik,'FontSize',15);
0
xlabel(xLabel,'FontSize',12);

2 ylabel(yLabel,'FontSize',12);
1
axis([0 10 min max]);

2
2 grid(plotGrid);
2
3
2

%aktifkan grid

%Buka komunikasi melalui port COM

4 s = serial(serialPort);
2 disp('Tutup jendela grafik untuk mengakhiri logger');
5 fopen(s);
2
6
tic

%aktifkan deteksi waktu

2
7 while ishandle(plotGraph)
2
8

nilaiInput = fscanf(s,'%f');

%Terus looping semasih plot aktif

%Baca data serial dalam format float

2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6

%Pastikan data yg diterima benar


if(~isempty(nilaiInput) && isfloat(nilaiInput))
cacah = cacah + 1;
waktu(cacah) = toc;

%ambil waktu saat ini

data(cacah) = nilaiInput(1);

%ambil data saat ini

cekWarna = mod(cacah,2);

%Set Axis sesuai dengan nilai lebarScroll


if(lebarScroll > 0)
set(plotGraph,'XData',waktu(waktu > waktu(cacah)-lebarScroll), ...
'YData',data(waktu > waktu(cacah)-lebarScroll));
axis([waktu(cacah)-lebarScroll waktu(cacah) min max]);

3
7

else

3
8

axis([0 waktu(cacah) min max]);

set(plotGraph,'XData',waktu,'YData',data);

end

3
9
4
0

%Beri waktu sesaat utk Update Plot

4
1

pause(delay);

4
2
4
3

end
end

4 % Tutup serial port dan delete variabel yg sudah terpakai


4
fclose(s);

4
clear all;
5
4
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5

disp('Logger berakhir...');

7
5
8
5
9
6
0
6
1
6
2
6
3
6
4
6
5
6
6
6
7
6
8
6
9

Penjelasan secara detail sudah kita bahas pada ulasan sebelumnya. Namun demikian, bagi yang
belum membaca, bisa menyimak detail berikut:
serialPort = 'COM33';

Pertama-tama, pastikan kita memilih nomer port yang sesuai. Kita dapat melihat port mana yang
digunakan pada Device Manager. Pada ulasan ini, port yang terdeteksi di komputer saya adalah
COM33.
lebarScroll = 10;

digunakan untuk menampilkan lebar grafik yang akan ditampilkan. Nilai ini dapat disesuaikan

dengan keinginan kita. Jika kita set lebarScroll = 0; maka grafik akan menampilkan keseluruhan
nilai ploting.
s = serial(serialPort);

Buatlah variabel dengan nama s pada MATLAB. Dalam sintaks ini, serialPort yang berada
dalam tanda kurung berarti COM33
fopen(s);

Agar dapat menerima dan mengirim data, maka serial port harus kita buka terlebih dahulu.
nilaiInput = fscanf(s,'%f');

Kita menyertakan %f untuk memberitahu MATLAB bahwa data harus disimpan dalam format
float. Jika tidak, maka data akan disimpan dalam format char.
Baca juga: [TUTORIAL - Ubuntu Server] PHP & NMAP Based Automated Shutdown
Berdasarkan Jumlah Host Hidup Pada Jaringan
fclose(s);

Ketika jendela grafik ditutup, pastikan kita juga menutup komunikasi serial. Jika tidak, port akan
tetap terbuka, dan tidak bisa dipakai untuk keperluan lain. Jika tidak, ketika kita me-run kembali
program, maka akan error dan mengatakan bahwa port sedang dipakai. Dalam kasus ini, kita
harus menutup MATLAB dan me-restart ulang lagi.
Hasil yang ditampilkan oleh program tersebut adalah seperti pada gambar di bawah ini. Terlihat
bahwa gelombang sinus dan kosinus diplot secara 'simultan' dan 'real-time'.

plotingsimultan.png

Mari kita modif sedikit program kita. Misalnya saat ini kita tambahkan sebuah potensiometer
pada PIN A0 (amatilah gambar di bawah ini). Namun, disaat yang sama, Arduino masih
membangkitkan gelombang sinus. Karena ADC pada Arduino (saat ini kita menggunakan
Arduino UNO) memiliki resolusi 10-bit, maka nilai maksimum yang bisa diperoleh adalah 2^10
-1 = 1023. Karena gelombang sinus memiliki nilai antara -1 dan 1, maka gelombang sinus ini
akan dikalikan dengan 1023 untuk memperoleh hasil yang lebih proporsional.

potensiometer.png

Koding Arduino yang kta gunakan untuk keperluan ini, adalah sebagai berikut:
?
1

double x;

2
3

void setup() {

//kecepatan komunikasi serial

Serial.begin(9600);
x = 0;

6
7

8
9
10

void loop() {
Serial.flush();
Serial.println(1023*sin(x));

11
12
13

//Tunggu sebentar utk komunikasi serial


delay(50);
int nilaiSensor = analogRead(A0);

14
15
16
17
18
19

Serial.flush();
Serial.println(nilaiSensor);
//Tunggu sebentar utk komunikasi serial
delay(50);
x += .05;
if(x >= 2*3.14)

20

x = 0;

21 }
22

Untuk bagian MATLAB, yang perlu kita ubah hanyalah nilai maksimum dan minimum sumbu-y,
yaitu pada bagian:
min = -1024;
max = 1024;

Nilai koding MATLAB selengkapnya bisa dilihat seperti berikut:


?
1 clear
2 clc
3
4 %Inisialisasi serial dan grafik
5
6
7
8
9

serialPort = 'COM33';

% isi dgn COM yg sesuai

judulGrafik = 'Logger Data Serial';

% Judul grafik

xLabel = 'Waktu (detik)';

% x-axis label

yLabel = 'Data';

% y-axis label

plotGrid = 'on';

% aktifkan grid

min = -1024;

% minimum axis-y

1
max = 1024;
0
1

lebarScroll = 20;

% maksimum axis-y
% display data pada grafik

1 delay = .01;
1
2

% waktu cuplik

%Inisialisasi variabel

1 waktu = 0;
3
data = 0;

1
4 cacah = 0;
1
5

%Persiapkan grafik

1 plotGraph = plot(waktu,data,'o',...
6
'LineWidth',1,...

1
7

'MarkerSize',3,...
'MarkerEdgeColor','k',...

1
8

'MarkerFaceColor','r');

1
9
title(judulGrafik,'FontSize',15);

2
0 xlabel(xLabel,'FontSize',12);
ylabel(yLabel,'FontSize',12);

2
1 axis([0 10 min max]);
2 grid(plotGrid);
2

%aktifkan grid

2
3 %Buka komunikasi melalui port COM
s = serial(serialPort);

2
4 disp('Tutup jendela grafik untuk mengakhiri logger');
2 fopen(s);
5
2
6 tic

%aktifkan deteksi waktu

2 while ishandle(plotGraph)
7

%Terus looping semasih plot aktif

2
8

nilaiInput = fscanf(s,'%f');

%Baca data serial dalam format float

2
9
3
0

%Pastikan data yg diterima benar


if(~isempty(nilaiInput) && isfloat(nilaiInput))

3
1

cacah = cacah + 1;

3
2

waktu(cacah) = toc;

%ambil waktu saat ini

data(cacah) = nilaiInput(1);

%ambil data saat ini

cekWarna = mod(cacah,2);

3
3
3
4

%Set Axis sesuai dengan nilai lebarScroll


if(lebarScroll > 0)

3
5

set(plotGraph,'XData',waktu(waktu > waktu(cacah)-lebarScroll), ...


'YData',data(waktu > waktu(cacah)-lebarScroll));

3
6

axis([waktu(cacah)-lebarScroll waktu(cacah) min max]);

3
7

else

3
8

axis([0 waktu(cacah) min max]);

set(plotGraph,'XData',waktu,'YData',data);

end

3
9
%Beri waktu sesaat utk Update Plot

4
0

pause(delay);

4
1
4
2 end

end

4
3 % Tutup serial port dan delete variabel yg sudah terpakai
4

4 fclose(s);
4 clear all;
5 disp('Logger berakhir...');
4
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7
5
8
5
9
6

0
6
1
6
2
6
3
6
4
6
5
6
6
6
7
6
8
6
9

Hasil yang diperoleh ketika potensiometer diputar-putar, namun disaat yang bersamaan Arduino
masih membangkitkan gelombang sinus adalah sebagai berikut:

plotingsimultan2.png

Untuk percobaan selanjutnya, kita dapat menempatkan beberapa sensor di masing-masing pin
ANALOG INPUT pada Arduino. Demikian, semoga ulasan ini bermanfaat. Terima kasih.

Fitur dan Cara Kerja IC LM 393


---- Catatanya Didit ( diditnote.blogspot.com )---IC Komparator atau IC pembanding adalah sebuah IC yang berfungsi untuk
membandingkan dua macam tegangan yang terdapat pada kedua inputnya.
Komparator memiliki 2 buah input dan sebuah output. Inputnya yaitu input(+) dan
input (-). LM 393 dalam satu kemasannya mempunyai dua buah komparator
didalamnya. IC komparator LM 393 memiliki fitur-fitur sebagai berikut:
a. Dapat bekerja dengan single supply 2V sampai 36V
b. Dapat bekerja dengan tegangan input -3V sampai +36V
c. Dapat bekerja dengan segala macam bentuk gelombang logic
d. Dapat membandingkan tegangan yang mendekati ground.

Dalam aplikasinya output dari komparator LM 393, membutuhkan resistor pullup


dengan tegangan V+ yaitu untuk menjaga tegangan output supaya memiliki logika
satu ketika kondisi diam.
Cara kerja komparator :
Komparator bekerja berdasarkan tegangan yang masuk pada kedua pin inputnya
1. Jika tegangan pada pin(+) lebih besar pada tegangan pin(-) maka output
komparator akan bergerak kearah V+
2. Jika tegangan pada pin(+) lebih kecil pada tegangan pin(-) maka output
komparator akan bergerak kearah Vdalam aplikasinya biasanya salah satu pin input
dari komparator sebagai tegangan reverensi sedangkan pin input lainya sebagai
tegangan yang akan dibandingkan.

Sensor Getar ini dapat digunakan untuk mendeteksi getaran (alarm). Bisa digunakan sebagai
alarm motor / mobil / jendela / pintu rumah.
Spesifikasi modul:

Menggunakan sensor SW-420 normally closed

Sinyal output comparator bersih, bergelombang bagus dan mampu menghantar lebih dari
15mA

Tegangan kerja 3.3V - 5V

Format output: 0 dan 1 (digital, rendah dan tinggi)

Dilengkapi lubang baut untuk instalasi

Papan PCB kecil berukuran 3.2cm x 1.4cm

Memakai comparator LM393

Cara kerja modul:

1. Bila tidak ada getaran, sensor getaran terhubung dan nilai output rendah. Lampu
indicator menyala.

2. Bila terdeteksi getaran, sensor getaran segera terputus dan nilai output tinggi. Lampu
indicator tidak menyala.

3. Outputnya dapat langsung dihubungkan ke microcontroller untuk mendeteksi nilai


rendah dan tinggi sehingga dapat diketahui apakah sedang terjadi getaran.
o Availability: 10
o Model: SW-420

Gempa bumi adalah suatu guncangan yang cepat di bumi disebabkan oleh
patahan atau pergeseran lempengan tanah di bawah permukaan bumi.
Kebanyakan gempa bumi terjadi di perbatasan antara pertemuan dua
lempengan. Setiap hari terjadi puluhan bahkan ratusan gempa bumi di muka
bumi ini, hanya saja kebanyakan kekuatannya kecil sekali sehingga tidak
terasa oleh kita. Ada tiga gelombang gempa yaitu :
1. Gelombang longitudinal yaitu gelombang gempa yang merambat dari
sumber gempa ke segala arah dengan kecepatan 7 - 14 km per detik.
Gelombang ini pertama dicatat dengan seismograf dan yang pertama kali
dirasakan orang di daerah gempa, sehingga dinamakan gelombang primer.
(gelombang longitudinal)

2. Gelombang Transversal yaitu gelombang yang sejalan dengan gelombang


primer dengan kecepatan 4 - 7 km per detik, dinamakan juga gelombang
sekunder.

Anda mungkin juga menyukai