Membuat PWM dengan Mikrokontroller Atmega 128 pada Timer 0 dan Timer 1
By Indra Wahyudi / 1303121014
D3 A Teknik Elektro Industri PENS
PWM merupakan suatu teknik teknik dalam mengatur kerja suatu peralatan yang memerlukan arus pull in yang besar dan untuk menghindari disipasi daya yang berlebihan dari peralatan yang akan dikontrol. PWM merupakan suatu metoda untuk mengatur kecepatan perputaran motor dengan cara mengatur prosentase lebar pulsa high terhadap perioda dari suatu sinyal persegi dalam bentuk tegangan periodik yang diberikan ke motor sebagai sumber daya. Semakin besar perbandingan lama sinyal high dengan perioda sinyal maka semakin cepat motor berputar. Sinyal PWM dapat dibangun dengan banyak cara, dapat menggunakan metode analog menggunakan rankaian op-amp atau dengan menggunakan metode digital. Dengan metode analog setiap perubahan PWM-nya sangat halus, sedangkan menggunakan metode digital setiap perubahan PWM dipengaruhi oleh resolusi dari PWM itu sendiri. Misalkan PWM digital 8 bit berarti PWM tersebut memiliki resolusi 2 pangkat 8 = 256, maksudnya nilai keluaran PWM ini memiliki 256 variasi, variasinya mulai dari 0 255 yang mewakili duty cycle 0 100% dari keluaran PWM tersebut. Pada perancangan driver ini, sinyal PWM akan diatur secara digital yang dibangkitkan oleh mikrokontroler ATMEGA 128. Salah satu parameter yang perlu diatur pada sinyal PWM ini adalah periode sinyal dan lebar pulsanya. Lebar pulsa dinyatakan dengan duty cycle yang merupakan persentase dari perbandingan pulsa on (Ton) dengan Ttotal, sehingga %duty_cycle = Ton/Ttotal*100 (%). Untuk mencoba membuat programnya dengan mikrokontroler AVR maka dapat dengan mudah dilakukan menggunakan CodeVisionAVR. Contoh yang digunakan dibawah ini adalah dengan menggunakan ATmega128 yang menggunakan fungsi interrupts pada Timer 1 dan 0. Timer 0 berfungsi untuk mengatur indeks OCR0 dan Timer 1 berfungsi untuk mengatur kapan nilai indeks n akan berubah. 1. Setting Chip
2. Setting Timer 0
3. Setting Timer 1
Program C pada Code Vision AVR
#include <mega128.h> #include <stdio.h> int OCR[5]={50,100,200,100,50}; int n=0,i=0;
// Timer/Counter 3 initialization // Clock source: System Clock // Clock value: Timer3 Stopped // Mode: Normal top=0xFFFF // OC3A output: Discon. // OC3B output: Discon. // OC3C output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer3 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR3A=0x00; TCCR3B=0x00; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; OCR3CH=0x00; OCR3CL=0x00;
// External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off // INT3: Off // INT4: Off // INT5: Off // INT6: Off // INT7: Off EICRA=0x00; EICRB=0x00; EIMSK=0x00;
Dengan menjalankannya pada Proteus dan melihat tampilan sinyal pada osiloskop yaitu sebagai berikut :
Terlihat dari simulasi diatas bahwa setiap 8 gelombang maka nilai OCR akan berganti dari 50,100,200,100,50 OCR0. Yang menyebabkan berubah setiap 8 gelombang yaitu interrupts pada Timer 1 // Timer2 overflow interrupt service routine interrupt [TIM2_OVF] void timer2_ovf_isr(void) { n++; if(n==5) {n=0; i=0; } }