Anda di halaman 1dari 38

TENTANG PWM DAN DRIVER MOTOR DC + PING

1. Rangkaian Driver Motor Untuk DC motor dengan menggunakan L298N

By holypower at 2008-10-16 <>

Auto Motor dipakai untuk menjalankan auto current sensing dari driver motor, jika dinyalakan maka motor akan berhenti sendiri jika ada arus yang bekerja pada motor lebih dari 3A sehingga driver dan motor terlndungi. Komponen FR301 tidak wajib diberikan, jika motor memakai arus yang lebih kecil dari 2A, maka disarankan memakai dioda seperti 1N1504 atau sejenisnya, 1N4008 atau variannya hanya digunakan jika motor yang dijalankan kurang dari 1 A Tegangan catu daya pada VS dapat bervariasi dari 9V sampai 42 V. Untuk tegangan lebih besar dari 12V sangat disarankan untuk memakai heatsink.Tegangan VSS yang digunakan adalah 5V. Pengontrolan driver tidak menggunakan tegangan analog akan tetapi PWM digital. PWM yang diberikan untuk menjalankan motor dapat bervariasi dari 30Hz sampai 4KHz ( tergantung dari jenis motor DC yang digunakan ). Cari PWM yang sesuai dengan motor DC yang digunakan karena jika salah maka driver akan terlalu panas atau motor DC yang digunakan tidak akan bereaksi dengan PWM yang diberikan, jangan lupa hitung Duty Cyclenya. Transistor BC547 dapat diganti dengan transistor tipe NPN lain selama range tegangannya seusai dengan tegangan dari VS.

2. Konsep Dasar PWM Salah satu cara yang paling mudah untuk membangkitkan sebuah tegangnan analog dari sebuah nilai digital adalah dengan menggunakan pulse-width modulation (PWM). Dalam PWM gelombang kotak, frekuensi tinggi dibangkitkan sebagai output digital. Untuk contoh, sebuah port bit secara kontinyu melakukan kegiatan saklar on dan off pada frekuensi yang relatif tinggi. Selanjutnya, bila sinyal diumpankan pada LPF low pass filter, tegangan pada output filter akan sama dengan Root Mean Squere ( RMS ) dari sinyal gelombang kotak. Selanjutnya tegangan RMS dapat divariasi dengan mengubah duty cycle dari sinyal. DUTY CYCLE menyatakan fraksi waktu sinyal pada keadaan logika high dalam satu siklus. Satu siklus diawali oleh transisi low to high dari sinyal dan berakhir pada transisi berikutnya. Selama satu siklus, jika waktu sinyal pada keadaan high sama dengan low maka dikatakan sinyal mempunyai DUTY CYCLE 50 %. DUTY CYCLE 20 % menyatakan sinyal berada pada logika 1 selama 1/5 dari waktu total

Gambar 15.1. Duty cycle 30 %

Gambar 15.2. Aplikasi PWM pada setting kecepatan motor 3. PWM dengan Mikrokontroler Pada rangkaian tersebut menunjukkan sebuah DAC yang dibangun dengan metode PWM, yang digunakan untuk mengendalikan kecepatan motor DC dengan modulasi lebar pulsa. Bit 0 dari P0 mengemudikan sebut saklar transistor sebagaimana yang ditunjukkan pada gambar. Motor dihidupkan dan dimatikan untuk suatu periode tertentu Bagian pada saat motor hidup disebut DUTY CYCLE. Pada program ini menggunakan sebuah byte untuk menyimpan lama waktu motor on, dari sejumlah 256 siklus. Bila duty cycle yang diberikan adalah 10 % maka program ini menyimpan data waktu ON selama 10 siklus dan OFF selama 246 siklus dari 256 siklus. Berikutnya nilai duty cycle disimpan pada RAM internal yang diberi label dCycle. Komplemen dari duty cycle disimpan pada RAM internal dengan nama dCycleC. Pada

perancangan software ini, Timer 0 diaplikasikan dalam mode 2, yaitu 8 bit timer auto reload, yang akan melakukan increment nilai register counter setiap siklus, dan bila terjadi overflow maka data yang berada pada TH0 akan diloadkan ke TL0 yang berfungsi sebagai counter 8 bit. Bila frekuensi kristal yang digunakan adalah 12 Mhz, sehingga jika nilai reload adalah 0 maka timer 0 akan over flow setiap 256 udetik; dan jika nilai reload adalah FFh maka timer akan over flow setiap 1 udetik. Pertama kali program menghidupkan motor dan menempatkan nilai dCycle ke TH0 sebagai nilai reload. Setelah timer overflow, komplemen dari duty cycle dCycleC akan ditempatkan ke TH0 sebagai nilai reload dan motor berhenti berputar. Pada pemrograman ini keadaan motor dapat dilihat pada register yang dapat dialamati bit, yang ditandai sebagai motorFlag. Percobaan 15.1. Setting kecepatan putaran motor DC dengan PWM Pada percobaan ini, putaran kecepatan motor kemudikan dengan menggunakan transistor TIP120 melalui metode PWM. PWM dikemudikan dengan menggunakan satu bit dari P0, seperti yang ditunjukkan pada gambar dibawah.

Gambar 15.3. Diagram alir (a) rutin utama (b) inisialisasi duty cycle dan (c) inisialisasi timer pada percobaan 15.1

Gambar 15.4. Diagram alir interupsi timer 0 pada percobaan 15.1 4. PROGRAM ASEMMBLER PWM 1 MOTOR DC
dCycle equ 30h dCycleC equ 31h PWM bit P0.0 MotorF bit 20h org 0h sjmp start org 0bh ljmp Interupsi_Timer0 ; start: call Init_Dcycle call init_Timer loop: sjmp loop ; Init_Dcycle: mov dCycle,#45 ;inisialisasi data dCycle T_ON mov A,dCycle ;copy data ke A cpl A ;komplemen A mov dCycleC,A ;copy A ke dCycleC ret ; Init_Timer: anl TMOD,#0F0h ; orl TMOD,#2 ;Timer0 mode2 auto reload mov TH0,dCycle ;Load data counter 8 bit setb ET0 ;enable interupsi timer0 setb EA ;enable all interupsi setb TR0 ;timer0 run ret ; Interupsi_Timer0: jb motorF,motorOff ;deteksi bit motorF setb PWM ;Hidupkan motor setb P0.7 ;TP pulsa PWM di osiloskop mov TH0,dCycle ;load data dCycle ke TH0 setb motorF ;beri tanda motorF=1-> motor ON reti motorOff:

clr PWM ;matikan motor clr P0.7 ;TP pulsa PWM di osiloskop mov TH0,dCycleC ;load data cCycleC ke TH0 clr motorF ;beri tanda motorF=0-> motor OFF reti end

5. PROGRAM ASEMMBLER 2 a. Listing Program Program sederhana untuk implementasi PWM pada mikrokontroler MCS-51 dengan bahasa assembly dapat dilihat sebagai berikut.
MOTOR BIT P1.0 ; Pin mikrokontroler ke driver motor DC F0 BIT 20H ; Flag indikasi pulsa low/high ORG 00H AJMP START ORG 0BH AJMP TIMER_0_INTERRUPT ;========================= START: MOV TMOD,#00H SETB EA SETB ET0 MAIN: MOV R7, #70 SETB TR0 LOOP: AJMP LOOP ; Set timer 0 ke Mode 0 (13 bit timer) ; Enable Interrupts ; Enable Timer 0 Interrupt ; Set PWM 70% ; Nyalakan timer 0 ; Tinggal biarkan program interrupt beraksi

;========================= TIMER_0_INTERRUPT: JB F0, HIGH_DONE LOW_DONE: SETB F0 SETB MOTOR MOV TH0, R7 CLR TF0 SETB TR0 RETI HIGH_DONE: CLR F0 CLR MOTOR MOV A, #100 CLR C SUBB A, R7 MOV TH0, A CLR TF0 SETB TR0 RETI ; ; ; ; ; ; Cek F0 (flag) Buat F0=1 Berikan pulsa high Isi ulang timer dengan R7 Clear Timer 0 interrupt flag

; Kembali ; ; ; ; ; ; ; Buat F0=0 to Berikan pulsa low Isi ulang timer dengan = 100 - R7. Clear Timer 0 interrupt flag

; Kembali

b. LISTING PROGAM YANG DIUBAH:


MOTOR BIT P1.0 ; Pin mikrokontroler ke driver motor DC FLAG BIT 20H ; Flag indikasi pulsa low/high ORG 00H AJMP START ORG 0BH AJMP TIMER_0_INTERRUPT ;========================= START: MOV TMOD,#00H ; Set timer 0 ke Mode 0 (13 bit timer) SETB EA ; Enable Interrupts SETB ET0 ; Enable Timer 0 Interrupt MAIN: MOV R7,#70 SETB TR0 LOOP: AJMP LOOP

; Set PWM 70 ; Nyalakan timer 0 ; Tinggal biarkan program interrupt beraksi

;========================= TIMER_0_INTERRUPT: JB F0, HIGH_DONE ; Cek F0 (flag) LOW_DONE: ; SETB F0 ; Buat F0=1 SETB MOTOR ; Berikan pulsa high MOV TH0, R7 ; Isi ulang timer dengan R7 CLR TF0 ; Clear Timer 0 interrupt flag SETB TR0 RETI ; Kembali HIGH_DONE: CLR F0 ; Buat F0=0 to CLR MOTOR ; Berikan pulsa low MOV A, #100 ; CLR C ; SUBB A, R7 ; Isi ulang timer dengan = 100 - R7. MOV TH0, A ; CLR TF0 ; Clear Timer 0 interrupt flag SETB TR0 RETI ; Kembali

6. Driver Motor DC dengan L298 & L293 Ada beberapa macam driver motor DC yang biasa kita pakai seperti menggunakan relay yang diaktifkan dengan transistor sebagai saklar, namun yang demikian dianggap tidak efesien dan terlalu ribet "repot" dalam pengerjaan hardware-nya. Dengan berkembangnya dunia IC, sekarang sudah ada H Bridge yang dikemas dalam satu IC dimana memudahkan kita dalam pelaksanaan hardware dan kendalinya apalagi jika menggunakan mikrokontroler, saya rasa akan lebih mudah lagi penggunaannya. IC yang familiar seperti IC L298 dan L293, kedua IC ini memiliki kelebihan dan kekurangan masing-masing. Untuk lebih jelasnya Anda bisa lihat datasheet dari masing-masing IC tersebut.

Modul yang menggunakan IC driver L298 yang memiliki kemampuan menggerakkan motor DC sampai arus 4A dan tegangan maksimum 46 VoltDC untuk satu kanalnya. Rangkaian driver motor DC dengan IC L298 diperlihatkan pada gambar 1. Pin Enable A dan B untuk mengendalikan jalan atau kecepatan motor, pin Input 1 sampai 4 untuk mengendalikan arah putaran. Pin Enable diberi VCC 5 Volt untuk kecepatan penuh dan PWM (Pulse Width Modulation) untuk kecepatan rotasi yang bervariasi tergantung dari level highnya.

Ilustrasinya ditunjukkan pada gambar 2. Gambar1. Rangkaian Drivermotor

DC

dengan L298

Gambar 2. ilustrasi Timing enable pada IC Rangkaian ini sangat berguna dan efesien sekali jika kita ingin membangun suatu mobile robot seperti yang dipergunakan dalam kontes robot indonesia (KRI) dan kontes robot cerdas indonesia (KRCI), paling tidak rangkaian ini sudah saya buktikan pada tugas kuliah saya dan berhasil dengan baik, sehingga kami satu kelompok mendapat nilai bagus. Waktu itu kita membuat aplikasi Robot Pemotong Rumput, yang perlu diperhatikan selanjutnya adalah roda yang kita gunakan. Usahakan roda tersebut presisi dari bentuk dan pemasangan pada robot karena ini berpengaruh pada jalannya robot. Selamat Mencoba Yach.... untuk L293 menyusul OK.

7. gambar blok diagram penuh robot avoider

8. DIAGRAM ALIR ROBOT AVOIDER

9. GAMBAR RANGKAIAN DRIVER MOTOR DC DENGAN IC 74HC86

10. KALAU MEMAKAI KIPAS UNTK MATIIN API NICATETAN Y a. Pengaturan Kecepatan Putar Kipas Untuk menjalankan kipas digunakan rangkaian transistor yang disusun secara Darlington. Transistor yang dipakai adalah transistor jenis NPN tipe BC 547 yang memiliki faktor penguatan dc (hfe) sebesar 125 dan mampu mengalirkan sampai arus 100 mA DC. Rangkaian untuk menjalankan transistor dapat dilihat pada gambar 9:

Gambar 9 Rangkaian Untuk Menjalankan Motor Untuk mengatur kecepatan kipas digunakan teknik PWM( Pulse Width Modulation), yakni mengatur besarnya dutycycle, frekuensinya tetap tetapi lebar pulsa high dan lownya dapat diatur. Untuk itu digunakan timer untuk mengatur pulsa high dan pulsa lownya. Jadi dutycyclenya akan dimulai dari 20%,30%,40%,50%,60%,70%,80%,90%. Semakin besar dutycyclenya maka semakin cepat pula putaran dari motor. Berikut ini merupakan potongan program untuk menjalankan kipas dengan prinsip PWM: Potongan Program 3 :Pengaturan Kecepatan Kipas
1: PWM: 2: MOV 3: MOV 4: MOVC DIISIKAN KE A 5: MOV 6: MOV 7: MOV 8: MOVC DIISIKAN KE A 9: MOV 10: CLR 11: CJNE LOW 12: SETB 13: MOV 14: MOV 15: MOV 16: SETB 17: SJMP 18: LOW: 19: MOV 20: MOV 21: MOVC 22: MOV 23: MOV 24: MOV 25: MOVC 26: MOV 27: CLR 28: MOV 29: MOV 30: SETB 31: RET 32: TABELH1 A,R4 DPTR,#TABELH1 A,@A+DPTR TABH,A A,R4 DPTR,#TABELH2 A,@A+DPTR TABH+1,A TR0 R3,#0,LOW P3.1 TH0,TABH TL0,TABH+1 R3,#1 TR0 SELESAI A,R4 DPTR,#TABELL1 A,@A+DPTR TABL,A A,R4 DPTR,#TABELL2 A,@A+DPTR TABL+1,A P3.1 TH0,TABL TL0,TABL+1 TR0 DB $FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FC ;NILAI AWAL R4 DIISIKAN KE A ;ALAMAT TABELH1 DIISIKAN KE DPTR ;A SEBAGAI PENUNJUK TABELH1 KEMUDIAN ;TABH DIISI A ;ALAMAT TABELH2 DIISIKAN KE DPTR ;A SEBAGAI PENUNJUK TABELH2 KEMUDIAN ;A DIISIKAN KE TABH+1 ;BANDINGKAN R3 DENGAN 0 TIDAK SAMA KE ;TABH DIISIKAN KE TH0 ;TABH+1 DIISIKAN KE TL0 ;R3 DIISI 1 ;JALANKAN TIMER

33: TABELH2 34: TABELL1 35: TABELL2

DB $FF,$38,$D4,$70,$0C,$A8,$44,$E0,$7C,$19 DB $FC,$FC,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF DB $19,$E0,$44,$A8,$0C,$70,$D4,$38,$9C,$FF

11. JANGAN LUPA BACA DULU YANG SATU INI a. Baca dulu INTRODUCTION H-BRIDGE. Membuat H-Bridge menggunakan IC sering diaplikasikan pada mobil robot karena ukuran yang kecil, mudah penggunaannya, kompatibel dengan port mikrokontroler, dan dapat diimplementasikan menggunakan PWM dengan frekuensi yang tinggi. Pada 1 buah IC telah dapat mengendalikan 2 buah motor DC sehingga IC lebih tepat penggunaannya untuk aplikasi mobil robot yang akan saya paparkan nantinya. Saya hanya akan membahas H-Bridge menggunakan IC L293 dan L298.

IC L293
Ada 2 tipe IC L293 yang saya ketahui yaitu L293 dan L293D, perbedaanya yaitu a. L293 arus maksimum mencapai 1 A sedangkan L293D arus maksimum mencapai 600 mA b. L293 tidak memiliki dioda internal sedangkan L293D memiliki dioda internal. Dari data diatas jika anda mengendalikan motor DC dengan arus kurang dari 600 mA maka gunakan L293D karena telah memiliki dioda internal yang berarti tidak perlu menambahkan rangkaian dioda tambahan. Tetapi jika arus lebih dari 600 mA maka gunakan L293 dan harus ditambahkan dioda eksternal yang akan melindungi IC dari kerusakan. Saya hanya akan membahas IC L293 karena prinsipnya sama dengan L293D tetapi arusnya lebih besar.

Rangkaian schematik pada Gambar 1 adalah rangkaian separuh dari IC L293 yang mengendalikan 1 buah motor DC dengan rangkaian H-Bridge. Pengaturan arah pergerakan motor DC dengan mengimplemetasikan logika pada pin-pin IC L293 seperti pada tabel gambar 1.

Rangkaian Schematik pada gambar 2 adalah rangkaian pengendalian 2 buah motor DC yaitu M1 dan M2. Implementasi pergerakan motor tersebut seperti tampak pada tabel gambar 2. Jangan lupa spesifikasi pemilihan dioda harus memiliki waktu Recovery yang lebih cepat daripada waktu switching IC. Untuk IC L293 waktu transisinya (Transition Time, Low to high level output and high to low level output) adalah 300 nS sehingga Fast Recovery Diode trr <= 300 nS. Saya gunakan dioda tipe 1N4942 dengan waktu recovery hingga 150 nS.

IC L298

Rangkaian schematik pada Gambar 3 adalah rangkaian separuh dari IC L298 yang mengendalikan 1 buah motor DC dengan rangkaian H-Bridge. Pengaturan arah pergerakan motor DC dengan mengimplemetasikan logika pada pin-pin IC L298 seperti pada tabel gambar 3. Pengaturan gerak motor DC akan dibahas pada ROBOT---------. Jika anda memperhatikan pada datasheet L298 maka terdapat sebuah resistor sense (RS) yang dipasang sebelum ground. Resistor ini berfungsi untuk "meraba" (sense) arus yang mengalir pada H-Bridge sebagai umpan balik pada kontroler, oleh sebab itu resistor ini (RS) bersifat optional yaitu boleh dipasang boleh tidak. Jika anda memasang RS maka nilai resistor ini tidak boleh mengurangi arus yang mengalir pada H-Bridge hingga arus pada motor DC berkurang yang berakibat kecepatan motor DC berkurang bahkan motor DC tidak bergerak sama sekali. Saya tidak memasang RS karena tidak membutuhkan umpan balik tersebut. Jangan lupa spesifikasi pemilihan dioda harus memiliki waktu Recovery yang lebih cepat daripada waktu switching IC. Untuk IC L298 waktu transisinya (Transition Time, Low to high level output and high to low level output) adalah 200 nS sehingga Fast Recovery Diode trr <= 200 nS. Saya gunakan dioda tipe 1N4942 dengan waktu recovery hingga 150 nS

TENTANG PING

1. Listing program ping ditampilkan ke LCD

SensoR PING

merupakan sensor yang dapat mengukur jarak, pengukuran dilakukan dengan mengirimkan gelombang ultra sonic dengan frekuensi 40 Khz dan kecepatan 344 m/s kemudian ping akan menerima pantulan, lalu mengirim logic. PING ))) ======================== |BENDA| t

sesuai rumus fisika S= V.t namun waktu yang dihitung adalah waktu pergi dan waktu datang sehingga jarak yang ditempuh adalah dua kali. jadi untuk menghitung jarak , s= V (0.5 T) atau (0.5 s) = v.t

dari gambar diatas ping tersebut hanya memiliki tiga buah kaki, VCC, GROUND, dan SIGNAL SIGNAL ini berfungsi sebagai pengatur serta penerima sensor yang akan ditangkap oleh PIR. mengirim sinyal kasih tegangan kotak. 0 1 0 menerima sinyal pantul maka ping akan jadi 0 untuk lebih jelasnya dapat kita lihat gambar grafik berikut ini

http://lab.binus.ac.id/pk/databook/misc/Ping.pdf

dari grafik diatas kita dapat melihat prinsip kerjanya. lihat gambar grafik SIGNAL Host (mcs) yang sinyal lebih tebal algoritmanya aktifkan PING || Delay t brust (PING siap-siap send signal)

|| aktifkan timer pada host. SIGNAL akan high || tunggu sinyal pantul. || matikan timer, pantulan diterima SIGNAL = 0

timer merupakan pencacah digunakan untuk menghitung waktu menuju benda dan pantulannya ke ping. maximal adalah 0.018 s atau 18 ms atau jarak maximum adalah sekitar 6 meter (pergi pulang) sehingga jarak max benda setengahnya yaitu sekitar 3 meter. bagaimana menghitung waktu dengan timer? (silahkan baca datasheet atmel) intinya saat ini kita kan membahas langsung. host yang aku gunakan adalah AT89S52,dengan Xtal 11.0592 Mhz.dalam satu detik dapat mengcounter sampai 921600 (counter dari 0 ,1,2,3,4,5,....,921600) kita dari datasheet diketahui maximum jarak 6 meter sehingga waktunya adalah 0.018 = 18 ms, maka counter nya adalah 0.018 = x / 921600 x= 0.018 . 921600 = 16588,8d = 40CCh (jadi bisa menggunakan timer 16 bit max FFFFh = 65535d) untuk menghitung waktu maka tpp = counter d / 921600 d misalkan jika dari sinyal dikirim sampai diterima counter bertambah sampai 10.000 d atau 2710h ,maka waktu pulang pergi tpp = 10000d /921600d = 0.010850 sekon

s=V.t spp = 344 m/s . 0.010850s = 3.73m sp =3.73 / 2 = 1.866 meter kita buat programnya dengan BARAK ;============================================ PING EQU P1.0 ;gunakan satu port untuk ke pin signal setb P1.0 ; aktifkan SIG kasih 1

Mov R6,#4 ; delay 6 us DJNZ R6,$ clr P1.0 setb P1.0 ; matikan signal kasih low ; set P1.0 kasih high untuk input

Mov R6,#0FFh ;delay brust 512 us DJNZ R6,$ ; 1 djnz = 2 cycle = 2us JNB P1.0,$ ; selama sig belom high repeat SETB TR0 ; SIGNAL high sinyal dikirim ; timer aktifkan

JB P1.0 ,$ ; selama belum ada pantulan biarkan CLR TR0 ; SIGNAL low pantulan diterima. matikan timer clr P1.0 ; matikan ping mov jarak1,TH0 ; pindahkan isi timer high mov jarak2,TL0 ; pindahkan isi timer low ;=================================================

1 TH0 = 256 TL0 (mode 16 bit counter) tetapi anda akan menemukan masalah dengan niali pointer baimana mengisi nilai 0.018 , 0.5 ke MCS ? oleh karena itu untuk mengakalinya kita gunakan DPTR. saya menghitung nilai TH dan TL lalu membua perbandinganya pada excel. 1 Th = 4.7 cm 1 Tl = 0.018 cm dengan kuantisasi (pembulatan) lau diperbandingkan. sehingga dapat lah hasilnya. lalu aku tampilkan waktu dan jarak di LCD akese mode nible. ;===================== program ================== $object $mod52 RS bit P2.0 EN bit P2.1

RW bit P2.2 dat equ P0

jarak1 equ 40h jarak2 equ 41h ratus equ 42h puluh equ 43h satu equ 44h over bit 20h.1 overc bit 20h.2 ping bit p1.0

org 00h ajmp start

org 0bh ajmp inter0

inter0: CLR ping setb overc mov ratus,#'x' mov puluh,#'x' mov satu,#'x' reti

org 60h start: setb et0 setb ea clr over clr overc

;aktifkan timer 0 ;aktifkan register all ; untuk overflow (lebih dari 255) ; untuk overflow timer

mov DPTR,#database mov TH0,#00h ; start timer ari 0 mov TL0,#00h mov TMOD,#11h ;gunakan mode timer 16 bit

;================ LCD inisialilasi =================== Mov A,#28h acall perintah Mov A,#28h acall perintah mov A,#0Ch acall perintah mov A,#04h acall perintah mov A,#01h ; hapus acall perintah mov A,#080h acall perintah mov A,#'Y' acall datat mov A,#'D' acall datat mov A,#'H' acall datat mov A,#0C4h acall perintah mov A,#'c' acall datat mov A,#'m' acall datat ;======================================================

jarak:

; proses penghitungan jarak

mov A,#8Ah ; baris dua kolom 4 acall perintah

mov A,#'j' acall datat

;mode penghitung setb ping Mov R6,#5 DJNZ R6,$ clr ping setb ping Mov R6,#0FFh DJNZ R6,$ JNB Ping,$ SETB TR0 JB ping,$ CLR TR0 clr ping

mov jarak1,TH0 mov jarak2,TL0 mov TH0,#00h mov TL0,#00h

;===================== menampilkan timer di LCD ======== mov A,jarak1 ; swap A anl A,#0Fh movc a,@a+DPTR acall datat mov A,jarak1 ; anl A,#0Fh movc a,@a+DPTR acall datat mov A,jarak2 swap A anl A,#0Fh ;

movc a,@a+DPTR acall datat mov A,jarak2 ; anl A,#0Fh movc a,@a+DPTR acall datat ;===================================================

;=============== Proses penghitungan timer ke jarak ;=============== Perhitungan overflow

jb overc,cetak mov A,jarak2 mov b,#40 DIV AB mov R0,A mov dptr,#nilai mov A,jarak1 clr c cjne A,#54,overawal ; cek nilai dengan 54 setb over ; pas juga naikin jmp cekoverend overawal: jnc overawalyes jmp cekoverend overawalyes: setb over mov dptr,#nilaib SUBB A,#54 cekoverend: movc A,@A+dptr add A,R0 ; kuantisasi TL 0 - 5 cm

jb over,overyes jmp tidakover overyes: add A,#155 tidakover: mov R0,A mov B,#100 DIV AB

jb over,overratusyes jmp tidakratusover

overratusyes: inc A clr over tidakratusover: mov ratus,A mov A,B mov B,#10 DIV AB mov puluh,A mov satu,B

;========================= cetak LCD ================ cetak: clr overc mov DPTR,#database mov A,#0C0h ; baris dua kolom 4 acall perintah mov A,ratus movc a,@a+DPTR acall datat mov A,puluh

movc a,@a+DPTR acall datat mov A,satu movc a,@a+DPTR acall datat acall lama ; delay lama mov A,#8Ah ; baris dua kolom 4 acall perintah mov A,#' ' ; membuat huruf j kelap kelip acall datat ; sebagai penanda scan ;=============================================== acall delay_lcd ajmp jarak

;==================== FUNGSI FUNGSI LCD============== lama: mov R6,#3 lamaa: mov R7,#0FFh lama2: mov R5,#0FFh djnz R5,$ djnz R7,lama2 djnz R6,lamaa ret

perintah: CLR RW CLR P2.0

mov P0,A SETB EN CLR EN

rl A rl A rl A rl A Mov P0,A ANL DAT,A SETB EN CLR EN

;...second nibble

;Low nibble to display

acall lcd_sibuk acall delay_lcd RET

lcd_sibuk: clr P0.7 SETB RW CLR P2.0 SETB EN NOP CLR EN

JB P0.7,$ NOP mov R7,#0FFh djnz r7,$ RET

datat: SETB P2.0 CLR RW mov P0,A SETB EN CLR EN

SWAP A ;nibble high tukar nibble low Mov P0,A ANL DAT,A ; tembak nibble low SETB EN CLR EN acall lcd_sibuk RET

delay_lcd: mov R7,7 delay2: Mov R6,#0FFh DJNZ R6,$ djnz r7,delay2 RET

org 500h database: db '0123456789ABCDEF'

;====================== data jarak untuk TH ======== org 550h nilai: db 0,5,10,14,19,24,29,33,38,43,48,53,57 db 62,67,72,76,81,86,91,96,100,105,110,115,119,124 db 129,134,139,143,148,153,158,162,167,172,177,182,186 db 191,196,201,205,210,215,220,225,229,234 db 239,244,248,253 ;===== jarak ketika lebih dari 255 (teknik akal akalan) org 620h nilaib: db 4,9,14,18,23,28,33,37,42,47,52,57,61,66,71,76,80,85 ;=================================================== END 2. Listing program robot pendeteksi dinding ;Assembler MCS51 untuk robot pendeteksi dinding ORG 00H ;inisialisasi awal BEGIN:

MOV P2,#00H ;Port2 0x00 (motor stop);Menuliskan 00h ke port2 MOV P0,#03H ;Port0.0 dan Port0.1 logika 1 (rendah aktif) ;bisa juga MOV P0,#00000011b; (dalam biner) ACALL TUNDA_1S ;tunda dulu TESTDRIVE: ACALL MAJU ;robot maju 3 detik ACALL TUNDA_1S ACALL TUNDA_1S ACALL TUNDA_1S ACALL MUNDUR ;robot mundur 3 detik ACALL TUNDA_1S ACALL TUNDA_1S ACALL TUNDA_1S ACALL B_KANAN ;robot belok kanan 3 detik ACALL TUNDA_1S ACALL TUNDA_1S ACALL TUNDA_1S ACALL B_KIRI ;robot belok kiri 3 detik ACALL TUNDA_1S ACALL TUNDA_1S ACALL TUNDA_1S ACALL ROTASI ;robot rotasi 3 detik ACALL TUNDA_1S ACALL TUNDA_1S ACALL TUNDA_1S MOV P2,#00H ;test drive selesai ACALL TUNDA_1S ;diam 1 detik (siap" neh) MAIN: ACALL MAJU ;default robot maju ACALL TUNDA ;tunda 100ms JNB P0.0,S_KIRI ;cek sensor kiri JNB P0.1,S_KANAN ;cek sensor kanan SJMP MAIN ;looping terus menerus S_KIRI: JNB P0.1,S_DUA ;cek dlu kanan jg tersentuh atau tdk? ACALL B_KANAN ;sensor kiri tersentuh belok kanan ACALL TUNDA_1S SJMP MAIN S_KANAN: ACALL B_KIRI ;sensor kanan tersentuh belok kiri ACALL TUNDA_1S SJMP MAIN

S_DUA: ACALL MUNDUR ;sensor kiri n kanan tersentuh robot mundur ACALL TUNDA_1S ACALL ROTASI ;setelah mundur robot rotasi ACALL TUNDA_1S ACALL TUNDA_1S SJMP MAIN ;ke program utama MAJU: MOV P2,#00110011b ;konfigurainya coba" aja RET MUNDUR: MOV P2,#11110000b RET B_KANAN: MOV P2,#10110001b RET B_KIRI: MOV P2,#01110010b RET ROTASI: mov P2,#00000101b ;----------------------------------; TUNDA ;----------------------------------TUNDA_1S: ACALL TUNDA_05S ; tunda selama 1 S ACALL TUNDA_05S RET TUNDA_05S: MOV A,#100 ; tunda selama 0,5 S TUNDA_LOOP: LCALL TUNDA_MODE DJNZ ACC,TUNDA_LOOP RET TUNDA: MOV A,#20 ; tunda selama 100 mS TUNDAX: LCALL TUNDA_MODE DJNZ ACC,TUNDAX RET TUNDA_MODE: PUSH TMOD ; tunda selama 5 mS MOV TMOD,#21H MOV TH0,#0EDH

MOV TL0,#0FFH SETB TR0 TUNDA_5MS: JBC TF0,TUNDA_OK SJMP TUNDA_5MS TUNDA_OK: CLR TR0 POP TMOD RET END

Pengukur Jarak dengan Ultra Sonic


Meminjam teknik echo sounder yang dipakai untuk mengukur kedalaman laut, bisa dibuat alat pengukur jarak dengan ultra sonic. Pengukur jarak ini memakai rangkaian yang sama dengan Jam Digital dalam artikel yang lalu, ditambah dengan rangkaian pemancar dan penerima Ultra Sonic. Prinsip kerja echo sounder untuk pengukuran jarak digambarkan dalam Gambar 1. Pulsa Ultrasonic, yang merupakan sinyal ultrasonic dengan frekwensi lebih kurang 41 KHz sebanyak 12 periode, dikirimkan dari pemancar Ultrasonic. Ketika pulsa mengenai benda penghalang, pulsa ini dipantulkan, dan diterima kembali oleh penerima Ultrasonic. Dengan mengukur selang waktu antara saat pulsa dikirim dan pulsa pantul diterima, jarak antara alat pengukur dan benda penghalang bisa dihitung.

Gambar 1 Prinsip Echo Sounder

Gambar 2 merupakan Rangkaian Jam Digital dalam artikel lalu yang direvisi untuk keperluan ini. Titik desimal pada tampilan satuan dinyalakan dengan tahanan R8. Setiap kali tombol Start ditekan, AT89C2051 membangkitkan pulsa ultrasonic pada Pin P3.4 yang dipancarkan dengan rangkaian Gambar 3, selanjutnya lewat pin P3.5 yang terhubung ke rangkaian penerima ultrasonic di Gambar 4, sambil mengukur selang waktu AT89C2051 memantau datangnya pulsa pantul. Hasil pengukuran waktu itu, dengan sedikit perhitungan matematis ditampilkan di sistem penampil 7 ruas sebagai besaran jarak, dengan satuan centimeter dan 1 angka dibelakang titik desimal.

Gambar 2 Rangkaian Kontrol & Tampilan Pemancar pulsa Ultrasonic Pulsa Ultrasonic dibangkitkan di pin P3.4 AT89C2051 (ULTRA_OUT) dengan potongan Program 1, sebagai berikut: Potongan Program 1 - Membangkitkan sinyal ultra sonic
1 PulsaUltraSonic: 2 MOV R7,#24 Nilai awal R7 = 24 3 Loop: 4 NOP waktu untuk mengerjakan baris 4..14 5 NOP = 12 mikro-detik

6 NOP 7 NOP 8 NOP 9 NOP 10 NOP 11 NOP 12 NOP 13 CPL Ultra_Out Ultra_Out (P3.4) := not Ultra_Out 14 DJNZ R7,Loop Turunkan nilai R7, ulangi lagi kalau R7<>0 15 RET

Processor memerlukan waktu untuk melaksanakan instruksi. Bagi AT89C2051 yang bekerja pada frekuensi 12 MHz, instruksi NOP (baris 4 sampai 12); instruksi CPL (baris 13) dilaksanakan dalam waktu 1 mikro detik, dan 2 mikro detik untuk melaksanakan instruksi DJNZ (baris 14). Dengan demikian waktu yang diperlukan untuk melaksanakan instruksi-instruksi di baris 3 sampai 13 adalah 12 mikro detik. Di baris 12, nilai Ultra_Out (= pin P3.4) dibalik, kalau semula Ultra_Out bernilai 0 setelah instruksi ini dijalankan Utltra_Out akan bernilai 1, dan sebaliknya kalau semula 1 dan berbalik menjadi 0. Di baris 13 nilai R7 dikurangi 1, selama R7 belum mencapai 0 AT89C2051 akan mengulang lagi baris 2 dan seterusnya. Di baris 1 R7 diberi nilai 24, dengan demikian baris 2 sampai 13 akan diulang sebanyak 24 kali, dan selama itu pin 3.4 akan berbalik dari 0 ke 1 dan 0 kembali sebanyak 12 kali. Dengan demikian, hasil kerja Potongan Program 1 adalah pulsa ultrasonic12 gelombang dengan frekuensi 1/24 mikrodetik = 41666 Hz.

Gambar 3 Rangkaian Pemancar Ultra Sonic

Pulsa ultrasonic diperkuat dan dipancarkan dengan rangkaian pemancar Ultrasonic di Gambar 3. Rangkaian ini dibangun dengan Inverter CMOS MC14049, inverter U1B dipakai untuk membalik fasa sehingga tegangan di output gabungan U1A & U1C akan selalu berlawanan dengan tegangan di output gabungan U1D & U1E, dengan demikian amplitudo ultrasonic yang sampai di tranduser ultrasonic menjadi 2 kali lipat. C1 dipakai untuk menahan arus DC, sehingga hanya sinyal ultrasonic saja yang bisa masuk ke tranduser ultrasonic. Penerima pulsa Ultrasonic Rangkaian Penerima Ultrasonic pada Gambar 4, merupakan rangkaian yang umum dipakai untuk penerima ultrasonic, rangkaian ini bisa diganti dengan rangkaian yang lain, asalkan saat tidak ada sinyal ultrasonic keluarannya (ECHO_IN) bernilai 1 dan menjadi 0 begitu menerima sinyal ultrasonic, sesuai dengan kondisi yang dipantau AT89C2051 lewat Potongan Program 2.

Gambar 4 Rangkaian Penerima Ultra Sonic

Pengukuran selang waktu Pengukuran selang waktu dilakukan dengan bantuan Timer 1 yang ada di dalam IC AT89C2051 seperti terlihat pada Gambar 5. TL1 dan TH1 merupakan bagian dari Timer 1, masingmasing berupa pencacah 8 bit yang diuntai menjadi pencacah 16 bit (Mode 1). TR1 berfungsi untuk mengatur masuknya sinyal 1 MHz ke untaian pencacah, saat TR1 bernilai 0 tidak ada sinyal yang masuk, saat bernilai 1 maka untaian pencacah akan mencacah dari 0 sampai $FFFF (heksadesimal) dan kembali lagi ke 0, dan diikuti TF1 menjadi 1.

Gambar 5 Pengukur Waktu Pengukuran selang waktu antara saat pulsa ultrasonic dikirim dan pulsa pantul diterima dilakukan dengan Potongan Program 2 sebagai berikut : TR1 diberi nilai 1 agar untaian pencacah bekerja (baris 1) dan ditunggu sampai isi pencacah menjadi 0 dengan cara menunggu TF1 sampai bernilai 1 (baris 2 dan 3). Segera setelah itu dibangkitkan pulsa ultrasonic dengan memanggil subrutin di Potongan Program 1 (baris 4), disusul menunggu pantulan pulsa dengan cara memantau
P3.5 sampai bernilai 0 (baris 5 dan 7, abaikan dulu baris 6), setelah itu TR1 diberi nilai 0 (baris 7).

Dengan demikian posisi untaian pencacah TL1/TH1 yang terakhir merupakan lamanya selang waktu dalam satuan mikro detik. Kalau jarak yang diukur terlalu jauh, pulsa ultrasonic yang dikirimkan tidak terpantulkan, akibatnya AT89C2051 akan menunggu terus di baris 5 dan 7, agar hal ini tidak terjadi ditambahkan baris 6, yakni sambil menunggu pulsa pantulan dipantau pula apakah untaian pencacah sudah melimpah, kalau sampai melimpah maka tidak perlu menunggu pulsa pantulan lagi, aliran program dialihkan ke Selesai, dan untaian pencacah dihentikan.

Potongan Program 2 - Mengukur waktu pantulan ultra sonic


1 SET TR1 Hidupkan untaian pencacah 2 SampaiNol: 3 JNB TF1,SampaiNol Tunggu selama TF1 masih =1 4 ACALL PulsaUltraSonic Bangkitkan pulsa Ultrasonic 5 TungguPantulan: 6 JB TF1,Selesai TL1/TH1 melimpah? Ya, stop 7 JB P3.5,TungguPantulan Tunggu selama P3.5 =1 8 Selesai: 9 CLR TR1 Matikan untaian pencacah

Perhitungan jarak Seperti diketahui, kecepatan rambat suara di udara adalah 34399.22 cm/detik, berarti untuk merambat sejauh 1 cm suara membutuhkan waktu 29 mikro detik. Selang waktu yang sudah tercatat di untaian pencacah TL1/TH1 (Potongan Program 3, baris 2 sampai dengan 4) setara dengan dua kali jarak pemancar ultrasonic dengan penghalang. Selang waktu tersebut dalam satuan mikro detik, untuk mengubah menjadi jarak (cm) harus membaginya dengan bilangan 58 (Potongan Program 3, baris 10 sampai dengan 13). Untuk mendapatkan angka pecahan di belakang desimal, karena rutin arithmatik yang dipakai adalah rutin perhitungan bilangan bulat (integer), maka sebelum pembagian di atas nilai
TL1/TH1 dikalikan dulu dengan 10 (Potongan Program 3, baris 10 sampai dengan 13).

Potongan Program 3 - Menghitung jarak


1 CLR A 2 MOV Operand,TL1 3 MOV Operand+1,TH1 4 MOV Operand+2,A

5 MOV Pengali,#10 6 MOV Pengali+1,A 7 MOV Pengali+2,A 8 ACALL Perkalian HasilKali := 10 * TL1_TH1 9; 10 MOV R0,#HasilKali 11 MOV R1,#Operand 12 ACALL Copy Copy-kan isi HasilKali ke Operand 13 MOV Pembagi,#58 14 MOV Pembagi+1,#0 15 MOV Pembagi+2,#0 16 ACALL Pembagian HasilBagi := (10*TL1_TH1) / 58

Perhitungan di atas adalah perhitungan secara biner, bilangan biner ini dirubah dulu menjadi bilangan desimal agar bisa ditampilkan. Bilangan biner tersebut dibagi dengan 1000 untuk mendapatkan angka ribuan, sisanya dibagi dengan 100 untuk mendapatkan angka ratusan dan seterusnya, seperti terlihat pada Potongan Program 4. Potongan Program 4 - Jarak dalam bentuk biner dirubah ke desimal untuk ditampilkan
1 MenampilkanHasil: 2 ACALL HapusTampilan 3; 4 MOV DPTR,#AngkaPembagi Mulai dengan 1000 5 MOV R7,#4 Maksimum 4 digit 6 MOV R4,#RuasRatusan 7 CLR F0 Belum pernah simpan

8 9 MOV R0,#HasilBagi 10 MOV R1,#SisaBagi 11 ACALL Copy 12 DigitBerikutnya: 13 MOV R0,#SisaBagi 14 MOV R1,#Operand 15 ACALL Copy 16 17 * Ambil AngkaPembagi dari Tabel 18 19 CLR A 20 MOV Pembagi+2,A 21 MOVC A,@A+DPTR 22 INC DPTR 23 MOV Pembagi,A 24 25 CLR A 26 MOVC A,@A+DPTR 27 INC DPTR 28 MOV Pembagi+1,A 29 30 ACALL Pembagian SisaBagi dibagi 1000; 100; 10 dan 1

31 32 MOV A,HasilBagi HasilBagi=0? 33 JNZ SimpanRuas Tidak, jadikan simpan ruas 34 JNB F0,Berikutnya Belum pernah simpan dan 0 35 SimpanRuas: 36 SETB F0 Sudah pernah simpan angka 37 ACALL JadikanRuas 38 MOV R0,$04 R0 <- R4 39 MOV @R0,A Simpan 40 Berikutnya: 41 INC R4 42 DJNZ R7,DigitBerikutnya 43 RET 44 45 AngkaPembagi: 46 DW 1000 47 DW 100 48 DW 10 49 DW 1

Penutup Rancangan di atas bisa dipakai untuk mengukur jarak sampai sejauh lebih kurang 10 meter, pada jarak tersebut waktu rambat suara lebih kurang sebesar 2 x 1000 cm x 29 mikro-detik/cm = 58.000 mikro detik, hampir mencapai angka maksimum yang bisa ditampung untaian pecacah
TL1/TH1 yang 65535.

Meskipun demikian untuk bisa mengukur sejauh itu, rangkaian pemancar dan penerima ultrasonic harus benar-benar dalam keadaan yang baik, terutama harus dipilih tranduser ultrasonic yang prima. Alat ini akan punya nilai komersil yang baik jika tampilan 7 ruas dengan LED diganti dengan tampilan LCD, agar pemakaian dayanya kecil dan bisa bekerja dengan baterai saja. Pemakaian LCD akan dibicarakan pada artikel lain.

Program untuk mengendalikan AT89C2051 harus diisikan ke dalam IC microcontroller itu, untuk itu diperlukan alat yang dinamakan sebagai AT89C2051 Flash PEROM Programmer. Alat ini sangat sederhana, hanya memakai sebuah IC 74HC574A ditambah dengan sistem catu daya dan dihubungkan ke komputer PC lewat printer port.