Anda di halaman 1dari 9

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 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
OCR0=OCR[n];

}

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{

n++;
if(n==5)
{n=0;
i=0;
}

}



void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x10;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=0xFF
// OC0 output: Non-Inverted PWM
ASSR=0x00;
TCCR0=0x6A;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
TCCR2=0x03;
TCNT2=0x00;
OCR2=0x00;

// 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;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x41;

ETIMSK=0x00;

// USART0 initialization
// USART0 disabled
UCSR0B=0x00;

// USART1 initialization
// USART1 disabled
UCSR1B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here

}
}


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;
}
}

8 gelombang didapatkan saat Timer 1 overflow.

Anda mungkin juga menyukai