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
CODE:
        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
►Interrupt Service Routine
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

CODE:
//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;
}
►Interrupt Service Routine
CODE:
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 :hammer. Kejutan listrik di tiap pin microcontroller ataupun fluktuasi tegangan dapat membuat microcontroller mudah “hung” (baca: heng) dan cepat rusak.  :nangis (end.)

-::|Tks-Ari|::-

Silahkan baca artikel saya yang lain mengenai microcontroller via RSS Feed..

Informasi! Artikel ini adalah tulisan rintisan, Artikel ini adalah untuk semua orang saran, pertanyaan dan kritik anda sangat berguna dalam mengembangkan artikel ini.   Postingan ini dibagi ke dalam beberapa sub pokok bahasan.
Under "Microcontroller Projects" Folder Creative Commons (cc), Share Alike (sa)

Creative Commons License You may share this document under Creative Commons License – Terima kasih telah membaca tulisan ini. © 2011 Ari Sulistiono, Indonesian Electrical Engineer.