Kebanyakan mikrokontroler AVR memiliki kanal PWM di dalam chip-nya. Fasilitas ini membuat penggunaan PWM menjadi lebih sederhana dan lebih akurat. Timer atau Counter dalam AVR dapat digunakan dalam modus PWM tanpa mengganggu fungsi dasar timer. Timer1 dapat di-konfigurasi dalam modus PWM dengan men-setting bit PWM11 dan PWM10 dalam register TCCR1A.
PWM11 | PWM10 | Description |
0 | 0 | PWM operation of Timer/Counter1 is disabled |
0 | 1 | Timer/Counter1 in 8-bit PWM Mode |
1 | 0 | Timer/Counter1 in 9-bit PWM Mode |
1 | 1 | Timer/Counter1 in 10-bit PWM Mode |
Prescale dapat dipilih melalui register TCCR1B.
Lebar pulsa di-load ke dalam timer output compare register OCR1A (OCR1AH dan OCR1AL) dan OCR1B (OCR1BH dan OCR1BL). Timer/Counter1 bertindak sebagai up/down counter, menghitung naik dari 0000H hingga TOP, kemudian berbalik menghitung turun hingga nol, demikian seterusnya. Ketika nilai counter sama dengan isi dari 10-bit OCR1A atau OCR1B, pin OC1A dan OC1B di-set atau di-clear sesuai dengan setting bit dari COM1A1/COM1A0 atau COM1B1/COM1B0 dalam Timer/Counter1 Control Register (TCCR1A).
PWM Resolution | Timer Top Value | Frequency |
8-bit PWM | $00FF (255) | Ftck1/510 |
9-bit PWM | $01FF (511) | Ftck1/1022 |
10-bit PWM | $03FF (1023) | Ftck1/2046 |
COM1X1 | COM1X0 | Effect on OCX1 |
0 | 0 | Not Connected |
0 | 1 | Not Connected |
1 | 0 | Cleared on compare match, up-counting. Set on compare match down-counting (non-inverted PWM) |
1 | 1 | Cleared on compare match, down-counting. Set on compare match up-counting (inverted PWM) |
Berikut adalah contoh dalam Bahasa C:
#define PULSE_WIDTH 0x40
void pwm_start()
{
OCR1AL = PULSE_WIDTH; //Load Pulse width
OCR1AH = 0;
DDRD |= (1<<5); //PortD.5 as o/p
TCCR1A = 0x81; //8-bit, Non-Inverted PWM
TCCR1B = 1; //Start PWM
}
Frekuensi yang dapat digunakan untuk aplikasi motor, tergantung pada kualitas motor dan kemampuan H-bridge yang digunakan. Motor yang digunakan pada power window mobil atau mainan, bekerja dengan baik pada frekuensi 500 Hz hingga 1 kHz. Beberapa motor kelas “high-end” bekerja dengan mulus pada 20 kHz. H-bridge 754410 dan L293D telah diuji dan berjalan dengan baik pada frekuensi 5 kHz.
Berikut adalah contoh pemrograman dengan BASCOM-AVR:
$regfile = "m8535.dat"
$crystal = 4000000
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 50
Dim Dummy As Integer
Dim Potvalue As Integer
Config Pind.5 = Output
Config Pind.4 = Output
Config Timer1 = Pwm , Prescale = 64 , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Interrupts
Enable Timer1
Config Adc = Single , Prescaler = 64
Start Adc
Ocr1ah = 0
Ocr1ah = 0
Do
Potvalue = Getadc(0)
Dummy = Potvalue / 2
Dummy = Dummy / 2
Ocr1bl = Dummy
Loop
End