Mungkin anda sudah pham pengertian dari PWM (Pulse Width Modulation). Disini akan
menjelaskan beberapa istilah yang berhubungan dengan PWM sehingga nantinya akan
mempermudah teman-teman dalam pembuatan sinyal PWM menggunakan Timer pada AVR.
Gambar diatas merupakan sinyal PWM dengan amplitudo 5 volt. Dari gambar diatas dapat
diketahui pengertian dari 1 periode gelombang, yaitu lamanya interval waktu dalam 1 panjang
gelombang, gambar diatas mempunyai periode 10 ms. sedangkan duty cycle, yaitu lamanya
pulsa high (on) selama 1 periode, terlihat bahwa lamanya duty cycle 7 ms. Biasanya duty cycle
ditulis dalam satuan persentase (%). Jika dari gambar diatas ingin mengubah duty cycle kedalam
persen yaitu:
Jika periode suatu gelombang diketahui, maka dapat dihitung berapa frekuensinya,
menggunakan:
F=1/T
F = Frekuensi (Hz)
T = Periode (detik)
Maka frekuensi dari gambar diatasa adalah F = 1/10 ms= 100 Hz.
Untuk menghasilkan sinyal PWM pada AVR digunakan fitur timer. AVR Atmega 8535
mempunyai 3 buah timer, tetapi disini saya akan membahas Timer0 dan Timer1 saja yang
digunakan untuk membangkitkan sinyal PWM. Pada dasarnya Timer0 dan Timer1 mempunyai 4
buah mode untuk membangkitkan sinyal PWM. Untuk lebih jelasnya teman-teman baca
datasheet saja.
Disini saya akan membangkitkan sinyal PWM menggunakan Timer0 dan timer1 dengan
menggunakan 2 buah mode saja, yaitu Phase Correct PWM dan Fast PWM. Untuk pengertian
dan penjelasan masing-masing mode dapat dilihat didatasheet ATmega8535, silakan download
datasheet ATmega8535 disini..
Output pin PWM pada Atmega8535 terdapat pada 2 buah pin yaitu PD4 (OC1B) dan PD5
(OC1A).
>>>Timer0<<<
Mode Phase Correct PWM
Foc0 = Fosc/(N*512)
D = (OCR0/255)*100%
Dimana:
Foc0=FrekuensioutputOC0
N=Skalaclock(mempunyainilai1,8,64,256dan1024)
D=Dutycycle
Fosc = Frekuensi clock kristal yang digunakan
>>>Timer1<<<
Mode Phase Correct PWM
Foc1a = Fosc/(2*N*TOP)
Foc1b = Fosc/(2*N*TOP)
D = (OCR1X/TOP)*100%
ModeFastPWM
Foc1a=Fosc/(N*(1+TOP))
Foc1b=Fosc/(N*(1+TOP))
D = (OCR1X/TOP)*100%
Dimana:
Foc1a=FrekuensioutputOC1A
Foc1b=FrekuensioutputOC1B
N=Skalaclock(mempunyainilai1,8,64,256dan1024)
D=Dutycycle
Fosc=Frekuensiclockkristalyangdigunakan
TOP = nilai maksimum counter (TCNT1), TOP mempunyai 3 buah nilai untuk kedua mode
tersebut yaitu 8 bit (FF), 9 bit (1FF) dan 10 bit (3FF)
Sekarang saya akan membuat aplikasi membangkitkan sinyal PWM dengan periode 20 ms
dengan duty cycle 75%, menggunakan Timer1 10 Bit Mode Fast PWM.
Dengan menggunakan kristal 12 Mhz, N = 256 dan TOP = 10 bit = 3FF = 1023
Maka akan didapat frekuensi output (Foc1x) sebesar 45,77 Hz atau jika diubah kedalam peroide
21,8 ms ≈ 20 ms
Untuk aplikasi diatas berikut adalah setting untuk CodeVision CodeWizard AVR. Clock Value
bernilai 46.875 berasal dari Fosc/N atau 12 MHz/256.
Penjelasan diatas adalah untuk membangkitkan sinyal PWM sesuai dengan output yang kita
inginkan, sedikit sulit memang. Tetapi pada dasarnya banyak sekali aplikasi yang menggunakan
PWM tanpa harus memperdulikan kepresisian periode output, contohnya pengaturan motor DC.
Untuk aplikasi pengaturan motor DC sangat simple sekali programnya.
#include <mega16.h>
#include <delay.h>
int potensio;
void main(void)
{
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0×00;
DDRD=0×30;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 46.875 kHz
// Mode: Ph. correct PWM top=03FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA3;
TCCR1B=0×04;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×02;
OCR1AL=0xFF;
OCR1BH=0×00;
OCR1BL=0×00;
// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0×84;
while (1)
{
potensio=read_adc(0);//membaca nilai ADC potensio
OCR1A=potensio;//nilai potensio diumpan ke register PWM untuk ngatur kecepatan motor
};
}