Enkoder okuma iyileştirme

Başlatan ipek, 18 Şubat 2017, 22:24:50

skara1214

12f675 gibi birşeyle uğraşcağınıza 18f2431 gibi üstünde encoder modulu bulan bir işlemci ile uğraşşanız? Belki filtre v.s değerleriyle oynayıp sıkıntısız sonuçlar alabilirsiniz.Yalnız burada dikkatimi çeken birşey var. Sinyal şekli kareden üçgene  dönüyorsa o encoder o hızlar için uygun  değildir gibime geliyor. Bahsettiğiniz yöntemler sadece yara bandı tarzı bir uygulama olmuş. Daha hızlı response veren encoder kullansanız daha iyi olur.
Herkes ölür ama herkes gerçekten yaşamaz

ipek

@skara1214
elbette fikirleriniz benim için değerli.. fakat tek bir monostable IC waveform'u hemen düzeltip disiplin edebiliyor, ve yüksek hızlara sorunsuzca tırmanabiliyor,
benim asıl sorunum sisteme ilk voltajı verdiğimde yada durdurup başlattığımda Enc girişleri 11 'de kalabiliyor ve sistem sapıtıyor,diğer taraf hazır devre olduğu için müdahele edemiyorum normal encoder mantığında iki bit'lik truth table'de yer alan her komum bir kod,benim maksadım kodu okumak değil ,interrtup her geldiğinde sadece o truth table'yi sisteme aktarabilmek ,interrupt yok iken çıkışta yok,one shot mantığı çok basittir,benim talihsizliğim her hangi bir uygulamada rastlayamamış olmam,Wend mantığı buna pek yakın ama kesme içinde wend verirsem kesmedende çıkmıyor,yada ben çıkaramıyorum :D
özet basit bir şey olsun donanım arzu etmesin...

Maxim

soru: çıkışların high olma zaman süresi ms cinsinden ne olabilir?
min-max ms?

ipek

50ms low 150ms High olabilir mesela..


JOKERAS

Debounce'dan kaynaklı bir sorun gibi.
Hani buton okumada meydana gelen olay varya işte aynısı.
Buton okurken ne oluyor?
Butona bastığımız ve bıraktığımız anda oluşan Debounce ortalığı mahvediyor.
Kare dalga diye tabir ettiğimiz sinyallerin hiçbiri kare değilki,sadece biz öyle olduğunu sanıyoruz.
Hız arttıkça sinyal  Kare'den uzaklaşır.
Ama bunun önemi yok.Çünkü bizim için önemli olan sinyalin histeri bölgesi.
Pic girişleri Schmitt Trigger,yani bizim sinyalimizin yükselen ve düşen Flash bölgelerini tespit edebilecek kabiliyette.
Schmitt Trigger giriş o gürültüden patırtıdan etkileniyor.

Debounce Filitresi. Bence şöyle bir yöntem uygularsanız sorunu çözersiniz diye tahmin ediyorum.

İlk düşen veya yükselen interrupt geldiği anda interrupt rutininde IOC İnterruptını kapatacaksınız.
İlk yükselen veya düşen kenarımız geldi ve İnt oluştu,bu gelen kenarlar parazit olabilir.
Bunu tespit etmek için Timer counterı sıfırlayıp Timer interruptını başlatın.
Timer sayıyor tabi bu sırada sayısız IOCgeliyor ama işlemci "hadi ordan serseri" diyerek bu IOC İnterruplarını tanımıyor.
Çünkü İlk düşen veya Yükselen kenarda kapattıkya.
Belirlediğimiz bir zamanda taşan Timer, taştığında İnt rutinine giriyor ve IOC portuna bakıyor Yükselen kenarsa PORT logic 1'mi?
Düşen Kenarsa Port Logic 0'mı diye.Logic 0 olduğunu varsayarsak.Evet bu kadar zaman geçti ve  Port Logic 0.O zaman bu parazit değil!Doğru bilgi.
Timer bloğunda IOC Kenarını değişitir IOC İnteruptını aç.Aynı işlemleri Yükselen kenar için uygulayıp deneyin.

Pic bu işi yaparken bayağı meşgul olacak,Display falan fıstık varsa Encoderi dönderdiğinizde Displayde
titreme olur,başka kritik işler varsa gecikmeler olur.Onun için Encoderi donanım olarak içinde barındıran Picler var.
Ayrıca yeni Piclerde CLC (Configre Logic Cell) diye bir donanım var,her türlü Logic giriş olarak konfigre edilebiliniyor.
Bir bakın isterseniz.




ipek

bugün 4 saat Glitch filitreler ile uğraştım Bourns Grayhill ve ALPS firmalarının önerilerini denedim, eh iyiye yakın performans fakat MC14490'ın kalitesine bile yanaşamadım,Y.Müh bir dostum var sanayi elektroniğinle haşır neşir, bizde genelde HP Avago HCTL2001....32  serisi sırf encoder okuyan bu iş için dizayn edilmiş IC'ler ile donatılmıştır tek bir pulse bile kaçırmaz  deyince ,kısa bir araştırma yaptım,hevesim kırılmadı ama kısır döngü'de kaldım,hardware her zaman iyidir..

Maxim

ben bu hafta yoğunum pek vakit bulamıyorum ayrıca nasıl bir yol izlemek lazım kararda veremedim.
yani eksiksiz bir liste yapabilirsek iş kolaylaşacak

yukarıda verdiğiniz elm401ds entegresinde yapılan gibi (kaldıki %99.99 o da 12 serisi bir pic)
-girişi int ile algıla
-bilmem kaç ms gecikme ver
-x frekansı kadar bir filtreleme yap
-yüksek frekansları filtreleme yap
-şöyle yap
-böyle yap
gibi

ete

Baştan aşağı mesajları okudum. Ne istenildiğini anlamaya çalışıyorum sadece. Çünki daima problemi bilirseniz çözüm üretebilirsiniz bilmezseniz debelenip durursunuz.
Tespit ettiğim husu şu. İki tane encoder pini var. Bunlar faz farkı ile kesme oluşturuyor ve her biri bağımsız bir çıkışı belirli süre high low yapacak. Sürelerde bir birlerini etkilemeyecek. Etkilemeyecek derkenbirisi pause kullanıp HIGH yaparken diğerine tetik gelmiş ise oda high konumuna geçmesi gerek ama önceki pause komutunu icra ediyor olacağı için ikincinin emri yerine getirilemeyecek demektir. Kısaca bu iş pause komutları ile olmaz. Döngüsel gecikme ilede olmaz . Her iki çıkış için bağımsız timer kullanmaktan başka çözüm yok bu işte. Birine TMR0 diğerinede TM1 kullanarak yapılabilir diye düşünüyorum.
Tabiiki IOC komutu hem LOW_HIGH hemde HIGH-LOW geçişlerinde kesmeye sokarsa süper olur. Sokmaz ise başka çare düşünmek gerek. Unutulmaması gereken şey kesmenin bir işe yaramasını sağlamak. Her konumda timer lar kesme içinde start almalı main içinde sonlanmalı diye düşünüyorum. Yada timerlerıda kesmeye bağlayıp her şeyi kesme içinde halletmek belkide en doğrusu ama basit gibi gözüken bu işte yoğun bir program algritması çalışması gerekiyor.
Sabah yazdım bu mesajı gün içinde biraz uğraşacağım konuyla.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

#24
Birşeyler karaladım.Çalışıyor gözüküyor. Kesme olduğunu anlayabilmek için bir led daha ilave etmiştim. Gerekirse çıkartılabilir.
Dosyalar aşağıdaki linktedir.

https://1drv.ms/u/s!AvTLMS2z03FN3CHJZdfnP5_QQmGt

Önceki mesajımda bahsettiğim şekilde yaptım. Her bir sw basılması yada sw girişinin LOW olması kesme oluşmasına sebep oluyor.
SW_1 i ,TMR1 sayacına bağladım ona 150 ms lik gecikme yaratacak şekilde bir önyükleme değeri verdim. Kesme içinde çıkış-1 iset edip önyükleme değerinide verip çıkıyor kesmeden

SW_2 ye TMR0 sayacını verdim ve bu sayac ile 1/256 bölme oranında en fazla 50 ms ik gecikme yaratabildiğimiz için KES  isimli bir değişken değerini kullanarak 3 adet kesmeyi saydırdım. Kesme oluştuğunda TMR0 a önyükleme değerini verip kesme bayrağını sıfırlayıp KES=3 değerinde verip çıkıyoruz kesmeden.
Ana program kısmında ise gerek TMR1 kesmesini ve gerekese TMR0 kesmesinin oluşup oluşmadığını kontrol ediyoruz.
TMR1 kesmesi olduğunda (PIR1=1) 150 ms geçmiş olacağı için direk Çıkış_1'i LOW yapıyor ve kesme bayrağını sıfırlıyoruz. Yeniden SW_1 basılıncaya kadar sistem beklemiş oluyor.
TMR0 kesmesi olduğunda (INTCON.2=1) ise kes değerindenbir eksiltiyoruz değer sıfır olmuş ise süre 150 ms dir deyip Çıkış_2 yi LOW yapıyoruz.
Sistem bu. Yükleyemeyenler için programı buraya da koyayım en iyisi;
'@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF

DEFINE OSC 4
DEFINE OSCCAL_1K 1

TRISIO= %000011 : GPIO= 0 :CMCON= 7 : ANSEL= 0 : OPTION_REG= %01000111
WPU= %00000011 : IOC=%00000011 :INTCON= %10001000' Enable the GPIO port change interrupt 

ON INTERRUPT GOTO Wake_up
T1CON=%00110101:
Out_1 VAR GPIO.4
Out_2 VAR GPIO.5

Sw_1  VAR GPIO.0
Sw_2  VAR GPIO.1

Temp var byte
KES  VAR BYTE

X var word
Y var word

Start:
IF PIR1.0=1 AND OUT_1=1 THEN 
   OUT_1=0:PIR1.0=0
ENDIF   
     
IF INTCON.2=1 AND KES>0 THEN
   KES=KES-1:INTCON.2=0
   IF KES=0 THEN  
     OUT_2=0
   ENDIF
ENDIF
     
goto Start

DISABLE

    
Wake_up:
TOGGLE GPIO.2

Main:   
IF SW_1=0 THEN 
   TMR1H=$B6:TMR1L=$C6
   OUT_1=1:PIR1.0=0
ENDIF

IF SW_2=0 THEN
  TMR0=60:OUT_2=1:KES=3
  INTCON.2=0 
ENDIF  
     
INTCON.0= 0	' Clear the RB port change flag bit
TEMP=GPIO
RESUME : ENABLE
END


Bu sistemin tek bir mahsuru var. Şayet sisteme bir encoder bağlarsanız ve encoderin puls peryodu 150 ms ninaltında olursa her iki çıkıştaki led sürekli yanar. Çünki 150 ms den önce yeniden kesme oluşur ve timer değerleri yenilenir. Bununda çaresi var ama çareleri ortaya serdikçe amaçtan uzaklaşırız gibime geliyor. Amaç ledlerin yanmasınımı görmek yoksa encoder le saydırma mı yapmak tercihe göre gerekirse süreler 50 şer ms ye kadar düşürülür. Amaç step motor sürmek ise us ler seviyesinde çıkış verdirmek belkide en doğrusudur. Doğru süreyi bulup ona uygun değer vermek gerekir diye düşünüyorum.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ipek

Hocam ilginize teşekkür ederim, bunu hardware olarak cumartesi deneyeceğim ,encoder için kullanacağım..
butonların birini sağ klik ile basılı tutup diğer butona bastığımızda,her iki çıkışta etkileniyor, 12F675 acaba bu iş için hızımı yeterli değil,
hocam şu adresi inceleyebilirseniz,bu ürün 12F629 ile yapmış üstüne ELM logosu basmış,elime tesadüfen geçti bu kusursuz çalışıyor.amacım böyle bir şey yapabilmek idi....

ete

Etkilenme sebebi kesinlikle ledleri yaktıktan sonra verdiğimiz 150 ms lik gecikme süresi olsa gerek. Bu süre daha kısa olmalı bence. Encoder bundan hızlı sayıyor ve bu nednele yeniden ledi yak emrini henüz sönmeden veriyor. ledlerin yanık kalması süreye bağımlı kalmadan encoder pinlerinin okunmaya devam ettiğinin bir göstergesidir.

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