Rotary encoder adalah device elektromekanik yang dapat memonitor gerakan dan posisi. Rotary encoder umumnya menggunakan sensor optik untuk menghasilkan serial pulsa yang dapat diartikan menjadi gerakan, posisi, dan arah. Sehingga posisi sudut suatu poros benda berputar dapat diolah menjadi informasi berupa kode digital oleh rotary encoder untuk diteruskan oleh rangkaian kendali.
umumnya Rotary Encoder memiliki 2 atau lebih output yang menghasilkan pulsa dengan tegangan pada puncak mulai dari 5-24 Volt sesuai dengan jenis Rotary Encodernya. adapun bentuk pulsa yang dihasilkan oleh Rotary Encoder adalah sebagai berikut :
dimana out B tertinggal 90 derajat dari out A, maka logika untuk CW dan CCW nya adalah sebagai berikut :
untuk
memprogram Rotary Encoder dengan menggunakan CV AVR kita menggunakan fasilitas
interrupt yang ada pada mikrokontroller, pengaturannya adalah sebagai berikut :
Mikrokontroller
dengan ATmega 8585
Clock 12 Mhz
Output A Interrupt 0 (PD.2)
Output B di PD.1
LCD Port C
Clock 12 Mhz
Output A Interrupt 0 (PD.2)
Output B di PD.1
LCD Port C
terjadi Interrupt pada saat terjadi transisi naik dari
level logika 0 ke 1
adapun listing programnya adalah sebagai berikut :
#include <mega8535.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
int pulsa;
char count[3];
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
if((PIND.2==1)&&(PIND.1==0)){pulsa++;}
else pulsa--;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
lcd_gotoxy(0,0);
lcd_putsf("counter");
lcd_gotoxy(0,1);
itoa(pulsa,count);
lcd_puts(count);
};
}
Tidak ada komentar:
Posting Komentar