ATmega8535 merupakan salah satu mikrokontroler buatan Atmel yang memiliki banyak kegunaan. Harga mikrokontroler ini tergolong murah saat ini jika dilihat dari fasilitas yang dimilikinya. ATmega8535 memiliki empat port yang dapat digunakan untuk banyak masukan atau keluaran, memiliki ADC, Timer dan fasilitas lainya. Keuntungan lain mikrokontroler ini adalah cara memrogramnya juga mudah karena tidak memerlukandownloader yang sangat merepotkan seperti mikrokontroler generasi sebelumnya karena dapat diprogram menggunakan sistem minimalnya.
·
Timer
1 (16 Bit)
Untuk perhitungan timer 1 dapat menggunakan rumus :
Ttimer 1 = Tosc*(65536-TCNT1)*N
→(16 Bit = 65536 ≈ 2^16)
Contoh penggunaan untuk timer 1 detik
(Timer1 = 1 detik) dengan crystal 12 MHz dan menggunakan skala clock 1024 maka
akan menghasilkan :
Tosc = 1/Fosc = 1/12 = 0,083
1 = 0.083*(65536-TCNT1)*1024
TCNT = 53818 = D23A (Hexa desimal)
Berdasarkan perhitungan tersebut di
dapatkan D23A, maka nilai tersebut harus diinputkan ke register TCNT1 agar
timer 1 bernilai 1 detik. Berikut ini contoh penggunaannya pada Code vision AVR
:
Program contoh untuk timer 1 detik
;lampu
nyala mati (kedip-kedip)
;dalam
interval 1 detik
;————————————
loop:
cbi portb,0
cbi portb,1
cbi portb,2
cbi portb,3
rcall timer1d
sbi portb,0
sbi portb,1
sbi portb,2
sbi portb,3
rcall timer1d
rjmp loop
timer1d:
ldi r16,
0b00000100 ; aktifkan enable intrupt
out TIMSK,
r16
ldi r16,
high(-timer_value) ;masukkan nilai timer
out TCNT1H,
r16
ldi r16,
low(-timer_value)
out TCNT1L,
r16
ldi r16,
0b00000101 ; masukkan prescaler untuk timer
out
TCCR1B,r16 ; disini 1024
looptimer:
in r17,TIFR
sbrs r17,TOV1 ;tunggu
sampai timer1 overflow flag set
rjmp looptimer
ldi r16,
0b00000100 ;Timer 1 overflow flag dinolkan dengan
out
TIFR,r16 ; memberikan logika 1
ret
|
2. Ketika
ingin membuat counter 100 maka tinggal menambahkan program pada Reinitialize
Timer 0 value loop++
if (loop>=100)
{
data++;
loop=0;
}
danpada program utama
if(data==100)
{
led_clear();
data=0;
}
lcd_gotoxy(0,0);
lcd_putsf("elektro-control");
itoa(data,temp);
lcd_gotoxy(0,1);
};
|
3. Desain
pembangkit sinyal frekuensi 100 Hz dengan Timer/Counter.
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:
Duty cycle = (interval pulsa high dalam 1 periode/periode
gelombang)*100%
Sehingga gambar
diatas mempunyai duty cycle sebesar 70%.
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.T = Periode (detik)
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.
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%
Foc0 = Fosc/(N*512)
D = (OCR0/255)*100%
Mode Fast PWM
Foc0 = Fosc/(N*256)
D = (OCR0/255)*100%
Foc0 = Fosc/(N*256)
D = (OCR0/255)*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
Foc0 = Frekuensi output OC0
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc= Frekuensi clock kristal yang digunakan
Timer1
Mode Phase Correct PWM
Foc1a = Fosc/(2*N*(1+TOP))
Foc1b = Fosc/(2*N*(1+TOP))
D = (OCR1X/TOP)*100%
Foc1a = Fosc/(2*N*(1+TOP))
Foc1b = Fosc/(2*N*(1+TOP))
D = (OCR1X/TOP)*100%
Mode Fast PWM
Foc1a = Fosc/(N*(1+TOP))
Foc1b = Fosc/(N*(1+TOP))
D = (OCR1X/TOP)*100%
Foc1a = Fosc/(N*(1+TOP))
Foc1b = Fosc/(N*(1+TOP))
D = (OCR1X/TOP)*100%
Dimana:
Foc1a = Frekuensi output OC1A
Foc1b = Frekuensi output OC1B
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc = Frekuensi clock kristal yang digunakan
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)
Foc1a = Frekuensi output OC1A
Foc1b = Frekuensi output OC1B
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc = Frekuensi clock kristal yang digunakan
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)
4.
Nilai OCR yang harus diisi jika diinginkan sinyal tersebut (soal
no 3) mempunyai z duty cycle 75%
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 Duty cycle:D = (OCR1X/TOP)*100%
75% = (OCR1X/1023)*100%
OCR1X = 767 = 2FF (dalam hexa)
Untuk membangkitkan periode yang
benar-benar presisi pada sinyal PWM sangat sulit sekali karena kita hanya mampu
memanipulasinya lewat 3 parameter saja yaitu, frekuensi kristal
yang kita gunakan (tidak semua nilai frekuensi kristal ada dipasaran), skala
clock atau N (hanya mempunyai nilai 1, 8, 64, 256, 1024) dan TOP
(untuk kedua mode diatas mempunyai 3 buah nilai 8, 9 dan 10 bit). Dengan
kombinasi ketiga variabel diatas kita harus benar-benar dapat menentukan
periode output yang kita inginkan, menurut saya itu sangat sulit sekali.
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.
Baiklah
sekarang saya akan mengimplementasikan aplikasi pengaturan kecepatan motor DC
menggunakan input yang berasal dari potensiometer. Cara kerjanya kecepatan
motor DC diatur oleh potensio yang nilainya didapat dari pembacaan ADC. Untuk
PWM nya saya gunakan hasil dari yang diatas (Timer1 10 bit mode Fast PWM).
Berikut adalah setting untuk CodeWizard AVR dan schematicnya:
Berikut
adalah listing program lengkapnya (sangat simple):
#include <mega16.h>
#include <delay.h>
int potensio;
#define ADC_VREF_TYPE 0×00
// Read the AD conversion
result
unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0×40; // Wait for the AD conversion to complete while ((ADCSRA & 0×10)==0); ADCSRA|=0×10; return ADCW; }
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;
// Analog Comparator initialization
// Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0×80; SFIOR=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 }; } |
0 comments:
Post a Comment