Pulse Width Modulation (PWM): Contoh Program Mikon
18 Februari 2010, 07.00
Diposting Oleh: Ari Sulistiono | lokasi Tag: Control System, Ilmu Listrik, Microcontroller
Artikel ini merupakan sambungan artikel saya yang berjudul “Pulse Width Modulation (PWM): Pengenalan”. Jika readers telah memahami dengan baik inti utama di balik PWM, maka kali ini saya ingin mengajak readers untuk praktek langsung dan mencoba mengimplementasikan pemahaman tersebut ke dalam sebuah program microcontroller.
Gagasan dibalik Implementasi
Gagasan/ide dasar dibalik implementasi PWM pada microcontroller adalah penggunaan timer dan perubahan status (switching) high dan low ke dalam salah satu pin I/O yang terdapat pada salah satu port microcontroller dengan interval tertentu yang sudah didefinisikan. Seperti yang telah kita bahas pada artikel pengenalan PWM, bahwasanya dengan pengubahan waktu Ton, kita dapat memvariasikan lebar gelombang kotak dengan menjaga periode gelombang yang sama/tetap. Sehingga diperoleh nilai tegangan yang bervariasi pula.
►Contoh Kode ASM
►Inisialisasi Timer untuk PWM
PWMPIN EQU P1.0 ; PWM output pin PWM_SETUP: MOV TMOD,#00H ; Timer0 in Mode 0 MOV R7, #160 ; Set pulse width control ; The value loaded in R7 is value X as ; discussed above. SETB EA ; Enable Interrupts SETB ET0 ; Enable Timer 0 Interrupt SETB TR0 ; Start Timer RET |
CODE:
TIMER_0_INTERRUPT: JB F0, HIGH_DONE ; If F0 flag is set then we just finished ; the high section of the LOW_DONE: ; cycle so Jump to HIGH_DONE SETB F0 ; Make F0=1 to indicate start of high section SETB PWMPIN ; Make PWM output pin High MOV TH0, R7 ; Load high byte of timer with R7 ; (pulse width control value) CLR TF0 ; Clear the Timer 0 interrupt flag RETI ; Return from Interrupt to where ; the program came from HIGH_DONE: CLR F0 ; Make F0=0 to indicate start of low section CLR PWMPIN ; Make PWM output pin low MOV A, #0FFH ; Move FFH (255) to A CLR C ; Clear C (the carry bit) so it does ; not affect the subtraction SUBB A, R7 ; Subtract R7 from A. A = 255 - R7. MOV TH0, A ; so the value loaded into TH0 + R7 = 255 CLR TF0 ; Clear the Timer 0 interrupt flag RETI ; Return from Interrupt to where ; the program came from |
Di dalam program utama, kamu harus memanggil routine “PWM_SETUP” dan microcontroller kamu akan mengeluarkan PWM output pada pin yang ditunjuk. Pada kode diatas, keluaran PWM diberikan pada port 1 bit ke 1 (P1.1), pilih pin yang akan digunakan sesuka hati sesuai alur program diatas.
Timer Interrupt service routine akan menangani pengendalian lebar pulsa (PWM) di belakang layar. Lebar pulsa dapat dirubah dengan merubah nilai register R7. Pada contoh diatas, saya gunakan 160, kamu dapat memilih nilai sembarang dari 0 s/d 255. R7 = 0 akan memberikan nilai keluaran tegangan sebesar 0 Volt, dan sebailknya R7 = 255 akan memberikan nilai tegangan kurang lebih sebesar 5 Volt.
Kamu juga dapat menggunakan Timer1 jika dirasa perlu. Jumlah pin microcontroller sangat beraneka ragam, sebaiknya merujuk ke datasheet microcontroller yang digunakan. Disini hanya diterangkan alogarithm programnya saja, untuk skematik silahkan kembangkan sesuai keinginan masing-masing.
►Contoh Kode Bahasa C
►Inisialisasi Timer untuk PWM dalam bahasa C
//Global variables and definition #define PWMPIN P1_0 unsigned char pwm_width; void pwm_setup(){ TMOD = 0; pwm_width = 160; EA = 1; ET0 = 1; TR0 = 1; } |
void timer0() interrupt 1 { if(!F0) { //Start of High level F0 = 1; //Set flag PWMPIN = 1; //Set PWM o/p pin TH0 = pwm_width; //Load timer TF0 = 0; //Clear interrupt flag return; //Return } else { //Start of Low level F0 = 0; //Clear flag PWMPIN = 0; //Clear PWM o/p pin TH0 = 255 - pwm_width; //Load timer TF0 = 0; //Clear Interrupt flag return; //return } } |
Catatan:
Tanda “ ; ” Merupakan tanda awal comment atau keterangan untuk memperjelas detil program. Berlaku pada satu baris dan dipakai dalam bahasa pemrograman ASM saja. Semua yang berada dibelakang tanda ini (dalam satu baris) tidak akan dieksekusi oleh compiler atau dabaikan.
Tanda “//” Merupakan tanda awal comment atau keterangan untuk memperjelas detil program. Berlaku pada satu baris dan biasanya terdapat pada bahasa pemrograman C saja. Semua yang berada dibelakang tanda ini (dalam satu baris) tidak akan dieksekusi oleh compiler atau dabaikan.
Compile dan transfer program kamu tersebut ke dalam microcontroller. Sekarang microcontroller kamu sudah dapat menghasilkan keluaran PWM. Untuk melihatnya, gunakan modul LED atau multimeter sebagai indicator tegangan keluaran yang dihasilkan oleh PWM microcontroller, rubah dan variasikan sesukamu nilai R7 atau “pwm_width” dengan nilai antara 0 s/d 255.
Untuk aplikasi berikutnya, coba gunakan motor DC dan atur kecepatanya. Dan tentunya diperlukan rangkaian motor driver, ingat motor atau perangkat luar lainya jangan dipasang langsung ke microcontroller meski motor “tamiya” sekalipun . Kejutan listrik di tiap pin microcontroller ataupun fluktuasi tegangan dapat membuat microcontroller mudah “hung” (baca: heng) dan cepat rusak. (end.)
-::|Tks-Ari|::-
Artikel ini adalah tulisan rintisan, saran, pertanyaan dan kritik anda sangat berguna dalam mengembangkan artikel ini. Postingan ini dibagi ke dalam beberapa sub pokok bahasan. |
You may share this document under Creative Commons License – Terima kasih telah membaca tulisan ini. © 2011 Ari Sulistiono, Indonesian Electrical Engineer.
Tags: Control System, Ilmu Listrik, Microcontroller