avatar_mustafa

encoder kullanımı

Başlatan mustafa, 26 Mayıs 2012, 11:21:42

mustafa

arkadaşlar merhabalar.
Aşağıdaki gibi basit bir program yazdım.Encoderdan verileri alıp Devir /dakika yı daha sonra da bu değerden metre/dakikayı bulmak için ama count komutu bu konuda işe yaramadı.İlk defa encoder kullanacağım için bu konuda biraz zayıfım.Bu yüzden faydalanabileceğim örnek kod , devre yada önerisi olan arkadaşlar yardımcı olurlarsa sevinirim.İyi günler dilerim.

ete

Aşağıdaki linkte bir örnek var.

http://etepic.com/index.php?topic=336.0

Encoder okuma, senin düşündüğün gibi yapılmaz.
Encoderin iki çıkışı vardır (aslında 3 ABC şeklinde adlandırılır ama 2 sini AB kullanacağız).
A çıkışından bir kare dalga sinyali çıkar. B den de kare dalga sinyali çıkar ama A ya göre 90 drece faz farkı vardır.
Bu şu demektir. A sinyali B den yarım faz öndedir. Yini birinde HIGH süresinin yarısında B HIGH olur A lowa düşünce B HIGH olmaya devam eder ve  A nın orta konumunda B de LOW olur. Kısaca B ayı yarım faz geriden takip eder.
Bu özellik encoderin dönüş yönünü tayin etmede kullanılır. Encoder okumanın aslı temeli en az iki okuma yapılması ve iki okuma arasında mutlaka konum farkı olması gerekir. Örnek vermek gerekirse AveB başlangıçta %00 ise ikinci okuma %10 oluncaya kadar ikinci okuma yinelenir. Sonra Birinci okumanın A biti ile İkinci okumanın B biti XOR yapılarak yön  bulunur.
Yön değerine bağlı olarak , Yon 0 ise SAYAC=SAYAC-1 , Yon=1 ise SAYAC=SAYAC+1 yapılır.
Yukarıda veridğim örnekde yön bilgisi 4013 d flipflop kullanılarak elektronik olarak tespit edilir ve pice bir pinden yön bilgisi girilir. O pine bağlı olarak SAYAC değeri artırılır yada azaltılır.
Anlayacağın üzere arada bir durması gereken COUNT komutu ile encoder okunamaz. Okumanın sürekliliği olması gerekir. Bende sürekli olan yöntemi anlattım.
Ete

F®T

ete hocam selamlar.butonlu pot encoder uçlarının orta ayak şase yan ayaklar a ve b faz uçlarımı olacak.bu bağlantı standartmı acaba?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Farklı olanı görmedim. Standart olsa gerek. Kendi data sheetlerinde de aynı bağlantı veriliyor.
Ete

F®T

#4
Alıntı yapılan: F.T - 09 Ağustos 2013, 22:45:34
hocam encoder i çevirdiğimde değer fazladan zıplamalar yapıyor ileri sayacağına geri sayıyor benim mantıktamı sorun var .a b uçları 10 k ile artıda orta uç şase ınt0 kesmesi ile işlem yapıyorum değişkene aktarıyorum ama stabil çalışmıyor.(kesmede ayrıca başka işler için tmr0 kullanıyorum)sizin kullandığınız gibi 4013 kullandım.puls çıkışı ınt0 kesmesi girişine yön bilgisi de başka bir girişte.


IF INT0F=1 THEN
                                      'IF INT0 KESMESİ OLMUŞSA ENCODER YÖNÜNE GÖRE ARTI VEYA
INT0E=0                                     
                                               'EKSİ DEĞER PULSEK DEĞİŞKENİNE YÜKLENİR PULS EK İSE HANGİ DEĞİŞKEN ise ona eşlenir

IF YUKARI_ASAGI=0  THEN PULSEK=PULSEK+1  'encoder artırma
IF YUKARI_ASAGI=1  THEN PULSEK=PULSEK-1   'encoder eksiltme


INT0F=0
TMRBYRK=0
INT0E=1
TMRAC=1       
RESUME
ENABLE

"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

4013 lü sistemi encoder okumalarında boşuna yön hesabı yapmamak için uğraşıp bulmuş idim.
Gerçekte bir kaç defa yapıp deneme imkanım oldu. ÇAlışması fena değil ama sende de olduğu gibi zaman zaman çalışmasında anlam veremediğim sakatlıklar oluyor.  Örneğin bir tespitim şu, 4013 biliyorsunuz D-FlipFlop, 7474 de bir D flip flop ama bu devrede kullanımları fark oluşturuyor. Mesela 4013 kullanırsanız RS bacakları birleşip bir direnç ile GND ye çekilmesi gerekir iken 7474 kullanıldığında aynı ucun +5V ta çekilmesi gerekiyor. Sebebini bilemiyorum. Bunu deneme yanılma ile buldum.
Elbette açık şemalarını inceleyerek bir yorum yapılabilir.

Bu sistemi aslında üzerinde çalıştığım Digital Güç kaynağında encoderin hızlı tepki verebilmesi için yön tespitini entegreye yaptırmak amacı ile bulmuştum. Ancak sonradan gördümki hızda çok fazla bir şey fark etmiyor. Hatta entegresiz encoder okumanın bazı faydaları oluyor. Sonuçta bende terk ettim.

Encoder pinleri A ile B nin ayrı ayrı kesmeye bağlanması daha doğru. Zira bir yönde çevirince A pini kesme oluşturuyor diğer yönde B pini kesme oluşturuyor. Yalnızca birini kullanınca kesme işinde gecikmeli çalışma oluyor buda encoder okumada sakınca yaratıyor.
Bu bakımdan en doğrusu encoder pinlerini PortB değişiklik kesmesine bağlamak.
Tavsiyem şu yönde, entegreli kullanımı bırak direk A ve B pinini PortB 6-7 pinlerine bağla.
Programın başlangıcında
SYMBOL YA=OLD.6
SYMBOL YB=NEW.7  şeklinde tanımlama yap.
BASLA satırından evvel ESKI=PORTB & (%11000000) şeklinde bir encoder pinlerini oku.

kesme oluşunca ;
YENI=PORTB & %11000000
şeklinde okuma yap.
YON= YA ^YB  şeklinde Yön tayini yap.
SOnra ;
IF YON=1 THEN
   PULS=PULS+1
ELSE
   PULS=PULS-1
ENDIF
şeklinde puls artırımı yap.
Kesmeden çıkmadan önce ,
ESKI=YENI şeklinde atama yap veya ESKI=PORTB & %11000000 şeklinde okuma yapıp kesmeden ayrıl.

Encoder okuma programı amaca göre bazı düzenlemeler gerektirir. Kullandığım yöntemlerin bazılarını açıklamaya çalışayım.
Her şeyden önce mutlaka iki okuma yapılıp karşılaştırılması gerekiyor. Birine ESKI diğerine YENI okuma diyoruz.
Encoder dönüyor ise ESKIDEN sonra yapılan YENİ okuması mutlaka farklılık göstermesi gerekir. Ama bu farklılık okuma hızından daha yavaş olabilir. Bu bakımdan ESKI=YENI ise bir sayacı çalıştırıp yeniden okuma yapmaya yönlendirmek gerekir.
Örneğin 100 okuma yaptın ve hepsinde YENI=ESKI ise encoder dönmüyor anlamına gelmelidir. Zaten arada değişiklik yakalanmış ise encoder dönüyor demektir.
Benim muhtelif programlarımda bu çalışmaların örnekleri mevcuttur.

Ete


F®T

hocam vakit ayırdığınız için teşekkürler.4013 yöntemi ni kullandığınız için bende yön tayini için işlemciye yüklenmeyelim diye donanımsal tercih etmiştim.aslında çogu zaman sıkıntı olmuyor ama oldumuda çok tuhaf durumlar oluşturuyor.tahminim dediğiniz gibi 4013 yapısı ile alakalı.yoksa kesme oluşuyor şartlar belli neden ileri geri saysın yada komut ters algılansın.sonuçta kontrol sıkıntısı hoş olmuyor. zaafiyetleri malesef var.siz daha önceki bu kullanımlarınızda optimum kullanımı sağlamak için ne gibi değişiklikler yapmıştınız.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Aslında olumsuz kullanım koşulu yön pininden kaynaklanıyor. Encoderin miline bir yöne doğru kuvvet uygulamaz isen sanırım yön tespiti float gibi bir o yöne bir bu yöne gidip geliyor. Bunu bir stabilize edebilsek sorun çözülür diye düşünüyorum. Mesela değerli bir elektrolitik bağlansa belkide anında yön bir low bir high diye gidip gelmez diye düşünüyorum. İstersen bir dene.
Bu tür (4013 lü) encoder kullanımını hiç bir sabit projemde kullanmadım. En son LPG sisteminde yapıp denedim. Orada sorunsuz çalışıyor idi.
Ete

F®T

aslına bakarsanız bende 100nf bağladım ve  tatilden dolayı fırsat olmamıştı. en kısa sürede dener sonucu paylaşırım.
sıkıntı devam ederse pcb bittiği için en kötü ınt0 ve ınt1 kesmesi ile dediğiniz gibi direk kontrol etmeyi düşünüyom .işlemci zaten çok hızlı 64mhz,sıkıntı olmaz diye düşünüyom.motor pulslerinin sayılmasından dolayı sıkıntı olmasından korktuğum için yük binmesin amacı ile bu yöntem uygundur diye düşünmüştüm.ama puls kaçırma sorunu olmadığı için bunun yazılımsal olarakta sıkıntı yapacağını sanmıyorum.iyi tatiller .teşekkürler.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F®T

Sanırım sorun belli oldu.a ve b faz çıkışları encoder içerisinde sağlıklı temas edip çıkış vermiyor.buda kesme ileri geri yön tayininin değişimine yol açıyor aynı zamanda parazit oluşturduğu için kesme içinde sayaç fazla zıplıyor.a ve b fazlarına sase ile aralarına 1 uf attım bi nebze azaldı ama çokta saglıklı değil.sanırım aldığım encoder çokta kaliteli değil.yazılımsal olarakta düzeltemedim.
sonuç encoder bozuk çıktı.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Bir ara hall sesörlüsünü bulmuştum istanbulda selanik pasajı en alt katta merdivenden inince sağdaki en sonda olan dükkanda.
Ete

F®T

süper bir malzemeymiş.o tip bir malzeme kullanımının sorunsuz olacağını düşünüyorum.

şu anda elimdekini söktüm ve 4 adet temas noktasının baskılarını sertleştirdim.şase a fazı ve şase b fazı arasına olası parazitleri engellemek için 100nf seramik multi kondansatör kullandım ve sorunumu %80 çözdüm.yöndede sorun yok zıplamalardada.ama malzeme kalitesinin önemi burdada ortaya çıktı.yoksa yazdığınız kodlardan şüpelenip duruyorsunuz buda çok vakit kaybettiriyor.hocam iyi çalışmalar.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

sinancnc

merhaba arkadaşlar benim 500 devir civarlarında dönen bir milin devrini pic ile okuma fikrim var meslekten bildiğim bu işin en iyi encoderle yapılabileceği
fakat ben encoderle hiç bir bilğim yok. Şimdi mantık gereği düşündüğümde bir + ucu bir - ucu ve birde pals ucu vardır diye düşünüyorum ve bir pic word değişken atayarak sürekli 1 ve 0 ları saydırarak 10 turu 100 turu şeklinde matamaiksel hessaplarla lcd aktarmaya bakıyor diye düşünüyor ve doğrularım ve yanlışlarımla bilgilerinizi rica ediyorum.

Ayrıca teknik dökümanı olan bir encoder önermenizide ria edeceğim.

Saygılar.
Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

ete

#13
Rotary encoder denilen aletler efak elektrik motorlarına benzerler. İçlerinde bir bir ve mile bağlı bir disk bulunur. Disk üzerindeki yarık veya delikler kullanılarak milin dönmesi anında puls ler üretilir. Genelde bir encoder de iki tane besleme ucu , bir tane A çıkışı bir tane B çıkışı ve birde C (veya Z) çıkışı bulunur. A ile B arasında 90 dercelik faz farkı bulunur. Bu faz farkı encoder milinin döndüğü yönün bulunmasını sağlar. C çıkışı ise tur başına bir puls üretir.
Bu aleti kullanarak devir ölçmenin yolu aslında basittir. A veya B çıkışlarından birisini PORTB.0 kesmesine bağlarsın. Sonra zaman tutup gelen pulsleri sayarsın.  Devir için birim zamanda gelen puls sayısı önem kazanır. Bu nedenle ya bir Timer kullanıp pulsleri saymak yada zaman tutmak gerekir. İşi biraz daha ileri götürürsek, TMR0 veya TMR1 sayaçlarından birisini dışarıdan girişle tetiklenecek halede getirebilirsin. Böylece her bir sayacın kendi giriş pininden gelen pulsleri saymasını sağlarsın. Sana düşen yalnızca zamanı tutmak olur. süre sonunda gidip sayaç değerini okuduğun zaman devir hesabı için yeterli done elinde olmuş olacaktır.
Kabaca işin nasıl yapılacağını anlattım. Daha ince detay istemeden bir incele anlattıklarımı sonra gerekirse ince detaylara gireriz.

Ete

sinancnc

teşekkürler ete hocam. Basit bir encoder le mantığı anlamak için denemem olacak. önerdiğiniz bir encoder varsa onu alayım.
Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

Powered by EzPortal