Jika teman-teman masih bingung mengenai fitur Timer dan Counter serta eksternal interupsi
dapat membacanya pada menu Tutorial Timer dan Counter dan Interupsi Eksternal.
Berikut adalah listing program lengkapnya:
int
float
char temp[8];
frekuensi=0;
pulsa;
#include <mega16.h>
#include <lcd.h>
#include <delay.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=015 ;PORTC
#endasm
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
frekuensi++;//baca frekuensi (pulssa) yg masuk ke INT0 trus di increament
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)//timer 1 detik untuk membaca pulsa yg masuk
ke INT0
{
// Reinitialize Timer 1 value
TCNT1H=0xD23A >> 8;
TCNT1L=0xD23A & 0xff;
pulsa=(float)frekuensi*60/20;//formula perhitungan kecepatan
frekuensi=0;
lcd_clear();
}
void tampilkan_LCD() //menampilkan data kecepatan di lcd
{
lcd_gotoxy(0,0);
lcd_putsf(ElektrO-cOntrOl);
ftoa(pulsa,1,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
lcd_gotoxy(0,5);
lcd_putsf(RPM);
}
void main(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=000;
TCCR1B=005;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=000;
ICR1L=000;
OCR1AH=000;
OCR1AL=000;
OCR1BH=000;
OCR1BL=000;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR|=040;
MCUCR=002;
MCUCSR=000;
GIFR=040;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=004;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=080;
SFIOR=000;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm(sei)
while (1)
{
tampilkan_LCD();
};
}
Sumber :
http://elektro-kontrol.blogspot.co.id/2011/06/penghitung-kecepatan-motor-dc.html
Pengontrolan motor DC secara sederhana dibagi menjadi dua. Pertama yaitu dengan mengatur
arah putaran dan besarnya kecepatan dari putaran motor. Arah putaran motor secara prinsip di
atur dengan membalikan polaritas tegangan yang masuk ke motor. Sedangkan besarnya
kecepatan putaran motor diatur dengan mengatur tegangannya. Mekanisme pengaturan ini
ditangani oleh driver motor.
Driver motor yang digunakan banyak jenisnya. Yang paling sederhana dan mudah dijumpai
adalah driver dengan tipe IC L293D dan L298. Driver ini masing-masing memiliki kemampuan
memberikan arus maksimal motor sebesar 1A dan 4A. Untuk motor-motor kecil yang memiliki
rating arus rendah sangat cocok menggunakan driver motor ini.
Selain jenis IC di atas untuk driver motor, banyak lagi tipe lainnya. Biasanya tipe yang
digunakan disesuaikan dengan motor yang dikontrol. Semakin besar rating arus motor, maka
driver motor yang digunakan juga semakin mahal. Untuk mengatasinya maka driver motor
dirancang sendiri dengan komponen MOSFET. Prinsip kerja rangkaian driver MOSFET ini
menggunakan konsep H-Bridge. Berikut adalah salah satu contoh rangkaian driver MOSFET.
Input masukkan ke driver diperoleh dari mikrokontroler. Pada artikel ini akan dibahas contoh
sederhana pengontrolan motor DC dengan PWM. Dengan membuat rangkaian sederhana berikut
ini dengan Proteus, kita dapat mensimulasikan pengontrolan motor DC secara mudah
Untuk mengatur arah putaran motor 1 (atas) yaitu dengan memberikan sinyal 1 atau 0 ke pin IN1
dan IN2. Sedangkan untuk motor 2 (bawah) yaitu pada IN3 dan IN4. Sedangkan untuk mengatur
kecepatan motor yaitu pada EN1 dan EN2 untuk ke motor 1 dan motor 2. Sinyal 0 atau 1 ini
dapat dihasilkan dari port mikrokontroler dengan mengaturnya sebagai output, yang dapat
langsung mengatur arah putaran. Sedangkan EN1 dan EN2 masukkannya berupa sinyal PWM.
PWM atau Pulse Width Modulation adalah suatu teknik modulasi sinyal dengan memvariasikan
lebar pulsanya. Berikut adalah contoh sinyal PWM,
Salah satu parameter yang perlu diatur pada sinyal PWM ini adalah periode sinyal dan lebar
pulsanya. Lebar pulsa dinyatakan dengan duty cycle yang merupakan persentase dari
perbandingan pulsa on (Ton) dengan Ttotal, sehingga %duty_cycle = Ton/Ttotal*100 (%). Untuk
mencoba membuat programnya dengan mikrokontroler AVR maka dapat dengan mudah
dilakukan menggunakan CodeVisionAVR. Contoh yang digunakan dibawah ini adalah dengan
menggunakan ATmega16 yang dipasang frekuensi clock 11.05920 MHz.
Yang perlu diubah adalah parameter Clock Value 10.800 kHz, Mode Fast PWM top = 00FFh,
Out. A dan Out. B Non. Inverting. Dengan mengatur Clock Value 10.800 kHz maka periode
timer adalah 1/10.800 kHz = 92.6 uS. Maksudnya adalah kenaikan register Timer1 yaitu
TCNT1 akan increment (naik satu kali) setiap 92.6 uS. Karena dipilih nilai top dari timer adalah
00FFh atau 255 maka periode PWM total adalah sebesar 255*92.6 uS = 23.61 mS. Untuk
mengatur duty cycle yaitu dengan memasukan nilai ke register OCR (OCR1A atau OCR1B)
yang nilainya 0 255. Dimana Ton yang akan dihasilkan memiliki waktu sebesar OCR*92.6 uS.
Maka jika nilai OCR = 128, Ton adalah 128*92.6 uS = 11.85 ms. Untuk membuktikannya dapat
dilihat dengan menggunakan Osiloskop pada simulasi dengan Proteus. Dimana prinsip kerjanya
dapat dilihat pada gambar berikut
Kode yang dihasilkan adalah sebagai berikut (dengan menghapus beberapa bagian baris program
yang tidak digunakan)
#include
// Declare your global variables here
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=0x00;
DDRD=0xFF;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 10.800 kHz
// Mode: Fast PWM top=00FFh
// 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=0xA1;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
while (1)
{
PORTD.0 = 1;
PORTD.1 = 0;
OCR1B = 128;
};
}
Dengan menjalankannya pada Proteus dan melihat tampilan sinyal pada osiloskop yaitu sebagai
berikut
Terlihat bahwa hasil yang diperoleh sesuai perhitungan yang dijelaskan pada paragraf
sebelumnya. Pada program ini motor bergerak pada kecepatan setengahnya karena duty cycle
yang diberikan adalah 50%. Agar kedua motor bergerak maka pada while(1) tinggal ditambahkan
kode sebagai berikut
while (1)
{
PORTD.0 = 1;
PORTD.1 = 0;
OCR1B = 128;
PORTD.2 = 1;
PORTD.3 = 0;
OCR1A = 128;
};
Dari tutorial ini sudah dijelaskan bagaimana cara pengendalian motor DC dengan mengatur arah
dan kecepatannya dari mikrokontroler AVR. Pengendalian motor DC ini sebagai dasar dalam
pengontrolan robot-robot jenis beroda seperti Line Follower atau Robot Pemadam Api. Hal yang
sangat perlu diperhatikan adalah pemilihan frekuensi PWM yang tepat ke driver motor yang
masuk ke dalam motor DC. Namun, pada tutorial ini tidak dibahas pemilihan frekuensi PWM
yang tepat untuk pengendalian motor DC. Pembahasan lengkap akan dijelaskan pada tulisan
berikutnya.
Sumber :
http://www.saripudin.net/2013/04/pengendalian-motor-dc-menggunakan-pwm.html