Anda di halaman 1dari 24

MODUL III

INTERUPSI

3.1 Tujuan
Praktikum ini mempelajari teknik interupsi pada mikroprosesor. Kompetensi khusus yang
akan dikuasai adalah:

Percobaan
No Kompetensi
1 2 3
1 Rangkaian sensor opto-coupler X X X
2 Algoritma mengukur frekuensi X
3 Algoritma mengukur frekuensi dengan interupsi X
4 Algoritma mengukur periode dengan interupsi X

3.2 Alat dan Bahan


Untuk praktikum ini, diperlukan alat dan bahan sebagai berikut:
No Nama Jumlah No Nama Jumlah
1 Komputer / Laptop 1 1 Kit Induk 1
2 Arduino + Kabel USB 1 2 Kit 7 Segment 1
3 Power Supply 12V 1 3 Kit Motor 1
4 Multimeter 1 4 Kabel IDC 3

3.3 Teori
Dalam praktikum sebelumnya, kita telah bisa mengatur kecepatan motor dengan PWM,
serta mengukur dayanya melalui resistor sense. Meski demikian, laju putaran motor yang
sebenarnya masih blm diketahuia. Pada praktikum ini kita akan memakai kit motor DC
yang sama, dimana diagram blok-nya nampak pada Gambar 3.1. Bagian baru yang akan
dipelajari adalah rotary encoder, untuk mengukur kecapatan motor DC melalui digital
input (DI) / interrupt.

Ada dua versi kit yang akan dipakai, yaitu versi 2013 dan versi 2015. Blok-blok keduanya
sama, namun ada perbedaan besar dalam koneksi pin arduinonya seperti diberikan pada
Tabel 3.1. Pada kit 2013, sinyal dari rotary encoder masuk ke pin D3. Sementara itu pada
kit 2015, ada sebuah jumper pemilih, agar sinyal masuk ke pin D2 atau A5.

Laboratorium TF II III-1
Gambar 3.1. Blok diagram kit Motor DC

Tabel 3.1. Daftar koneksi kit Motor DC ke pin arduino

Pin Arduino
Blok I/O Jenis Kit 2013 Kit 2016
Pembagi Tegangan tegangan AI A5 A0
Motor Driver enable PWM D6 -
Input 1 DO/PWM D5 D3
Input 2 DO D4 A1
Pengukur Arus tegangan AI A4 A3
Tacho Meter tegangan AI A2 A5
Rotary Sensor pulsa DI / interrupt D3 D2
Switch tegangan DI D2 A2

3.3.1 Rotary Encoder


Seperti nampak pada Gambar 3.2, sensor rotary encoder berupa sebuah baling-baling yang
berputar di celah antara sebuah opto-coupler. Opto coupler terdiri atas sebuah LED
inframerah (TX) dan sebuah photo-transistro (RX). Ketika baling-baling memotong cahaya
dari TX ke RX, maka rangkaian sensor akan memberi luaran 1, dan sebaliknya luarannya
akan 0 jika cahaya tak terpotong. Dengan demikian akan timbul sinyal pulsa HIGH setiap
kali cahaya terhalangi.

Gambar 3.2 Sistem pengukur kecepatan motor dengan opto-coupler

Laboratorium TF II III-2
Opto-coupler harus dipasang pada suatu rangkaian pull-up seperti pada Gambar 3.3.
Nampak bahwa LED TX dari optocoupler akan memancarkan cahaya ke photo-transistror
RX. Ketika menerima cahaya, maka photo-transistor akan tersambung dan sebaliknya akan
putus jika tak menerima cahaya. Transistor ini kemudian diberi trimpot sebagai resistor
pull-up, dimana harga trimpot sebaiknya diatur agar sama dengan tahanan dalam transistor
dalam keadaan terputus.

Gambar 3.3 Rangkaian opto-coupler

Sebagai ilustrasi, sinyal yang akan dibangkitkan opto-coupler akan nampak seperti pada
Gambar 3.3. Waktu antar pulsa (T1 ... Tn) adalah periode putaran baling-baling. Semakin
cepat baling-baling berputar, periode ini makin pendek, sehingga dalam satu selang waktu
tertentu (Tw), jumlah pulsa akan makin banyak.

Gambar 3.4. Ilustrasi sinyal luaran opto-coupler

Sinyal ini kemudian diumpankan ke digital input (DI) arduino, sehingga dapat diuji dengan
program sederhana berikut :
// Kode 3.1 : Membaca Masukan Opto-coupler
#define PIN_OPTO 3

void setup() {
Serial.begin(115200);
pinMode(PIN_OPTO, INPUT);
}

void loop() {
byte data=digitalRead(PIN_OPTO);
Serial.print(data);
delay(500);
}

Kode 3.1. Membaca Masukan Opto-coupler

Laboratorium TF II III-3
3.3.2 Interupsi
Interupsi adalah fitur yang memungkinkan mikroprosesor untuk :

• Mendeteksi adanya picuan (trigger) pada masukan digital.

• Jika picuan muncul, seketika itu juga aliran program normal akan dihentikan.

• Microprocessor memanggil suatu rutin kecil, interrupt service routine, untuk


berjalan. Rutin ini harus menyelesaikan tugas secepat-cepatnya, lalu return.

• Program normal akan dilanjutkan kembali.

Menerima sinyal dari opto-coupler dengan interupsi akan jauh lebih andal dibandingkan
membacanya memakai digitalRead biasa. Contoh kode sumbernya akan diberikan dibawah
ini. Sebelum mempelajarinya, perhatikan beberapa hal berikut:

• Arduino Uno/Duemilanove/Nano bisa menerima interupsi dari 2 pin masukan


digital yaitu interupsi 0 dari pin D2 dan interupsi 1 dari pin D3.

• Ada tiga jenis picuan yakni RISING (berubah dari LOW ke HIGH), FALLING
(berubah dari HIGH ke LOW), dan CHANGE (gabungan raising dan falling).

• Rutin interupsi harus dibuat sebagai suatu fungsi void tersendiri. Dalam hal ini
diberi nama taskOpto.

• Jika rutin interupsi perlu mengakses variabel global (dalam hal ini count), maka
variabel tersebut harus dideklarasikan sebagai volatile.

• Agar rutin interupsi siap beraksi, maka setup() harus memasangnya dulu dengan
fungsi attachInterrupt.

• Jika di bagian rutin normal (loop dan semua fungsi yang terpanggil oleh loop) akan
mengakses variabel global, maka harus dipastikan bahwa saat itu interupsi tidak
boleh terjadi. Untuk itu gunakan fungsi noInterrupts() dan interrupts().

Silahkan baca referensi Arduino untuk memahami volatile, attachInterrupt, noInterrups dan
interrupts.

Untuk memrogram interupsi, biasanya dipakai algoritma foreground-background seperti


pada Gambar 3.5. Nampak di sini :

• Rutin normal arduino (setup dan loop) berjalan sebagai background, yaitu proses
prioritas rendah yang bisa di-interupsi kapan saja. Seperti biasa, rutin ini disarankan
memakai algoritma event-driven (jalankan aksi bisa ada event).

Laboratorium TF II III-4
• Rutin interupsi (dalam hal ini INT Opto) berjalan sebagai foreground, yaitu proses
prioritas tinggi yang akan dijalankan kapan saja jika ada picuan interupsi.

• Antara foreground dan background, ada suatu buffer untuk saling bertukar data.

Gambar 3.5. Algoritma Foreground-Background

3.4 Latihan
Untuk latihan interupsi, buatlah rangkaian Gambar 3.6 pada protoboard. Rangkaian ini
terdiri atas:
• Rangkaian tombol (S1) yang diberi resistor pull-down (R2). Rangkaian ini diberi
tambahan sebuah kapasitor (C1) sebagai debouncer. Luaran rangkaian
dikoneksikan ke pin D2 Arduino.
• Rangkaian LED dengan resistor R1, dikoneksikan ke pin D3.

Laboratorium TF II III-5
Gambar 3.6. Rangkaian Latihan Interupsi

3.4.1 Interupsi Dengan Input Tombol (Tugas Awal)


Sebagai latihan pertama, kita akan mencoba tiga mode interupsi. Berikut ini adalah contoh
program interupsi memakai algoritma foreground-background..
// Kode 3.2 : Uji Opto-coupler dengan Interupsi

/* DEKLARASI *************/
#define PIN_INT 2
#define PIN_LED 3

#define INT_CHANNEL 0
#define INT_MODE RISING

/* IMPLEMENTASI *********/

// data yang akan diubah oleh task interupsi


// dan dibaca oleh rutin biasa (setup dan loop)
// Harus volatile
volatile word cacah=0;
volatile boolean nyala=false;

// task interupsi, menaikkan count setiap terpanggil


void taskCounter() {
cacah++; // naikkan cacahan
nyala = !nyala; // balikkan kondisi nyala
digitalWrite(PIN_LED, nyala);
}

void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_INT, INPUT);

// pasang task interupsi


attachInterrupt(INT_CHANNEL, taskCounter, INT_MODE);
}

word cacah_lama=0; // menyimpan harga counter terakhir

Laboratorium TF II III-6
void loop() {
word cacah_baru;
// membaca interupsi dengan aman
nointerrupt(); // cegah interupsi terjadi
cacah_baru = cacah; // baca dari variabel global
interrupt(); // bolehkan interupsi lagi

// periksa event dan jalankan aksi


if (cacah_baru != cacah_lama) {
Serial.println(cacah_baru);
cacah_lama = cacah_baru;
}
}

Kode 3.2. Uji Opto-coupler dengan Interupsi


Ketik dan jalankan program tersebut, lalu hidupkan Serial monitor. Tekanlah tombol agal
lama, kemudian lepaskan, seraya amati luaran LED dan serial monitor. Cobalah beberapa
kali. Setelah itu edit program untuk INT_MODE yang lain, yakni FALLING, dan
CHANGE. Cobalah lagi dan amati perbedaan nyala LED dan pesan di serial monitor
antara ketiga mode tersebut.

3.5 Aplikasi
Pada rotary encoder, ada dua kemungkinan mode pengukuran yakni :

• Mengukur banyaknya pulsa dalam satu selang waktu tertentu (pulsa / WAKTU).
Lama waktu ini sering disebut Time Gate. Jika ingin mengukur RPS (revolution per
second), maka sebaiknya Tgate diatur 1000 mili detik.

• Mengukur lamanya waktu untuk jumlah pulsa tertentu (waktu/PULSA).

Mode mengukur banyak pulsa/waktu lebih bagus dipakai untuk putaran cepat, sementara
metode kedua untuk putaran lambat. Berikut ini dua mode pengukuran yang akan
dilakukan pada praktikum kali ini.

3.5.1 Pengukuran Frekuensi Teknik Pooling


Pengukuran frekuensi adalah menghitung jumlah pulsa selama waktu tertentu. Lama waktu
penghitungan ini disebut Tgate (Setara Tw pada Gambar 3.4). Jika Tgate dinyatakan dalam
mili detik, maka rumus konversi ke satuan RPM atau RPS akan menjadi:

pU
F= (3.1)
T gate

dimana :

Laboratorium TF II III-7
F = frekuensi putaran dalam RPM / RPS

p = cacahan pulsa

U = unit, 60.000 untuk RPM, 1.000 untuk RPS

Program untuk mengukur periode tersebut pada dasarnya menggunakan algoritma event-
driven. Agar lebih jelas, kali ini dijelaskan dengan diagram alir seperti Gambar 3.4.
Nampak di sini bahwa sistem ada sebuah variabel pulse yang akan mencatat banyaknya
pulsa yang telah terbaca dari opto-coupler. Pada loop utama, setiap terjadi pulsa maka
intOpto akan menaikkan cacahan pulse.

Gambar 3.7. Diagram Alir pengukuran frekuensi dengan teknik pooling

Sementara itu akan ada taskFrequency berjalan secara periodik sesuai PERIODE_GATE
(sebagai Tgate), untuk menghitung RPS sesuai rumus 3.1 dan kemudian me-reset cacahan
pulse menjadi nol lagi. Beginilah programnya:
// Kode 3.3 : Pengukuran Frekuensi Teknik Pooling

#define PERIODE_DISPLAY 5
#define PERIODE_GATE 1000

// unit menghitung frekuensi dalam RPS (1000 ms)


#define F_UNIT 1000L

// Pemetaan Port arduino


#define BUTTON1 ...
#define OPTO ...

Laboratorium TF II III-8
// Pemetaan Port untuk memutar motor seperti praktikum sebelumnya
// BCD, T1, T2, MOTOR_INPUT1, MOTOR_INPUT2,
// MOTOR_ENABLE untuk kit 2013

// fungsi-fungsi standard
boolean s1IsPressed() { ... }
void writeDigit(int bcd){ ... }
void writeDigit3(int data) { ... }
void shiftDigit() {...}

// fungsi memeriksa apakah ada pulsa dari opto-coupler


// mirip seperti memeriksa tombol
boolean optoIsFired() {
static boolean b1_old = 1;
boolean b1 = .................;
boolean s1 = (b1 && !b1_old);
b1_old = b1;
return s1;
}

//variabel global
long tdisplay, tgate;
long pulse;
int pwm;

void setup() {
Serial.begin(115200);
Serial.println("Pengukuran Frekuensi teknik pooling");
// inisialisasi mode pin
// ............

// Inisialisasi shift register


// .....

// Inisialisasi INPUT1 dan INPUT2 motor driver


// ........

// inisialisasi variabel global


tgate = tdisplay = millis();
pulse = 0;
pwm = 255;
}

// Task yang dipangil bila S1 ditekan


// untuk menurunkan pwm secara step
void taskButton() {
pwm = pwm - (256/16);
if (pwm < 0) pwm = 255;
analogWrite(............, pwm);
}

// Task yang dipanggil bila opto terdeteksi


// akan menaikkan cacahan pulse
void taskOpto() {
pulse++;
}

Laboratorium TF II III-9
// Task dipanggil setiap Tgate
// untuk menghitung frekuensi
void taskFrequency(long ms) {
// hitung selang waktu tw
// harusnya selalu ms selalu sama dengan tgate
// tapi bisa saja terlambat, sehingga perlu dihitung lagi
long tw = PERIODE_GATE + (ms - tgate);

// hitung frekuensi
int freq = ...................... ; // lihat persamaan (3.1)

// tampilkan ke 7 segment
writeDigit3(freq);

// untuk membandingkan, kirim ke serial


// pwm tw pulse freq
Serial.print(pwm);
Serial.print(" ");
Serial.print(tw);
Serial.print(" ");
Serial.println(pulse);
Serial.print(" ");
Serial.println(freq);

// reset cacahan
pulse = 0;
}

// task menampilkan bacaan 7 segment


void taskDisplay() {
............;
}

// loop utama
void loop() {
long ms = millis();
if (.............) {
taskOpto();
}
else if (.. .. .....) {
taskFrequency(ms);
tgate = tgate + PERIODE_GATE;
}
else if (.............) {
taskButton();
}
else if (.. .. ........) {
taskDisplay();
tdisplay = tdisplay + PERIODE_DISPLAY;
}
}
Kode 3.3. Pengukuran Frekuensi Teknik Pooling
Pada kode 3.4, adanya pulsa dari opto coupler diperiksa dengan cara membaca masukan
(digital input) secara terus menerus (dalam subrutin loop). Teknik ini disebut pooling.

Laboratorium TF II III-10
Kelemahan teknik ini adalah, ada kemungkinan pulsa tidak sempat terbaca karena program
sedang sibuk mengerjakan berbagai task.

3.5.2 Pengukuran Frekuensi Putaran Motor DC dengan Interupsi


Untuk menanggulangi kelemahan teknik pooling, perangkat keras mikroprosesor
menyediakan fasilitas interupsi. Dengan interupsi, suatu subrutin kecil dapat berjalan atas
picuan masukan sinyal dari port tertentu. Saat rutin interupsi dijalankan, maka program
normal akan dihentikan seketika, dan nanti dilanjutkan kembali setelah rutin interupsi
selesai.

Gambar 3.8. Skema program pengukur frekuensi dengan interupsi

Dengan interupsi, skema program untuk menghitung frekuensi menjadi seperti Gambar
3.5. TaskOpto kini tidak lagi dijalankan oleh loop secara event-driven, namun akan
berjalan begitu terjadi interupsi, akibat adanya pulsa dari opto-coupler di pin D3.
Perhatikan beberapa hal berikut:

• Arduino Uno/Duemilanove bisa menerima 2 masukan interupsi yaitu interupsi 0


dari pin D2 dan interupsi 1 dari pin D3.

• Rutin interupsi harus dibuat sebagai suatu fungsi void tersendiri. Dalam hal ini
diberi nama taskOpto.

• Jika rutin interupsi perlu mengakses variabel global (dalam hal ini count), maka
variabel tersebut harus dideklarasikan sebagai volatile.

Laboratorium TF II III-11
• Agar rutin interupsi siap beraksi, maka setup() harus memasangnya dulu dengan
fungsi attachInterrupt.

• Jika di bagian rutin normal (loop dan semua fungsi yang terpanggil oleh loop) akan
mengakses variabel global, maka harus dipastikan bahwa saat itu interupsi tidak
boleh terjadi. Untuk itu gunakan fungsi nointerrupt() dan interrupt().

Silahkan baca referensi Arduino untuk memahami volatile, attachInterrupt, noInterrups dan
interrupts. Berikut adalah tabel kebutuhan :

Tabel 3.2. Tabel kebutuhan Pengukur frekuensi dengan interupsi

Pemakai Kasus Pakai Deskripsi Kualitas


User Menurunkan User dapat menekan Setiap tombol ditekan maka PWM
Putaran Motor DC tombol pada board akan berkurang sebanyak 256/16.
motor, maka putaran
Motor DC akan menurun Motor berubah kecepatan sesuai
secara tetap. dengan PWM.

nilai PWM yang masuk ke motor


dikirimkan ke serial monitor.
Mengukur frekuensi User dapat Tampilan hasil pengukuran dalam
putaran motor DC menghubungkan Opto- RPS, muncul di 7 segment dan
coupler kapan saja, dikirimkan ke serial monitor.
sistem akan
menampilkan frekuensi Kirimkan hasil pengukuran dalam
putaran Motor DC pada pulsa ke serial monitor.
7 segment
Pengukuran dilakukan setiap 1000
mili detik.

Untuk kebutuhan tersebut, rancangan tabel transisi keadaan adalah sebagai berikut :

Tabel 3.3. Tabel state-transition Pengukur frekuensi dengan interupsi

State Event Action Next State


START - Siapkan port I/O Arduino RUN

inisialisasi variable tgate, tdisplay, pulsa dan pwm

pasang interupsi taskOpto


RUN INT Opto Baca pulsa optocoupler, menaikan cacahan pulsa RUN
tgate > 1000 ms Hentikan interupsi, baca data pulsa lalu masukan RUN
ke variable lokal, lalu aktifkan kembali interupsi.

Proses variable lokal pulsa menjadi RPS lalu


tampilkan ke 7 Segment dan tampilkan ke serial
monitor.

Laboratorium TF II III-12
S1 ditekan Turunkan nilai pwm = pwm – (256/16), lalu RUN
kirimkan nilai PWM ke MOTOR DC
tdisplay > 5 ms Multiplexing 7 segment RUN

Lengkapilah kode berikut :

// Kode 3.4 : Pengukuran Frekuensi dengan Interupsi

#define PERIODE_DISPLAY 5
#define PERIODE_GATE 1000

// unit menghitung frekuensi dalam RPS (1000 ms)


#define F_UNIT 1000L

// Pemetaan Port arduino


#define BUTTON1 ...
#define OPTO ...

#define BCD1 ...


#define T1 ...
#define T2 ...

#define MOTOR_INPUT1 ...


#define MOTOR_INPUT2 ...

// fungsi-fungsi standard
boolean s1IsPressed() { ... }
void writeDigit(int bcd){ ... }
void writeDigit3(int data) { ... }
void shiftDigit() {...}

// fungsi memeriksa apakah ada pulsa dari opto-coupler


// mirip seperti memeriksa tombol
boolean optoIsFired() {
static boolean b1_old = 1;
boolean b1 = .................;
boolean s1 = (b1 && !b1_old);
b1_old = b1;
return s1;
}

//variabel global
long tdisplay, tgate;
long pulse;
int pwm;

void setup() {
Serial.begin(115200);
Serial.println("Pengukuran Frekuensi teknik pooling");
// inisialisasi mode pin
// ............

// Inisialisasi shift register


// .....

// Inisialisasi INPUT1 dan INPUT2 motor driver


// ........

// inisialisasi variabel global

Laboratorium TF II III-13
tgate = tdisplay = millis();
pulse = 0;
pwm = 255;
}

// Task yang dipangil bila S1 ditekan


// untuk menurunkan pwm secara step
void taskButton() {
pwm = pwm - (256/16);
if (pwm < 0) pwm = 255;
analogWrite(............, pwm);
}

// Task yang dipanggil bila opto terdeteksi


// akan menaikkan cacahan pulse
void taskOpto() {
pulse++;
}

// Task dipanggil setiap Tgate


// untuk menghitung frekuensi
void taskFrequency(long ms) {
// hitung selang waktu tw
// harusnya selalu ms selalu sama dengan tgate
// tapi bisa saja terlambat, sehingga perlu dihitung lagi
long tw = PERIODE_GATE + (ms - tgate);

// hitung frekuensi
int freq = ...................... ;

// tampilkan ke 7 segment
writeDigit3(freq);

// untuk membandingkan, kirim ke serial


// pwm tw pulse freq
Serial.print(pwm);
Serial.print(" ");
Serial.print(tw);
Serial.print(" ");
Serial.println(pulse);
Serial.print(" ");
Serial.println(freq);

// reset cacahan
pulse = 0;
}

// task menampilkan bacaan 7 segment


void taskDisplay() {
............;
}

// loop utama
void loop() {
long ms = millis();
if (.............) {
taskOpto();
}
else if (.. .. .....) {
taskFrequency(ms);
tgate = tgate + PERIODE_GATE;

Laboratorium TF II III-14
}
else if (.............) {
taskButton();
}
else if (.. .. ........) {
taskDisplay();
tdisplay = tdisplay + PERIODE_DISPLAY;
}
}
Kode 3.4. Pengukuran Frekuensi dengan Interupsi

3.5.3 Pengukuran Perioda Motor DC dengan Interupsi


Pengukuran periode adalah kebalikan dari pengukuran frekuensi, dimana tujuannya adalah
menghitung selang waktu antar dua pulsa:

T =t i 1−t i (3.2)

Namun jika motor berputar kencang, maka periode ini akan singkat sekali dan sulit diukur.
Karena itu pengukuran periode ini dilakukan untuk sejumlah pulsa (N), lalu lama total
dibagi dengan jumlah pulsa tersebut.

t i N −t i
T = (3.3)
N

Dengan demikian, mula-mula program harus memasang task interupsi (taskOpto) yang
selalu siap mencacah variabel pulse jika ada interupsi dari opto-coupler. Kemudian ada
taskPeriode yang memeriksa cacahan tersebut, dan bila sudah mencapai harga N, maka
akan menghitung periode pulsa rata-rata sesuai rumus 3.3. Untuk menghitung selang
waktu, maka taskPeriode ini juga harus menangani variabel global tstart. Berikut adalah
tabel kebutuhannya :

Tabel 3.4. Tabel kebutuhan Pengukur Perioda dengan interupsi

Pemakai Kasus Pakai Deskripsi Kualitas


User Menurunkan User dapat menekan tombol Setiap tombol ditekan maka PWM
Putaran Motor pada board motor, maka akan berkurang sebanyak 256/16.
DC putaran Motor DC akan Motor berubah kecepatan sesuai
menurun secara tetap. dengan PWM.
nilai PWM yang masuk ke motor
dikirimkan ke serial monitor.
Mengukur User dapat menghubungkan Tampilan hasil pengukuran, muncul
perioda Opto-coupler kapan saja, di 7 segment dan dikirimkan ke serial
putaran motor sistem akan menampilkan monitor.
DC frekuensi putaran Motor DC Kirimkan hasil pengukuran dalam
pada 7 segment pulsa ke serial monitor.
Pengukuran dilakukan setiap 1000
mili detik.

Laboratorium TF II III-15
Untuk kebutuhan tersebut, rancangan tabel transisi keadaan adalah sebagai berikut :

Tabel 3.5. Tabel state-transition Pengukur frekuensi dengan interupsi

State Event Action Next State


START - Siapkan port I/O Arduino RUN

inisialisasi variable tstart, tdisplay, pulsa dan pwm

pasang task interupsi taskOpto


RUN INT Opto Baca pulsa optocoupler, menaikan cacahan pulsa RUN
pulse >= 100 Hentikan interupsi, baca data pulsa lalu masukan RUN
ke variable lokal, lalu aktifkan kembali interupsi
dan return.

Hitung rata-rata perioda dan tampilkan ke 7


segment dan krimkan pwm, tw, pulse dan perioda
ke serial monitor.
S1 ditekan Turunkan nilai pwm = pwm – (256/16), lalu RUN
kirimkan nilai PWM ke MOTOR DC
tdisplay > 5 ms Multiplexing 7 segment RUN

Buatlah aplikasi ini secara mandiri!

3.6 Tugas Awal


Kerjakan tugas awal sebagai berikut:

1. Buatlah rangkaian Gambar 3.6 pada protoboard. Potret dan laporkan pada jurnal
tugas awal.

2. Cobalah melakukan latihan mode interupsi seperti yang dijelaskan pada sub bab
latihan. Paparkan hasil percobaan dan simpulkan apa beda ketiga mode tersebut.

3. Jelaskan mengapa rangkaian tombol pada latihan perlu diberi kondensator (C1)
sebagai debouncer.

4. Jelaskan cara kerja rangkaian opto-coupler, dan mengapa TRIMPOT sebaiknya


ditala sehingga harganya di sekitar harga tahanan dalam photo-transistor.

5. Jelaskan dengan singkat mengapa data buffer yang diakses oleh rutin foreground
(interupsi) dan background (normal) harus diberi keyword volatile.

6. Jelaskan dengan singkat mengapa saat membaca data buffer di rutin background
(normal) harus dikawal dengan fungsi noInterrupts() dan interrupts() ?

Laboratorium TF II III-16
3.7 Praktikum
Untuk praktikum ini, koneksikan kit-kit praktikum seperti gambar berikut:

Gambar 3.9. Koneksi kit-kit praktikum untuk kit motor 2013

Gambar 3.10. Koneksi kit-kit praktikum untuk kit motor 2016

Secara keseluruhan, pada percobaan-percobaan berikut kita akan mengukur frekuensi atau
periode putaran motor pada kecepatan putar yang berubah dari paling kencang hingga
berhenti, sesuai dengan PWM yang diatur oleh penekanan tombol S1.

3.7.1 Kalibrasi Opto-Coupler


Pertama, kita perlu meyakinkan bahwa opto-coupler memang akan membangkitkan sinyal
LOW ketika tidak terhalangi dan sebaliknya HIGH ketika terhalangi. Untuk itu coba
lakukan kalibrasi sebagai berikut :

• Unggah program pada kode 3.1 ke arduino.

• Jalankan Serial monitor, amati tampilan pada layar.

Laboratorium TF II III-17
• Putar baling-baling agar menghalangi opto-coupler. Seharusnya luaran digital di
monitor menjadi 1.

• Putar baling-baling agar tidak menghalangi opto-coupler. Lihat di monitor, luaran


mestinya terbaca 0.

Jika hal itu tidak tercapai, maka anda harus melakukan trouble-shooting.

• Ambil vol meter, ukur tegangan di masukan Arduino (pin D2 atau D3). Saat baling-
baling menghalangi, tegangan seharusnya lebih dari 2 Volt. Sebaliknya saat tidak
terhalangi tegangan lebih kecil dari 1 Volt.

• Putar trimpot secukupnya agar hal tersebut tercapai.

Catat hasil pengukuran Volt Meter anda ke jurnal 3.1.1.

3.7.2 Pengukuran Frekuensi Teknik Pooling


1. Ketikkan kode 3.4. Pengukuran Frekuensi dengan Interupsi pada Arduino IDE, lalu
upload

2. Jalankan serial monitor

3. Tekan tombol S1, sehingga motor mulai berputar.

4. Setelah stabil, amati pembacaan frekuensi pada 7 segment, catat di jurnal.

5. Amati juga luaran pada serial monitor, catat di jurnal 3.1.2.

6. Ulangi percobaan dari langkah 3, dimana setiap menekan tombol S1 kecepatan


motor akan berkurang. Lakukan sampai motor macet / berhenti, atau sudah didapat
10 baris data.

7. Tekan tombol reset (di kit induk) agar motor benar-benar berhenti.

3.7.3 Pengukuran Frekuensi Dengan Interupsi


Pada percobaan ini, kita akan mengumpulkan 3 set data.

Pertama, gunakan kode 3.4. Pengukuran Frekuensi dengan Interupsi, lakukan langkah-
langkah yang sama dengan percobaan sebelumnya, dan isikan hasilnya ke jurnal 3.2 kolom
TGATE=1000.

Laboratorium TF II III-18
Setelah itu lakukan percobaan ini dua kali lagi, dengan mengubah harga PERIODE_GATE
(TGATE) menjadi 500 dan lalu 100. Isikan semuanya ke jurnal 3.2 pada kolom yang
sesuai.

3.7.4 Pengukuran Periode Dengan Interupsi


Untuk mengukur pediode, lakukan langkah-langkah berikut:

1. Ketikkan kode sumber periode1 pada Arduino IDE, pastikan bahwa NDATA adalah
100, lalu unggah

2. Jalankan serial monitor.

3. Tekan tombol S1, sehingga motor mulai berputar.

4. Setelah stabil, amati pembacaan periode pada 7 segment, catat di jurnal.

5. Amati juga luaran pada serial monitor, catat di jurnal.

6. Ulangi percobaan dari langkah 3, dimana setiap menekan tombol S1 kecepatan


motor akan berkurang. Lakukan sampai motor macet / berhenti, atau sudah didapat
10 baris data.

7. Tekan tombol reset (di kit induk) agar motor benar-benar berhenti.

Setelah itu lakukan percobaan ini dua kali lagi, dengan mengubah harga NDATA menjadi
50 dan lalu 10. Isikan semuanya ke jurnal 3.3.

3.8 Laporan
Seperti biasa, buat salinan jurnal dan kode sumber yang telah diperbaiki untuk masing-
masing anggota. Buatlah laporan dengan mengolah data hasil percobaan dan menjawab
beberapa pertanyaan berikut.

3.8.1 Pengukuran Frekuensi


1. Simbolkan tahanan dalam photo-transistor adalah Rd, dan tahanan trimpot adalah
Rt. Coba rumuskan harga tegangan ke masukan digital, lalu pikirkan dampaknya
jika harga Rt terlalu besar atau terlalu kecil. Dapatkah anda berikan alasan mengapa
harga Rt sebaiknya disekitar harga Rd ?

Laboratorium TF II III-19
2. Menurut anda, apakah akan lebih baik seandainya opto-coupler dipasang dalam
konfigurasi pull-down seperti berikut ? Berikan alasannya.

3. Masukkan data-data dari jurnal 3.1.2 (pengukuran frekuensi) ke spread-sheet.


Buatlah grafik frekuensi terhadap pwm.

4. Jelas bahwa hasil pengukuran frekuensi seharusnya turun bila harga PWM
mengecil. Coba amati hasil pengukuran anda, apakah memang demikian ? Jika
tidak beri alasannya, dimana kesalahan bisa terjadi ?

3.8.2 Pengukuran Frekuensi Dengan Interupsi


1. Seperti terlihat pada rutin taskFrequency, mengapa harus digunakan dulu
noInterrupts() sebelum membaca dan mengubah data ? Mengapa kemudian
interrupts() harus dipanggil lagi sesegera mungkin ?

2. Masukkan data dari jurnal 3.2 (pengukuran frekuensi) ke spread-sheet. Buatlah


grafik frekuensi terhadap pwm untuk setiap TGATE (menjadi grafik garis 3 series).

3. Amati data dengan TGATE=100. Apakah memang harga frekwensi sebanding


dengan harga PWM ? Bandingkan dengan hasil percobaan sebelumnya (metode
pooling). Apakah ada perbedaan ? Berikan komentar anda.

4. Amati data ketiga series. Mestinya untuk PWM yang sama, berapapun harga
TGATE, maka hasil pengukuran frekwnsi akan sama. Apakah data anda memang
demikian ? Jelaskan bila memang ada perbedaan.

5. Bandingkan program Kode 3.3 dan Kode 3.4. Mengapa program Kode 3.4
berhasil mencacah pulsa lebih teliti ?

6. Berikan rangkuman keuntungan / kerugian teknik interupsi.

Laboratorium TF II III-20
3.8.3 Pengukuran Periode
1. Masukkan data-data dari jurnal 3.3 (pengukuran periode) ke spread-sheet. Buatlah
grafik periode terhadap pwm untuk setiap NDATA (menjadi grafik garis 3 series).

2. Seharusnya, berapapun harga NDATA, maka periode akan sama untuk harga PWM
tertentu. Apakah grafik anda menunjukkan hal itu ? Jika tidak, coba cari alasannya
kenapa kesalahan itu bisa terjadi.

3. Beri rangkuman, apa keuntungan/kerugiannya bila harga NDATA lebih kecil ?

4. Coba olah data lebih lanjut, buatlah 3 kolom baru yang menghitung frekwensi dari
periode untuk ketiga harga TGATE (kita sebut frekwensi_p), kemudian buatlah
grafiknya terhadap PWM (menjadi 3 series).

5. Bandingkan grafik frekuensi p tersebut dengan grafik pengukuran frekwensi


sebelumnya. Berikan komentar anda, apa kelebihan/kekurangan pengukuran
frekuensi dibandingkan dengan pengukuran periode.

Laboratorium TF II III-21
JURNAL PRAKTIKUM TF2207

Modul 3 - Interupsi
Tanggal / Sesi Nomor Kit
Nama Peserta
NIM Peserta

Jurnal 3.1.1 Kalibrasi Opto-copler


Hasil Pembacaan
No Posisi baling-baling Tegangan (V) Digital (biner)
1 Tidak terhalang
2 Terhalang transparan
3 Terhalang hitam

Jurnal 3.1.2 Pengukuran Frekuensi


PWM : pwm ke motor
Tg : selang waktu pencacahan
P : Banyaknya cacahan
F : hasil perhitungan frekuensi (di 7 segment)

TGATE=1000
No PWM Tw P F
1 255
2 239
3
4
5
6
7
8
9
10
Catatan:

Laboratorium TF II III-22
Jurnal 3.2 Pengukuran Frekuensi Dengan Interupsi
PWM : pwm ke motor
Tw : selang waktu pencacahan
P : Banyaknya cacahan
Fi : hasil perhitungan frekuensi (di 7 segment)

TGATE=1000 TGATE=500 TGATE = 100


No PWM Tw P Fi Tw P Fi Tw P Fi
1 255
2 239
3
4
5
6
7
8
9
10
Catatan:

Laboratorium TF II III-23
Jurnal 3.3 Pengukuran Periode
PWM : pwm ke motor
Tw : selang waktu pencacahan
P : Banyaknya cacahan
Tp : hasil perhitungan periode (di 7 segment)

NDATA=100 NDATA=50 NDATA = 10


No PWM Tw P Tp Tw P Tp Tw P Tp
1 255
2 239
3
4
5
6
7
8
9
10
Catatan:

Laboratorium TF II III-24

Anda mungkin juga menyukai