Rotary encoderde hız ?

Başlatan KAZIMUGUR, 07 Ocak 2008, 09:54:52

KAZIMUGUR

Eskileri karıştırırken koyo trd-j 100 kodlu tur başına 100 puls veren bir enkoder buldum.Biraz oynayayım dedim.
Aşağıdaki devreyi kurdum .
Hem proteus da hemde gerçek devre de saniye de 0,5 turdan fazla hız da eksik saydı,yavaş dönerse tam sayıyor.Tur başına 400...
Eski başlıkları okudum.Daha hızlı bile olsa sayması gerek.Optik kuplaj için tavsiyeler olmuş , bir kaç çeşit denedim değişmedi , doğrudan bağladım değişmedi.Kesme önerilmiş denemedim.
Dolaşırken micro-c ile yazılmış bir şeyler buldum , sonuç aynı.
İyice meraklandım.Nerede hata yapıyorum ?

@ DEVICE pic16F877, HS_OSC,WDT_OFF,PWRT_ON,CPD_OFF
@ DEVICE pic16F877, LVP_OFF,PROTECT_OFF,BOD_OFF
 
Define LCD_DREG  PORTD
Define LCD_DBIT  4
Define LCD_RSREG PORTD
Define LCD_RSBIT 2
Define LCD_EREG  PORTD             
Define LCD_EBIT  3
'###############################################
'CMCON=7                   'komparatör iptal 
OPTION_REG.7=0            'Dahili pull-up lar aktif

LCDOUT $FE,1              
'###############################################
ESKI  var BYTE
YENI  var BYTE
YON   var BYTE
SAY   var word 
SAYI  VAR word

CLEAR
'############################################### 
 SAYICI:                     
  
   ESKI=PORTD & %00000011    'oku PORTD.0 PORTD.1
   PAUSE 2                       
   YENI=PORTD & %00000011    'oku PORTD.0 PORTD.1

 IF ESKI=YENI then 
   GOTO SAYICI 
   ENDIF
   ESKI=ESKI & %00000001     'sadece PORTD.0 ı oku
   YENI=YENI>>1              'sadece PORTD.1 ı oku
   YON=ESKI^YENI             'PORTD.0 XOR PORTD.1

 IF YON=1 then  
    SAY=SAY+1      'yukarı                  
  ELSE 
   SAY=SAY-1       'aşağı                         
   
  ENDIF
      LCDOUT $FE,$80," SAYI : ",DEC5 SAY
           
 GOTO SAYICI






DOSYA <<<

z

Eski ve yeni degisklenlerini okurken aradaki delay zaten işi bozuyor. Ayrıca LCD rutinin ana döngü içinde olması da sorunlardan birisi.

Eski değişkenle yeni değişkeni peşpeşe okumaya gerek yok. Zaten  bir önceki döngüde okunan yeni, artık eski.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ete

z arkadaşıma katılıyorum.
Eski bir defa okunacak Yeni farklı oluncaya kadar arka arkaya okunacak.

İşlem sayısını mümkün olduğunca aza indirgemekde lazım. Ayrıca araya bir gecikme koymamak gerekir.
Birde aşağıdaki kodu dene bakalım;

@ DEVICE pic16F877, HS_OSC,WDT_OFF,PWRT_ON,CPD_OFF
@ DEVICE pic16F877, LVP_OFF,PROTECT_OFF,BOD_OFF
 
Define LCD_DREG  PORTD
Define LCD_DBIT  4
Define LCD_RSREG PORTD
Define LCD_RSBIT 2
Define LCD_EREG  PORTD             
Define LCD_EBIT  3
'###############################################
'CMCON=7                   'komparatör iptal
OPTION_REG.7=0            'Dahili pull-up lar aktif

LCDOUT $FE,1             
'###############################################
ESKI  var BYTE
YENI  var BYTE
YON   var BYTE
SAY   var word
SAYI  VAR word
symbol A=ESKI.0
SYMBOL B=YENI.1

CLEAR
'###############################################
BASLA:                     
 
   ESKI=PORTD & %00000011    'oku PORTD.0 PORTD.1

SAYICI:
   YENI=PORTD & %00000011    'oku PORTD.0 PORTD.1

 IF ESKI=YENI then SAYICI

   YON=A^B
   SAY=SAY+(2*yon)-1             'PORTD.0 XOR PORTD.1

       LCDOUT $FE,$80," SAYI : ",DEC5 SAY
           
 GOTO BASLA
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Prof.EleCTroN

RB Change kesme özelliği ile sayma işlemini yapıp ana programda da LCD programını çalıştırırsanız muhtemelen sorun çözülecektir.

KAZIMUGUR

İlgilenen arkadaşlarıma teşekkür ederim.

@ete hocam , verdiğinizi aynen denedim.Sonuç fazla değişmedi.
Devredede proteusdada doğru okuma hızı 2 katına çıktı.
Lakin biraz daha hızlanınca yine kaçırdı.
Proteusda frekans 400 iken sorun yok , 800 yapınca bariz şekilde fark var.
8MHz kristali bir kaç kez değiştirdim sonuç aynı.

Birde kesme önerilerini inceleyeceğim.
@Prof.EleCTroN hocam programın hepsi bu başka döngü yok.

Böyle bir sorun kullanılan dil ile ilgili olabilirmi ?

Prof.EleCTroN

Sorunun kullanılan dille ilgili olduğunu zannetmiyorum, LCD ye veri yazma işleminde mikrodenetleyici çok meşgul oluyor bu yüzden yüksek hızlarda encoder çıkışındaki değişimleri algılayamıyor.

Buna çözüm olarak programı 2 'ye bölebiliriz. (Encoder çıkışını PORTB nin 4 ... 7 arası pinlerinden ikisine bağlamalıyız.)
1)Ana Program: PORTB 'nin RB4 ... RB7 değişimlerinde kesme üretecek şekilde donanımı ayarlamalı ve Kesme programıyla sürekli güncellenen sayaçları istediğimiz gibi işleyerek sürekli LCD' ye yazdırmalıyız.
2)Kesme Programı:  Her değişimde ilgili sayaçları güncellemeliyiz. (devir/dakika cinsinden bulmak istersek birde zamanlayıcı kesmesi kullanmalıyız yada mcu yüksek hızlarda çalıştırıp kısa süreli zaman kesmelerinde hem okuma hemde devir/dakika işlemi yaptırabiliriz ama iki kesmeyi birlikte kullanmak daha sağlıklı.)

Klein

PIC de var mı? yok mu? bilmiyorum ama hemen her işlemcinin doğrudan sayıcı girişleri var.  Port okuyup  saymak yerine bu sayıcı girişini kullanmak hızınızı artırabilir.  Ayrıca optokublör kullanıyorsanız lojik çıkışlı hızlı optolar kullanmak daha da artırabilir. Amam encoder'in de illaki bir sınırı vardır.

Prof.EleCTroN

Alıntı yapılan: "Klein"PIC de var mı? yok mu? bilmiyorum ama hemen her işlemcinin doğrudan sayıcı girişleri var.  Port okuyup  saymak yerine bu sayıcı girişini kullanmak hızınızı artırabilir.  Ayrıca optokublör kullanıyorsanız lojik çıkışlı hızlı optolar kullanmak daha da artırabilir. Amam encoder'in de illaki bir sınırı vardır.
Hocam normalde o tür sayıcılar sadece yükselen yada düşen kenarı sayıyor. O zaman yönü ve konumu nasıl anlayabiliriz? (dsPIC lerde bu encoder için hazır donanım vardı.)

dombilik

kesme kullanarak deneme yaptınızmı sonuçlarını merak ettimde :)
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

rree

Rb0/Int kesmesi daha mantıklı sayılması gereken clock sinyalleri.
Devir yönü değişimi  kesmeye bağlmak  okuma hızını ek yuk getirecektir.
Clok sinyali geldiğinde kesme oluşur. Kesme  proğramı devir yönüne bakarak sayacı  azaltır veya yükseltir. Ana proğram ise sayac değerini lcd ye gönderir. Sinyal yönü için girişte faz farkına bakılarak yön tespiti için
jk Ff kullanıyordu hatırlıyorum.Hız önemli ise sinyal yön bulma işlemini mikro denetleyiciyi yüklememek gerektiğini düşünüyorum. Motor kontrolünde böyle bir devreye benimde ihtiyacım var sonuçları bekliyorum.

Prof.EleCTroN

Gray Coding for Clockwise Rotation
Phase A B
1 0 0
2 0 1
3 1 1
4 1 0

Gray Coding for Counter Clockwise Rotation
Phase A B
1 1 0
2 1 1
3 0 1
4 0 0

(http://en.wikipedia.org/wiki/Rotary_encoder)

Eğer aynı encoder dan bahsediyorsak RB0 ucunu ya A yada B ye bağlamak zorundasınız. Yukarıdaki gray kodlara bakarsak her bit 2 konumda 1 kere değiştiğine göre her kesmede OPTION_REG in INTEDG bitini değillemeniz gerekiyor ve
1)Ara konumlar algılanamıyor.
2)Ayrıca yönüde belirlemek için yine işlemler yapılması gerekiyor.
3)Yön ve konum önemli değilse mikrodenetleyicinin sayıcısının saat girişini harici olarak seçip A yada B ucunu bağlayın ve hiçbir işleme gerek kalmadan okuma yapın. (Encoder çözünürlüğü 100 ise bir turda 25 sayım yapılır.)
4)Yön ve konum önemli değilse http://members.cox.net/rbirac2/Ebot/EbotImages/encdisks.gif böyle birşey kullanılabilir.

Edit: 50 yazmışım  8O  25 olacaktı   :)

KAZIMUGUR

Sizler  kadar usta olmadığım için hemen yazılımı değiştiremiyorum.
Kesme içerisinde yön bilgisi sorun oldu .Bu arada kesmeleri iyice öğrenmiş olacağım.

Böyle bir encoderin bağlı olduğu bir sayıcıyı 3-5 ay önce onarmıştım.Tuşları bozulmuş basmaz olmuş filan.
İçerisinde tms370c722na vardı.
Encoderden gelen sinyal pc817 lerden geçiyor ve sonra hctl-2016 da çözümlendikten sonra işlemciye giriyor.Gerisini bilmiyorum tabii.Onda gösterge led displaydi.
Başka tip işlerden hatırladığım pc817 ler ucuz ama yüksek hızlarda yetersiz.
hctl eski ama iyi bir şeydi.Çok pahalı idi az bulunuyor idi.Uzun zamandır bilgim yok kullanmadım.

Edit : Az arayla yollamışız sizin mesajı yeni gördüm.
Herhalde aynı encoder çünkü A-B çıkışlarındaki sinyaller dediğiniz gibi.
Okurken değişikliğe bakıldığı için sinyallerin inen kenarıda çıkan kenarıda değerlendirilmiş oluyor."decoding quadrature encoders".
Bu her hangi bir projenin parçası değil , merak sonucu başladım ama öğrenmekde zevkli ve yararlı olacak.
Tek yönlü sayma ile yüksek hızları okumuş idim.Buradaki gibi değilde basit optik-yarıklı disk gibi şeylerle.
Burada ilgi çekici olan yön bilgisininde olması.Eskiden kapılarla yaparken yön bilgisini yukarı-aşağı say kapısına girmek yetiyordu.

rree


KAZIMUGUR

Benzeri bağlantıyı kullandım , encoderin içerisindede var.
Uzun hatlardaki gürültüleri önleme açısından olabilir ama buradaki sorun o değil gibi.Her şey zaten masanın üzerinde ve sinyal şekillerinde bir hata yok.

İnterrupt diye biraz gezindim.PBP da sorun var diye algıladım.
Uzun zaman öncede benzer sorunlarla yazılar yazılmış.Hemde ustalar tarafından , demek beni aşıyor.
microchip notlarında R.E. okumak için dsPIC kullanılmış.
Hele biraz daha dolanayım.

https://www.picproje.org/index.php/topic,9909&highlight=interrupt
https://www.picproje.org/index.php/topic,9179&highlight=interrupt
https://www.picproje.org/index.php/topic,395&highlight=interrupt

Aşağıdaki adresde encoderler hakkında güzel bilgiler var.
http://www.motion-control-info.com/

Edit : Bu iş sadece pbp yu değil 16f877 yi de aşacak gibi  :)



http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011730

40.000 rpm de 400 puls hassasiyetten söz eden magnetik R.E. lere rastladım.Utandım ben 2 tur bile okuyamadım  :oops:

KAZIMUGUR

LCD işi bozuyorsa birine okutayım diğerinde göstereyim diye düşündüm.
Sayıyı portlardan birine eşitleyeyim dedim en büyük sayı 256 olacak , okunan sayıyı hserout ile göndermeyi denedim.



Daha kötü sonuçlar aldım.Belkide seri iletişimi iyi bilmediğim için olabilir.

CLK 150 den sonra hata başladı bile...

DOSYA <<<