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