PICBASICPRO VE OPTİK ENCODER

Başlatan asm_Coder, 07 Nisan 2003, 10:35:59

asm_Coder

ARKADAŞLAR OPTİK ENCODERİ MİKROKONTROLERE BAĞLAMA VE
PIC BASIC PRO İLE KOD HAZIRLAMA BÖYLE BİR UYGULAMA İLE İLGİLİ YARDIMLARINIZI BEKLİYORUM..
y=f(x);

mhk

Merhaba... Daha önce yaptığım basit bir frekans ve devir ölçer programı. Optik encoderi pic'e bağlamak için ,encoderin çıkışı pals şeklinde olmalıdır. Yani +5V ve 0 şeklinde , bu çıkışı 16F84 b portu 6 numaralı girişine bağlarsan ve istediğine göre kodları değiştirirsen sanırım başarabilirsin. Bu program için 16F84 kullanılmıştır. Frekansın tam hesaplanması için kristal frekanıs 4Mhz yerine , 3,2768 Mhz kullanılmıştır. Bazı encoderler tam bir devirde birden fazla pals üretir bazıları ise her devirde bir pals üretir. Bunu çözdükten sonra program kodlarında oynama yaparak amaca ulaşabilirsin sanırım. Başarılar.  

DEFINE LCD_COMMANDUS 20
DEFINE LCD_DATAUS 10

frekans var word
frekans1 var word
timer   var byte

gec1    var bit
gec2    var bit
   
@       device WDT_OFF

TRISB = %11110011          ' PORTB nin tüm bitlerini giriş ve çıkış olarak ayarla
   TRISA = %00000000          ' PORTA nın tüm bitlerini çıkış olarak ayarla

OPTION_REG = %00000110        ' Set TMR0 configuration and enable PORTB pullups
  INTCON = %10100100            ' Enable TMR0 interrupts

  On Interrupt Goto kesme
portb.2=0
pause 40


'************************** değişken başlangıç değerleri *****************************
frekans1=0:timer=0:gec1=0:gec2=0
'***********************************   ANA PROGRAM  **********************************
gosub ekrangoster

anaprogram:


if gec1=1 then dvm01
       if portb.6=0 then
           frekans1=frekans1+1:gec1=1
       endif


dvm01:

if portb.6=1 then gec1=0



goto anaprogram


'************************************************  KESME ALT PROGRAMI  ********************************************
disable                                          ' Kesmeyi iptal et
kesme:
timer = timer + 1  
 
  If timer < 25 Then tiexit                               

              timer = 0

frekans=frekans1
gosub ekrangoster

frekans1=0           
tiexit:

   INTCON.2 = 0                               ' Zamanlayıcı kesmesini sıfırla
          Resume                           ' Ana programa geri dön

'********************************************************** EKRAN GOSTER *****************************************************
ekrangoster:
LCDOUT $FE,2,"<Devir> "
LCDOUT $FE,$C0," ",dec4 frekans," "

return

ekransil:
   LCDOUT $FE,1
return

end
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

Erol YILMAZ

Optik encoderi okuman aslinda cok basit ama cesitli parametreleri ayarlaman gerekiyor. Mesela  1 saniye de kac pals sayman gerekiyor. 10-20 civarinda mi yoksa 300 400 gibi veya daha fazla mi? Interrupt kullanmanın herzaman avantajlı olmayacagini dusunuyorum. Otomobil uzerinde bir uygulama yapıyorsan  parazit oldukca fazla olur, interrupt ın ne kadar basarili olacagini dusunmen lazim.

 Ayrica bildigin gibi optik encoderden 2 adet sinyal ucu cikar. A ve B, bunlarin durumuna gore 4 kat daha fazla hassasiyette okuma islemi yaptirabilirsin. tabii ki yon durumunu da bu A ve B sinyallerine gore belirleyeceksin.
Benjamin Kuo'nun OTOMATIK KONTROL SISTEMLERI adli Turkceye cevrilmis kitabında konu anlatilmistir. Literatur Kitabevi.

asm_Coder

VERDİĞİNİZ BİLGİLER İÇİN ÇOK TEŞEKKÜRLER..YAPMAK İSTEDİĞİM OLAY TAM OLARAK ŞU: ENCODER İLE 0.01MM HASSASİYETLE ASENKRON MOTORU KONTROL ETMEK.PROBLEMDE ŞU  :ENCODER A YÖNÜNE DÖNDÜĞÜNDE HEM
A PULSI VERİYOR HEM B PULSI..B YÖNÜNE DÖNDÜĞÜNDEDE AYNI ŞEKİLDE
A VE B PULSI VERİYOR..BU YÜZDEN MOTORUN HANGİ YÖNE DÖNDÜĞÜ BİLGİSİNİ VE ÖLÇÜYÜ EKRANA YAZDIRAMIYORUM..MOTORUN DÖNÜŞ YÖNÜNÜ AYIRAN ENCODERLERİN İSMİNİ BULDUM FAKAT BUNLARI PİYASADA BULAMIYORUM..BU ENTEGRELERİN İSİMLER..LS 7083 VE LS 7084 VE
HCTL-2016..BUNLARIN YERİNE KULLANABİLECEĞİM BAŞKA MANTIK DEVRESİ
BİLİYORSANIZ LÜTFEN YARDIMLARINIZI BEKLİYORUM..PROJEMİ BİTİRMEM
İÇİN AZ BİR ZAMANIM KALDI.. :cry:
y=f(x);

Salih

Picbasic mail listden aldığım programı gönderiyorum.

You may try this:

'Program to read a rotary encoder with a BS2
'Writed by ACJacques - January 2001
'direction could be reversed by simply changing A B inputs

new var nib           '(use a byte here for PBP)
old var nib           '(use a byte here for PBP)
direction var bit     'direction flag bit
n var word            'variable for counting

new.bit0 = in7   'input A on pin 7
new.bit1 = in5   'input B on pin 5

start:
old = new
loop:
new.bit0 = in7
new.bit1 = in5
if new = old then loop: 'stay looping if not change
direction = new.bit0 ^ old.bit1  'XOR to determine direction
if direction = 1 then left:
if direction = 0 then right:
goto start:

left:
n=n+1 'increase counter
goto printa:

right:
n=n-1 'decrease conter
goto printa:

printa:
debug home
debug sdec5 n,"  ", cr  
goto start:

Bu programdaki mantığı kendine uyarlayabilirsin.
Kolay gelsin

asm_Coder

hangi entegreyi nasıl kullanmam gerekiyor...heriki yöndede a ve b fazları veriyor..
benim anladığım kadarı ile saat yönünde bir fazı ters yönde ise diğer fazı almamı sağlayacak bi lojik ara yüz devresi tasarlamalıyım..

lütfen tardım lütfennnnn :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:
y=f(x);

Salih

Herhangi bir ara yüze ihtiyacın yok.
Çünkü encderın 4 ucu vardır. Bunlardan iki + ve - beslemedir.
Diğer iki ucu A ve B çıkış uclarıdır. Bazı enkoderlarda Z çıkış ucuda
vardır. Bu uç bir başlangıç noktası tesbiti için kullanılır. Sen
kullanmayabilirsin. Encoderı 5 v ile beslersen tavsiye ederim direk
pic uclarına uyarlayabilirsin. Programa dikkat edersen yön tesbiti mevcuttur.
Encoderın uclarını tesbit edemiyorsan akım sınırlamalı 5v uygulayarak
deneme yoluyla bulabilirsin . Tabii bir osilaskop yardımıyla. Beslemeyi doğru
tesbit edersen AB uçlarından 90 derece faz farklı kare dalga alman gerekir.

Erol YILMAZ

Selam BTIGER kardes;
En basta o tip entegreler baya bir pahalidir. HCTL2016 'ya 35$ falan dyorlardi. almadim tabii ki :)

Optik encoder de olay sudur;

- İki adet sinyal çıkışımız var A ve B
- simdi A sinyalinin clock palsi oldugunu varsay.
- Clock palsinin 1 den 0 ' a dustugu noktalarda B 'yi okuyacagiz.
- Eger B=1 ise yon ileri, B=0 ise yon geri olacak. Olay tamamen bundan ibaret.

Insaallah anlatabilmisimdir.

Kolay Gelsin[/quote]