PIC İLE INCREMENTAL ENCODER (TRD-S500B)

Başlatan SERKANOZMEN, 09 Aralık 2010, 19:35:36

SERKANOZMEN

ARKADAŞLAR MERHABA BAŞLIKTA BELİRTTİĞİM ENCODER I PIC e NASIL OKUTABİLİRİM PBP DA HANGİ KOMUTU KULLANMAM GEREKİYOR PIC18F4550 KULLANACAĞIM BU KONUDA YARDIMCI OLURSANIZ ÇOK SEVİNİRİM İYİ ÇALIŞMALAR

Tagli

Ben datasheet'ini bulamadım. Nasıl birşey bu encoder? Şeması falan var mı?
Gökçe Tağlıoğlu


SERKANOZMEN

Arkadaşlar datasheet linkte ancak pek fazla bilgi vermiyor ben TRD-S500B modelini kullanacağım daha doğrusu onu buldum:-) ilginiz için teşekkür ederim bu arada:-)

http://www.koyoele.co.jp/english/product/encoder/pdf/TRD_S_SH.pdf

Tagli

Datasheet'te de görüldüğü üzere encoder'in 2 besleme girişi ve 3 adet de open drain çıkışı var. Modeline bakacak olursak senin encoder'in beslemesi 10.8 - 26.4 volt aralığında olmalı. Çıkışlarla ilgili grafikler de verilmiş. Dönüş yönünü belirlemek gibi bir amacın yoksa bu çıkışlardan sadece birini kullanabilirsin. Z çıkışının (genelde index olarak adlandırılır) ne işe yaradığını bilmiyorum, encoder'larla çok uğraşmışlığım yok. Çıkışlar open drain olduğundan bunları pull-up dirençleri ile 5 volta çekmelisin. Böylece PIC'e girerken de sorun çıkmaz (direnç olmadan zaten hiç çalışmazlar).

PicBasic bilmediğimden yazılım konusunda yardımcı olamayacağım. Ama hazır komutları bir kenara bırakırsan, elinde 3 yöntem var gibi. Ya program döngüsü içinde sürekli if'leri kullanarak geçişleri sayacaksın, ya bu girişi B0'dan girip kesme ile sayacaksın, ya da bir timer kurup onunla sayacaksın. Bu dediklerim tek giriş için geçerli. 2 giriş kullandığın zaman, sana gelen sinyalin grafiklerdeki 2 şekilden hangisine benzediğini bulup dönme yönünü belirleyebilirsin.

Bazı üst seviye PIC'lerde encoder okumak için dahili modüller var. Bunların kullanımını bilmiyorum, datasheet'lerine bakıp araştırman gerek.
Gökçe Tağlıoğlu

SERKANOZMEN

Tagli hocam verdiğin değerli bilgiler için minnettarım çok teşekkürler kesme işlemi ile saydırma fikri güzel onu deneyeceğim. Açıkça  encoder i bir tanbur a takıp giden kablonun metresini ölçeceğim ve tanbur sararkende metre göstergesi geri sayım yapacak uzun zamandır mevcut işimden dolayı pek programlama  ile uğrasamadım tekrarı olmayan şeyde çabuk unutuluyor neyse ilginiz için çok teşekkürler iyi çalışmalar...

SERKANOZMEN

Tagli hocam mümkünse bir soru daha sormak istiyorum:-)

Hocam ne yapıp ettimse bir türlü encoder ı pic e okutamadım pull-up lar falan tamam fakat olmuyor.encoder ın mil çapı 6 mm ben şöyle bir hesap yaptım mile takacağım tekerlek kabaca 5 cm çapında olacak tekerleğin çevresi 15.7cm bir turda 500 puls üreteceğine göre 1cm de 500/15,7 den 31.84 puls üretecek bunu da kabaca 32puls olarak alırsam  bu 32 puls i hangi komut ile saydırabilirim her 32 pulste 1cm artmasını veya azalmasını istiyorum birde encoder ı pic e bağladığım pin önemli mi belki anlatamadım kusura bakmayın birkez daha yardımcı olursanız çok sevineceğim :-)

İyi çalışmalar Hocam Saygılar...

picmanya

Alıntı yapılan: SERKANOZMEN - 20 Aralık 2010, 08:30:46
Tagli hocam mümkünse bir soru daha sormak istiyorum:-)

Hocam ne yapıp ettimse bir türlü encoder ı pic e okutamadım pull-up lar falan tamam fakat olmuyor.encoder ın mil çapı 6 mm ben şöyle bir hesap yaptım mile takacağım tekerlek kabaca 5 cm çapında olacak tekerleğin çevresi 15.7cm bir turda 500 puls üreteceğine göre 1cm de 500/15,7 den 31.84 puls üretecek bunu da kabaca 32puls olarak alırsam  bu 32 puls i hangi komut ile saydırabilirim her 32 pulste 1cm artmasını veya azalmasını istiyorum birde encoder ı pic e bağladığım pin önemli mi belki anlatamadım kusura bakmayın birkez daha yardımcı olursanız çok sevineceğim :-)

İyi çalışmalar Hocam Saygılar...

bu iş pic' inizde varsa enkoder modülü ile olur.yoksa tavsiyem enkoder modüllü pic kullanmanız.
diğer bir durum ise uygulamanızda tanbur dediğiniz şey kablo sararken ve boşaltırken makara hesabı üst üste dolanarak sarılan ve zamanla makaranın çapını azaltan veya arttıran bir şeyse ve sizde enkoderle yalnızca bu tamburun herhangibir yöne dönüş sayısını hesaplıyorsanız burda kablo metrajını bulmak için sağlam bir mühendislik hesabı olacak gibi uygulama gerçekden böyle birşeyse o mühendislik hesabıda benim kafama yatmazdı ve kablo metrajını daha farklı bir mekanik sistemle ölçmeyi düşünürdüm bu alanda tartım indikatörleri bile var bildiğim kadarı ile.

Alıntı yapılan: Tagli - 10 Aralık 2010, 14:47:56
Datasheet'te de görüldüğü üzere encoder'in 2 besleme girişi ve 3 adet de open drain çıkışı var. Modeline bakacak olursak senin encoder'in beslemesi 10.8 - 26.4 volt aralığında olmalı. Çıkışlarla ilgili grafikler de verilmiş. Dönüş yönünü belirlemek gibi bir amacın yoksa bu çıkışlardan sadece birini kullanabilirsin. Z çıkışının (genelde index olarak adlandırılır) ne işe yaradığını bilmiyorum, encoder'larla çok uğraşmışlığım yok. Çıkışlar open drain olduğundan bunları pull-up dirençleri ile 5 volta çekmelisin. Böylece PIC'e girerken de sorun çıkmaz (direnç olmadan zaten hiç çalışmazlar).

PicBasic bilmediğimden yazılım konusunda yardımcı olamayacağım. Ama hazır komutları bir kenara bırakırsan, elinde 3 yöntem var gibi. Ya program döngüsü içinde sürekli if'leri kullanarak geçişleri sayacaksın, ya bu girişi B0'dan girip kesme ile sayacaksın, ya da bir timer kurup onunla sayacaksın. Bu dediklerim tek giriş için geçerli. 2 giriş kullandığın zaman, sana gelen sinyalin grafiklerdeki 2 şekilden hangisine benzediğini bulup dönme yönünü belirleyebilirsin.

Bazı üst seviye PIC'lerde encoder okumak için dahili modüller var. Bunların kullanımını bilmiyorum, datasheet'lerine bakıp araştırman gerek.

open drainini bilmem ama benim gördüğüm bir kaç model enkoderde birbirinin aynı ve ben enkoder modülü ile bunları picde kullanmak istediğimde enkoder pinlerini ayrı ayrı 33k dirençle toprağa çekiyorum ve aynı pinleri ondan sonra 470R seri direnç üzerinden işlemcimdeki ilgili pinlerine giriyorum.Z kullanıp kullanmamak burda fark ettimiyor hepsi için durum bu.

sizin bahsettiğiniz gibi bir kullanımda sizde bilirtmişsiniz normal cn veya external kesme pinleri ile kullanılıyor.
ben bu yöntemi denedim ama sorunlar yaşadım enkoderin pals sayısı devirle orantılı arttıkça ve çözünürlüğüde yükseldikçe işler karışıp sapıtıyor.çünkü işlemci direkt her palsde bu enkoder darbelerini saymakla uğraşıyor.

bu iş için enkoder modülü şart yoksa işlemcinin başkacada yükleri varsa vay o işi yapanın haline onun yerinde olmak istemezdim.

SERKANOZMEN

Picmanya hocam ilginiz için teşekkürler.

Öncelikle encoderı tanbur bun merkezine takmayacağım kablonun tanbur dan çıktığı yere koyup biri encoder ın miline kuple olan diğeride destek amacli olan lastik tekerin arasından geçireceğim böylece kablo tanbura ne kadar sarılı olursa olsun ben giden veya gelen kabloyu ölçeceğim paintte kabaca birşey çizdim

SERKANOZMEN

resim eklenmiyor neyse üstadlarım önerebileceğiniz bir encoder modülü veya uyumlu bir pic varmı ben 18f4550 kullanmak istiyordum aynı zamanda usb de bilgisayarda göstermek için bu pic i kullanabilirmiyim sabrınızı zorluyorum farkındayım ama bunu yapmak istiyorum.İlgilenen herkese teşekkürler saygılar.

ete

Rotary encoder in okunmasını halletmeden önce çalışma prensibine daha doğrusu dönme esnasında ürettiği kodlara bakmakta yarar var.
Encoderin bir A birde B çıkışı vardır. Kullanman gereken çıkışlar bunlar.  Bu çıkışlar dönme esnasında dönüş hızına bağlı olarak kare dalga pals üretirler ve ürettikleri palsler arasında 90 derecelik faz farkı vardır. Bu farklılık encoder dönüş yönünü bulmanda sana yardımcı olacaktır.


çıkış paslarine bakarsan ve A ile B nin aynı anda okunduğunu düşünürsen faz değişimlerinde okunan değerler şöyle olacaktır.
AB= 01 11 10 00  burdan sonra faz tekrarı yaşanacaktır 01 11 10 00 şeklinde dönüş devam ettikçe bu veriler alınacaktır.
Tabiiki encoderin saat istikametinde döndüğü düşünülerek bu veriler sıralanmıştır. Ters yönde dönmesi durumunda ise çıkan veriler
AB= 01 00 10 11  01 şeklinde olacaktır.

Bu bilgiden sonra okuma işlemine geçebiliriz.
Önce AB uçlarını bir okuruz. Buna Eski diyelim ve AB= %00 olsun
Hemen ardından bir okuma daha alalım buda Yeni olsun ve Yeni=%00 olsun.
Göreceğin gibi Yeni=Eski olduğu için encoderin henüz dönmediğini anlıyoruz.
Encoder dönmediği müddetçe AB=%00 değeri değişmeyecektir. Bu nedenle  Yeni okuma kısmında ayrıca bir sayaç laıştırmakta yarar var. Örnek vermek gerekirse mesela 50 okuma sonunda hala değer değişmemiş ise encoder dönmeyecek demektir ve orda okuma yapmanın bir anlamı kalmayacaktır. O halde çıkıp diğer işlerle uğraşmakta yarar olduğu düşünülüp okuma kısmından ayrılmak daha doğru olacaktır.
Şİmdi okuma kısmına yeniden dönelim.
İkinci okumamızın bu sefer Yeni=%10 olduğunu varsayalım. Bu encoderin döndüğünü gösterecektir.
Bunun üzerine yön tayini yapalım. İlk okumanın 1 biti ("0") ile ikinci okumanın ikinci biti ("1") alınıp XOR işlemine tabi tutulacaktır.
YON=%0 XOR %1  = 1 olacaktır. Bu şu anlama geliyor Encoder saatin tersi istikametinde döndüğü müddetçe ilk okuma bit0 ile son okuma  Bit1 XOR yapıldığı zaman sonuç daima 1 çıkacaktır. Deneyelim, 1XOR 0=1  , 0 XOR 1=1  şeklinde devam edecektir.
Encoder saat istikametinde döndüğü zaman ise XOR değerleri şöyle olacaktır. 0 XOR 0=0 , 1 XOR 1=0 şeklinde devam edecektir.
Yön tayinini yaptıktan sonra;
Şayet Yon=1 ise sayacdan 1 eksilteceğiz değilse sayaca 1 ekleyeceğiz.
IF YON=1 then
SAYAC=SAYAC-1
else
SAYAC=SAYAC+1
ENDIF
şeklinde programı tamamalayıp okuma kısmından çıkacağız.
Encoder okumanın genel prensibi budur. Okuma işi ile programı sürekli meşgul etmemek için A ve B girişleri Pic'in PortB4-7 kesmesine bağlanabilir.
Bu şekilde bu pinlerden herhangi birisinde değişiklik olması durumunda kesme oluşur ve siz orada yukarıda açıkaldığım işlemleri yaparak okuma sonunda sayac değerinizi yöen bağlı olarak artırır yada eksiltirsiniz.

Hepsi Bu kadar
Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

SERKANOZMEN

ETE HOCAM DEĞERLİ BİLGİLERİNİZİ PAYLAŞTIĞINIZ İÇİN MİNNETTARIM GERÇEKTEN ÇOK TEŞEKKÜR EDERİM.TÜM BEKLENTİLERİNİZİN GERÇEK OLMASI DİLEĞİYLE EMEĞİNİZE YÜREĞİNİZE SAĞLIK:-)

alikeskinkilic

encoder ile ilgili birazda yeni başlayanlar için eğitici olabilecek kolay anlaşılır hesap kitap olmadan yazdığım program bu. güzel de çalışıyor enkoderden aldığı verıyı sayıp gönderiyor seri olarak.Yazılan kodlardan ve seri haberleşmenin çok zaman öldürmesinden yavaş biraz 300 hz de isis ile sıkıntı çıkarmadan sayıyor sağ sol sıkıntı yok değerli hocalarıma sormak istediğim bikaç sorum var ama
1-seri haberleşme hızını nasıl arttırabilirim sorusuna yanıt ararken veri iletiminin standardına takıldım örneğin 9600 b de bu programdaki veri yaklaşık olarak 2 ms kadar sürüyor  pic in frekansının ne olduğu arada boşluğu değiştiriyor veri aynı uzunlkta kalıyor bense şöyle birşey yaptım "define OSC 4" ile alıcı ve verici pic i ayarladım ama İSİS de picleri 20 mhz ile çalıştırdım sonuç olarak 400us gibi bir zaman tuttu verinin boyu bu isiste sadece alıcıya  bağlı olan LCD yi etkiledi onuda kod çalışıyormu diye 2500khz de çalıştırınca sorun kalmadı iletişim kuruldu normal devrede de böyle yapsam çalışırmı ?
2- lcd 20 mhz de çalışırken sıkıntı yapıyor bunun bi zaman gecikme kodu vardı onu hatırlayamadım biyerde de bulamadım paylaşırsanız sevinirim
ilginize teşekkürler


'****************************************************************
'*  Name    :ENCODER.BAS                                        *                        ENCODER delik dizilimi   __ I__   porta.0
'*  Author  : [AS]                                              *                                                  --I --  porta.1
'*  Notice  : Copyright (c) 2018 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *                        encoder toplam 4 bitlik veri gönderiyor iki bit A.0 a
'*  Date    : 25.03.2018                                        *                        A0 ın ikinci bitine başlarken A1 in iki biti başlıyor
'*  Version : 1.0                                               *                        oda bittikten sonra bir bitlik ortak 0 değeri geliyor
'*  Notes   :                                                   *                        program bu 4 bitin tamamını birkerede okumak yerine 
'*          :                                                   *                        ayrı ayrı okuyarak her bir bitte adım bilgisini güncelleyip
'****************************************************************                        bitlerin durumuna göre artırıp azaltıyor.

@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Koruma kapalı
'@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullanılmıyor.
@ DEVICE PIC16F628a, HS_OSC
 '@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
 
'-----------------------------------------------------------------

Include "modedefs.bas"          

define OSC 4

TRISB=%00000000 'PortB ÇIKIŞ 
TRISA=%11111111 'A portu tamamı GİRİŞ yapıldı.
CMCON=7 '16F628 de komparatör pinleri iptal hepsi giriş çıkış
PORTA=0
PORTB=0
SYMBOL A = PORTA
AVER VAR WORD
BVER VAR WORD
AVER=100
BVER=0

BASLA:
        
        IF A=%00000000  THEN GOTO SOR        'Optik encoder'in başlangıçtaki
        IF A=%00000011  THEN GOTO SOR1       'değeri bilinmediğinden programla
        IF A=%00000010  THEN GOTO SOR2       'sorgu yapıp ilk adımda hangi yönde 
        IF A=%00000001  THEN GOTO SOR3       'hareket ettiğini anlıyoruz.
        GOTO BASLA
SOR:
        WHILE A=%00000000                    'BASLA da PORTA=0 ise SOR a gelip
        GOTO SOR                             'Port değeri değişene kadar While-
        WEND                                 'Wend arasında bekliyor, değer değişince
        IF A=%00000001 THEN GOTO SAG         'IF komutu ile hangiyönse oraya gidiyor
        IF A=%00000010 THEN GOTO SOL         '
         
SOR1:
        WHILE A=%00000011
        GOTO SOR1  
        WEND      
        IF PORTA=%00000001 THEN GOTO SOL2                
        IF PORTA=%00000010  THEN GOTO SAG2
       
SOR2:
        WHILE A=%00000010
        GOTO SOR2  
        WEND
        IF PORTA=%00000011 THEN GOTO SOL1                 
        IF PORTA=%00000000  THEN GOTO SAG3
        
SOR3:
        WHILE A=%00000001
        GOTO SOR3  
        WEND
        IF PORTA=%00000000 THEN GOTO SOL3                
        IF PORTA=%00000011  THEN GOTO SAG1
                                                                       
SAG:
        AVER=AVER+1                                                             'AVER değişkeni 1 arttırılıp                                     
        WHILE PORTA=%00000001                                                   'Değişkeni korumak için PORTA daki değişimi bekliyor
        serout2   portb.0, 32,["A" ,#AVER]                                      'hazır konum beklerken de AVER değişkenini portb.0 dan gönderiyor
        WEND
        IF PORTA=%00000011 THEN GOTO SAG1
        IF PORTA=%00000000 THEN GOTO SOL3
SAG1:
        AVER=AVER+1
        WHILE PORTA=%00000011
        serout2   portb.0, 32,["A" ,#AVER]
        WEND                 
        IF PORTA=%00000010 THEN GOTO SAG2 
        IF PORTA=%00000001 THEN GOTO SOL2
SAG2:
        AVER=AVER+1
        WHILE PORTA=%00000010
        serout2   portb.0, 32,["A" ,#AVER]
        WEND
        IF PORTA=%00000000 THEN GOTO SAG3
        IF PORTA=%00000011 THEN GOTO SOL1
SAG3:
        AVER=AVER+1
        WHILE PORTA=%00000000
        serout2   portb.0, 32,["A" ,#AVER]
        WEND
        IF PORTA=%00000001  THEN GOTO SAG
        IF PORTA=%00000010  THEN GOTO SOL

  SOL:
        AVER=AVER-1
        WHILE PORTA=%00000010
        serout2   portb.0, 32,["A" ,#AVER]
        WEND
        IF PORTA=%00000011 THEN GOTO SOL1
        IF PORTA=%00000000 THEN GOTO SAG3
 SOL1:
        AVER=AVER-1
        WHILE PORTA=%00000011 
        serout2   portb.0, 32,["A" ,#AVER]
        WEND
        IF PORTA=%00000001 THEN GOTO SOL2
        IF PORTA=%00000010 THEN GOTO SAG2
 SOL2:
        AVER=AVER-1
        WHILE PORTA=%00000001
        serout2   portb.0, 32,["A" ,#AVER]
        WEND
        IF PORTA=%00000000 THEN GOTO SOL3
        IF PORTA=%00000011 THEN GOTO SAG1
SOL3:
        AVER=AVER-1
        WHILE PORTA=%00000000
        serout2   portb.0, 32,["A" ,#AVER]
        WEND
        IF PORTA=%00000010 THEN GOTO SOL
        IF PORTA=%00000001 THEN GOTO SAG
     
    END
Hep meraktan

ete

Encoder okuma işinde bir şey anlamadım. Her şeyi sorgulayarak bulmaya çalışmışsın. Bu programcılık açısından pek iyi sayılmaz. Üstelik program akış hızınıda çok fazla etkileyecek bir şeydir. Yukarıda çalışma mantığını anlatmış idim. Ama anlamadın yada kendi metodunu daha fazla sevdin herhalde neyse bu senin sorunun.
LCD de OSC frekansı arttığı zaman sıkıntı çıkabilir. Bununiçin şu kodları ilave ediver programa.
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Franisto

Ek bilgi olarak benim kullandigim encoderler z cikisindan 360 derecede 1 pulse cikis veriyordu.