Welcome

Welcome to My Blog

Thursday, 12 January 2017

MEMBANGKITKAN PWM DENGAN ATMEGA8535



PWM merupakan singkatan dari Pulse Width Modulation adalah sederetan pulsa yang lebar pulsanya (Duty Cycle) dapat diatur.
ATMega8535 dapat membangkitkan PWM dengan menggunakan Timer 0, 1, 2. Timer 0 memiliki PWM 8 bit, Timer 1 memiliki PWM 8, 9, atau 10 bit. Timer 2 memiliki PWM 8 bit.
Terdapat 3 jenis PWM pada ATMega8535, yaitu Fast PWM, Phase Correct PWM, dan Phase and Frequency Correct PWM. Phase and Frequency Correct PWM hanya dimiliki oleh Timer 1.
Output timer ini terdapat pada pin OCn pada ATMega8535 dimana n adalah 0, 1A, 1B, 2 sesuai timer yang dipilih.
Pada artikel ini, akan dibahas cara membangkitkan PWM dengan Timer 0.

Register TCCR0

·       Bit 7 – FOC0: Force Output Compare
Bit 7 dapat kita hiraukan, tetapi untuk pastinya lebih baik bit ini diberi logic 0.
·       Bit 6, 3 – WGM01,00 : Waveform Generation Mode
Bit ini untuk mengatur mode operasi timer 0. Berikut tabel untuk mode operasinya :

Deskripsi bit Waveform Generation Mode

·       Bit 5, 4 – COM01,00 : Compare Match Output Mode
Bit ini mengatur bagaimana output pada pin Output Compare (OC0).


·       Bit 2:0 – CS02:0 : Clock Select
Bit ini untuk memilih sumber clock yang digunakan timer. Berikut tabelnya :


Clock select ini merupakan pembagi yang dapat menentukan frekuensi output. Semakin besar prescaler yang digunakan, maka semakin kecil frekuensi yang dapat didapatkan.

Mode Fast PWM :
Mode ini dapat menghasilkan gelombang pulsa PWM dengan frekuensi tinggi.

Pada mode fast PWM non inverting, counter akan menghitung dari BOTTOM (0x00) sampai MAX (0xFF) dan mengulang kembali dari BOTTOM. OC0 akan di clear apabila counter mencapai nilai compare match antara TCNT0 dan OCR0 dan akan di set saat BOTTOM.
Dari sinilah kita dapat mengatur lebar pulsa atau duty cyclenya. Frekuensi dari pulsa terpengaruh sesuai frekuensi oscillator, dan prescaler yang dipakai. Sedangkan duty cycle dapat diatur dengan mengubah nilai OCR0 dengan range dari 0x00 – 0xFF. Rumusnya adalah sebagai berikut :
Foc0 = Fosc/(N*256)
D = (OCR0/256)*100%
Dimana:
Foc0 = Frekuensi output OC0
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc = Frekuensi clock kristal yang digunakan
256 = Nilai counter BOTTOM(0x00) ke MAX(0xFF)
Frekuensi yang dapat dihasilkan pada mode PWM ini terbatas, tidak seperti menggunakan mode CTC yang frekuensinya dapat bervariasi.
Contoh : Buat program untuk membangkitkan gelombang pulsa dengan duty cycle 50%.

#include <mega8535.h>
#include <delay.h>

// Declare your global variables here

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

// Input/Output Ports initialization
// Port A initialization
PORTA=0x00;
DDRA=0x00;

// Port B initialization
PORTB=0x00;
DDRB=0x08;

// Port C initialization
PORTC=0x00;
DDRC=0x00;

// Port D initialization
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz (1024 prescaler)
// Mode: Fast PWM top=0xFF
// OC0 output: Non-Inverted PWM
//Frekuensi = 4000000/(1024*256) = 15,25Hz
//Periode = 1/15,25 = 0,065 s = 65mS
TCCR0=0x6D;
TCNT0=0x00;
OCR0=0x00;

while (1)
      {
      // Place your code here
      OCR0 = 0x80;//Duty Cycle = (128/256)x100% = 50%   
      }
}

Mode Phase Correct PWM :
Mode ini menghasilkan resolusi Phase Correct PWM yang tinggi.

Pada mode Phase Correct Non Inverting, counter menghitung dari BOTTOM (0x00) ke MAX (0xFF), lalu dari MAX ke BOTTOM. OC0 akan di clear apabila counter mencapai compare match dengan OCR0 saat up counting dari BOTTOM ke MAX dan OC0 akan di set apabila counter mencapai compare match dengan OCR0 saat down counting dari MAX ke BOTTOM.
Untuk menghitung frekuensi dan Duty Cyclenya dapat digunakan rumus berikut :
Foc0 = Fosc/(N*512)
D = ((OCR0*2)/512)*100%

Dimana:
Foc0 = Frekuensi output OC0
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc = Frekuensi clock kristal yang digunakan
512 = Nilai counter BOTTOM(0x00) ke MAX(0xFF) dan MAX ke BOTTOM

Untuk programnya, hanya perlu mengubah inisialisasi pada TCCR0 menjadi mode Phase Correct PWM, dan menghitung frekuensi dan duty cycle dengan rumus diatas.




No comments:

Post a Comment