AVR
Contoh Timer-Counter-PWM
AVR ATmega16
EruOktober 2009
PENS
Modes
Normal Mode
Clear Timer on Compare Match (CTC)
Mode
Fast PWM Mode
Phase Correct PWM Mode
Output, OC0
Disconnect
Toggle on Compare Match
Clear on Compare Match
Set on Compare Match
Interrupt
Value
Counter 0
Buat program untuk menghitung jumlah
barang menggunakan sensor
optotransistor dan peraga LCD
+
PC
T0
ATmega16
LCD
Jumlah digit
= 3 + ASCIIZ
Inisialisasi
Tanpa static, tiap
perulangan tmp akan
di-create ulang
Timer 0
Hampir selalu, timer berkaitan dengan
interupsi
Buat program pembangkit multi-channel
PWM (8 channel) menggunakan timer 0
dan PORTB
Data PWM pada variable
unsigned char PWM[8]
Prinsip
Timer diberi nilai
awal (Load) saat
inisialisasi
Isi counter akan naik
sampai mencapai
FFH dan kembali ke
00H
Saat isi
timer/counter
kembali ke 00H
akan muncul
interupsi TOV0
Pada rutin interupsi,
nilai awal counter
diisi kembali
(Reload)
Interupsi
Timer Overflow
td
255
Nilai Timer
Naik
nd
Nilai Awal
Nilai Awal
(inisialisasi)
ReLoad
0
tTOV0
Persiapan
FPWM = 100 Hz (frekuensi PWM)
RPWM = 256 (resolusi PWM, 8 bit)
FTOV0 = 256 x 100 Hz = 25,600 kHz (f clock PWM)
Fclock = 4 MHz (f clock timer/counter)
?
Pembagi = 4 MHz / 25,6 kHz = 156.25 157 clock
Pembagi = Prescaller x Hitungan Counter
Prescaller = 1 (dipilih)
Hitungan Counter = 157 clock
TCNT0 awal = 256 - 157 = 99 (63H)
Menggunakan Interupsi Timer 0 Over Flow (TOV0)
Hasil Simulasi :
173 clock per interupsi
Atau fTOV0 23,121 kHz
Mengapa ?
Inisialisasi
Kesalahan
Perhitungan
Loncat, butuh
sekitar 1 clock
Hasil Simulasi :
173 clock per interupsi
Atau fTOV0 23,121 kHz
Mengapa ?
td
nd
tx
nx
tTOV0
Diperlukan waktu
saat terjadi
interupsi, loncat
ke rutin interupsi,
sampai titik nilai
TCNT0 diisi ulang
(sekitar 16 clock
sistem, menurut
simulasi)
Solusi, pilih
frekuensi timer
serendah
mungkin untuk
mengurangi efek
loncatan
Tugas
Buat pembangkit gelombang kotak
dengan frekuensi 1 kHz melalui
Port sembarang
Pin OC0 (menggunakan register OCR0)
Prinsip
Timer diberi nilai
awal (00H) saat
inisialisasi
255
Isi counter akan naik
sampai mencapai
Nilai Timer
OCR0 dan kembali
Naik
ke 00H secara
otomatis
Saat isi
Nilai Awal
(inisialisasi)
timer/counter
mencapai OCR0
akan muncul
interupsi OC0
Pin OC0 dapat
0
digunakan untuk
membangkitkan
gelombang tertentu
Interupsi
OC0
td
reclear
Nilai OCR0
nd
tOC0
Persiapan
FPWM = 100 Hz
RPWM = 256
FOC0 = 256 x 100 Hz = 25,600 kHz
Fclock = 4 MHz
Pembagi = 4 MHz / 25,6 kHz = 156.25
Prescaller = 1
OCR0 = 157-1 = 156 (9CH)
Menggunakan Interupsi OC0
Inisialisasi
Waktu yang dicapai
157 1 clock
Dari mana 1 clock ?
Persiapan
FPWM = 20 kHz
RPWM = 256
FClockPWM = 20 kHz x 256 = 5,12 MHz
FClockCPU = 4 MHz
Prescaller = 1
Ditentukan (mengapa ?)
FClockPWM = 4 MHz
FPWM = 4 MHz / 256 = 15.625 kHz
Inisialisasi
Contoh
Buat program untuk menghasilkan
gelombang sinus dengan frekuensi 100
Hz dan amplitudo 2 volt
OC0
AVR
ATmega16
Persiapan
FSinyal = 100 Hz
FSampling > 2 x 100 Hz 4 kHz
mengapa ?
FClockCPU = 4 MHz
Prescaller = 1
Ditentukan
FClockPWM = 4 MHz
FPWM = 4 MHz / 256 = 15.625 kHz
Inisialisasi
Apakah keluaran
dari sistem ini
berupa tegangan
bolak-balik (ac) ?
Berapa frekuensi
tertinggi yang dapat
dihasilkan dengan
cara ini ?
Bagaimana caranya
untuk mendapatkan
frekuensi
gelombang lebih
dari beberapa kHz ?
Misalkan untuk
audio 15 ~ 20 kHz
Persiapan
FPWM = 10 kHz
RPWM = 256
FClockPWM = 10 kHz x 256 x 2 = 5,12 MHz
FClockCPU = 4 MHz
Prescaller = 1
Ditentukan
FClockPWM = 4 MHz
FPWM = 4 MHz / (2 x 256) = 7.8125 kHz
Inisialisasi
16-bit Timer/Counter1
Features
Modes
Normal Mode
Clear Timer on Compare Match (CTC)
Mode
Fast PWM Mode
Phase Correct PWM Mode
Phase and Frequency Correct PWM Mode
Operasi 16 Bit
Normal Mode
Frequency Counter
Tachometer
Modes
Normal Mode
Clear Timer on Compare Match (CTC)
Mode
Fast PWM Mode
Phase Correct PWM Mode
Normal Mode