membuat pwm dengan mikrokontroller atmega 128 pada timer 0 dan timer 1.docx

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 un tuk mengatur kecepatan perputaran motor d engan cara mengatur prosentase lebar pulsa high terhadap perioda dari suatu sinyal perseg i 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 san gat 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

Upload: indra-wahyudi

Post on 15-Oct-2015

241 views

Category:

Documents


0 download

DESCRIPTION

Program dan Tutorial singkat membuat PWM pada Mikrokontorller ATMEGA 128 di Timer 0 dan Timer 1

TRANSCRIPT

Membuat PWM dengan Mikrokontroller Atmega 128 pada Timer 0 dan Timer 1

By Indra Wahyudi / 1303121014D3 A Teknik Elektro Industri PENS

PWM merupakan suatu teknik teknik dalam mengatur kerja suatu peralatan yang memerlukan aruspull inyang 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 mewakiliduty cycle0 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 #include int OCR[5]={50,100,200,100,50};int n=0,i=0;

// Timer 0 overflow interrupt service routineinterrupt [TIM0_OVF] void timer0_ovf_isr(void){OCR0=OCR[n];

}

// Timer2 overflow interrupt service routineinterrupt [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 PWMASSR=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: OffTCCR1A=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: DisconnectedTCCR2=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: OffTCCR3A=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: OffEICRA=0x00;EICRB=0x00;EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x41;

ETIMSK=0x00;

// USART0 initialization// USART0 disabledUCSR0B=0x00;

// USART1 initialization// USART1 disabledUCSR1B=0x00;

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

// ADC initialization// ADC disabledADCSRA=0x00;

// SPI initialization// SPI disabledSPCR=0x00;

// TWI initialization// TWI disabledTWCR=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 routineinterrupt [TIM2_OVF] void timer2_ovf_isr(void){n++;if(n==5){n=0;i=0;}}

8 gelombang didapatkan saat Timer 1 overflow.