Rotary Enkoder ile saydırma işlemi

Başlatan tenri, 31 Ağustos 2022, 14:16:37

tenri

Merhabalar,

PIC12F1572 işlemcisiyle rotary enkoderden gelen sinyale göre ileri-geri saydırma işlemi yapıyorum ancak rotary enkoderin bağlandığı sistemi hızlı çekince sanki sayma işlemini atlıyor. Örnek olarak ipi yavaşça 50cm çektiğimde ekranda 500 değerini görüyorum ancak aynı mesafeye çok hızlı bir şekilde çekince değer 400 geliyor. Bunun nedenini bilen var mı?

Teşekkürler.

z

Olasi sebepler;

Rotary encoder mekanik kontakli ise glitch olusuyordur. Buda algoritmanin/decoder logicin yanlis calismasina neden oluyordur.

Encoding isini yazilimla yapiyorsan yazilim kontak konumlarindaki degisimi algilamakta gecikiyordur.
(Kodlama acemice yapilmis delay vs gibi kod satirlariyla hantallastirilmistir.)


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Epsilon

Encoderin 3 pinli kısmına ,orta pini ile soldaki pin arasına 100 nf ,yine orta pin ile sağdaki pini arasına 100 nf bağlayın.Yine her 2 kenar pinlerine de birer adet 10K bağlayın çıkışlarını birleştirip Vcc ye bağlayın.
 

elektronik

Yazılımı ekleseydiniz yardımcı olmak isteyenler bulmaca çözmek zorunda kalmadan size en doğru cevabı verirlerdi. (sadece encoder okuma kısmını)

tenri

Alıntı yapılan: z - 31 Ağustos 2022, 17:16:23Olasi sebepler;

Rotary encoder mekanik kontakli ise glitch olusuyordur. Buda algoritmanin/decoder logicin yanlis calismasina neden oluyordur.

Encoding isini yazilimla yapiyorsan yazilim kontak konumlarindaki degisimi algilamakta gecikiyordur.
(Kodlama acemice yapilmis delay vs gibi kod satirlariyla hantallastirilmistir.)




Yazılımsal olarak herhangi bir delay vs yok özellikle ona dikkat ederek yazdım. Benim de düşüncem hızlı dönüş esnasında rotary enkoder kısmının atlama yapması gibime geliyor.

Alıntı yapılan: Epsilon - 31 Ağustos 2022, 17:48:25Encoderin 3 pinli kısmına ,orta pini ile soldaki pin arasına 100 nf ,yine orta pin ile sağdaki pini arasına 100 nf bağlayın.Yine her 2 kenar pinlerine de birer adet 10K bağlayın çıkışlarını birleştirip Vcc ye bağlayın.
 

Her ikisi de bulunuyor. Devir ölçümü yapılırken mesela çok hızlı dönebiliyorlar kaçırma yapmıyor ancak benim sürekli çek bırak çek bırak yapınca bazen saymıyor.

Alıntı yapılan: elektronik - 31 Ağustos 2022, 19:40:25Yazılımı ekleseydiniz yardımcı olmak isteyenler bulmaca çözmek zorunda kalmadan size en doğru cevabı verirlerdi. (sadece encoder okuma kısmını)


if((input(ROTA)==1))
            {
                if((flag_old_rota==0))
                {
                    flag_old_rota=1;
                    if(input(ROTB)==0)
                    {

                            ++Counter;

                    }
                    else
                    {

                            if(Counter>0)
                                --Counter;

                    }

z

#5
Int kullanmiyorsan bu kodu sonsuz donguye alman gerekir.

Ayrica sorununla alaksi yok ama burdaki if sartini kaldirman gerekir.

          if(Counter>0) --Counter;

 flag_old_rota=1; gibi  flag_old_rota=0; atamasi da yapman lazim.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

alikeskinkilic

#6
algılamayı kesme ile yakalıyorsanız hızlıdır evet ama üst seviye dillerde kesmeye girmek sanıldığı kadar hızlı değildir .normalde ASM ile kod yazıyorsanız kesme olduğunda 0x04 adresine donanımsal olarak gider bir sonraki darbede ve oradan da altına yazdığımız kesme alt programı çalışır ama basic ve c gibi dillerde kesme otomatik gene gider 0x04 e ama altında programda bekleme veya ekrana yazma seri haberleşme varmı diye programa geri göndermek ve orada kontrolleri yapıp eğer yok ise herhangi bir işlem öyle gider kesmeye bu da çok zaman alır adım kaçırması hız arttıkça artar daha önce bir çalışmam vardı bunun ile ilgili C ile değil ama genel mantığı anlatıyor kesme işinin 
burada üç  videolarda kesme ile ilgili denemelerim ve Basic modifiyesi mevcut ayrıca denemeer de enkoder programı üzerinden yapılıyor. hız için ASM candır :)
Hep meraktan

tenri

#7
Alıntı yapılan: z - 31 Ağustos 2022, 22:42:28Int kullanmiyorsan bu kodu sonsuz donguye alman gerekir.

Ayrica sorununla alaksi yok ama burdaki if sartini kaldirman gerekir.

          if(Counter>0) --Counter;

 flag_old_rota=1; gibi  flag_old_rota=0; atamasi da yapman lazim.




sürekli atlama yaptığı için eksiye düşmesin diye o şekilde ekledim if bloğunu. flagleri de alt kodda zaten 1 ve 0 yapıyorum onda sorun yok da anlam veremediğim şekilde yavaş çekince şaşmıyor ama biraz hızlı çekip bıraktığım da hep şaşma oluyor. Sistemde delay vs de yok. Herhangi bir haberleşme vs yapmıyorum. Aldığım veriye göre buzzer çıkışını 1 yapıyorum veya 0 yapıyorum.

01 Eylül 2022, 09:12:46
Alıntı yapılan: alikeskinkilic - 31 Ağustos 2022, 23:10:00algılamayı kesme ile yakalıyorsanız hızlıdır evet ama üst seviye dillerde kesmeye girmek sanıldığı kadar hızlı değildir .normalde ASM ile kod yazıyorsanız kesme olduğunda 0x04 adresine donanımsal olarak gider bir sonraki darbede ve oradan da altına yazdığımız kesme alt programı çalışır ama basic ve c gibi dillerde kesme otomatik gene gider 0x04 e ama altında programda bekleme veya ekrana yazma seri haberleşme varmı diye programa geri göndermek ve orada kontrolleri yapıp eğer yok ise herhangi bir işlem öyle gider kesmeye bu da çok zaman alır adım kaçırması hız arttıkça artar daha önce bir çalışmam vardı bunun ile ilgili C ile değil ama genel mantığı anlatıyor kesme işinin 
burada üç  videolarda kesme ile ilgili denemelerim ve Basic modifiyesi mevcut ayrıca denemeer de enkoder programı üzerinden yapılıyor. hız için ASM candır :)


Malesef interrupt kullanamıyorum çünkü 12f1572 işlemcisinin sadece PA2 pininde kesme var diye biliyorum. Benim kullandığım pinler ise A4 ve A5 pinleri.

alikeskinkilic

Şöyle bir problem oluşur kesme kullanmazsanız.sonuçta bu okuduğunuz veriyi görmek için ya seri gödericeksiniz yada ekrandan okuyacaksınız bu durumda program veri gönderirken enkoder pozisyon değiştirdi bunu kaçırması çok normal kesmeler ve dallanmalar haricinde program sayacı sürekli artar yani okumaya sıra gelene kadar pozisyon çoktan değişmiş olur mevcut pozisyonu bir önceki lenkarşılaştırdığında yazılımda bazen ileri bazen geri gitmeye başlar sayı çok yavaş enkoderlerde ve enkoder okuma dışında çok az komut kullansan bile 100 hz hızı yakalamak iyi bir kodlama gerektirir bence değişiklik kesmesi olan bir seri kullanın
Hep meraktan

ahuramazda

Alıntı YapMalesef interrupt kullanamıyorum çünkü 12f1572 işlemcisinin sadece PA2 pininde kesme var diye biliyorum. Benim kullandığım pinler ise A4 ve A5 pinleri.

Datasheeti şu an inceleyemiyorun ama işlemciyi kullandığım zamanlardan hatırladığım kadarıyla mclr hariç tüm pinler interrupt on change(IOC) özelliğine sahipti

ilyas KAYA

https://datasheetspdf.com/mobile/956772/Microchip/PIC12F1572/1

A4 ve a5 de ioc özelliği var görünüyor. Eğer yazılimdaki tüm zamanlamalar için bir fonksiyon yazarsanız encoder çok rahat çalışacaktır.

Örnek olması açısından arduino da kullanılan "millis" fonksiyonunu inceleyebilirsiniz. Gayet basarili çalışıyor.

Eğer yine sizi kurtarmaz ise 2nci bir mcu ile yapmak daha sağlıklı olur. Mcu sadece encoder i okur ve count bilgisini tutar. Ana mcu istediği an count bilgisini 2nci mcu dan ister.

tenri

#11
Alıntı yapılan: alikeskinkilic - 01 Eylül 2022, 20:12:34Şöyle bir problem oluşur kesme kullanmazsanız.sonuçta bu okuduğunuz veriyi görmek için ya seri gödericeksiniz yada ekrandan okuyacaksınız bu durumda program veri gönderirken enkoder pozisyon değiştirdi bunu kaçırması çok normal kesmeler ve dallanmalar haricinde program sayacı sürekli artar yani okumaya sıra gelene kadar pozisyon çoktan değişmiş olur mevcut pozisyonu bir önceki lenkarşılaştırdığında yazılımda bazen ileri bazen geri gitmeye başlar sayı çok yavaş enkoderlerde ve enkoder okuma dışında çok az komut kullansan bile 100 hz hızı yakalamak iyi bir kodlama gerektirir bence değişiklik kesmesi olan bir seri kullanın

ekranda okuma yapmıyorum veya seri haberleşme kullanmıyorum. Konuyu anlatırken örnek vermiştim. Yani sistemi 50cm çekiyorum sayaç tahmini 500 sayıyor, ama hızlı çekince de 400 sayıyor ve bunu da buzzer yardımıyla öğreniyorum. Bu nedenle gecikme de yok sistemde sadece ipi çekip sayma işlemi yapıyorum, butona basıp sayacı başka bir değişkene atıyorum ve ipin boyunu sabit tutuyorum. Butona bastıktan sonra eğer ipte %5lik bir kısalma veya azalma olursa sistem buzzer çıkışı veriyor.
Alıntı yapılan: ahuramazda - 01 Eylül 2022, 20:59:57Datasheeti şu an inceleyemiyorun ama işlemciyi kullandığım zamanlardan hatırladığım kadarıyla mclr hariç tüm pinler interrupt on change(IOC) özelliğine sahipti

Evet dediğiniz gibi kullanılıyor. Ancak sistem çok basit olduğu için kesme vs düşünmedim hiç yani.

Alıntı yapılan: ilyas KAYA - 01 Eylül 2022, 21:39:41https://datasheetspdf.com/mobile/956772/Microchip/PIC12F1572/1

A4 ve a5 de ioc özelliği var görünüyor. Eğer yazılimdaki tüm zamanlamalar için bir fonksiyon yazarsanız encoder çok rahat çalışacaktır.

Örnek olması açısından arduino da kullanılan "millis" fonksiyonunu inceleyebilirsiniz. Gayet basarili çalışıyor.

Eğer yine sizi kurtarmaz ise 2nci bir mcu ile yapmak daha sağlıklı olur. Mcu sadece encoder i okur ve count bilgisini tutar. Ana mcu istediği an count bilgisini 2nci mcu dan ister.

Kartın üzerinde ekstra işlemci kullanmak için uygun değil malesef. Ama dediğim gibi sistem çok basit ve bu kadar sıkıntı çıkarmaması gerekiyor. Herhangi bir gecikme olan fonksiyon bulunmuyor. Sadece enkoder sayıp bir değişkene atıyor hepsi bu. Anlam veremedim gerçekten.


kimlenbu

Kesme olmadan yüksek hızlarda hassas okuma yapmak imkansız. Ayrıca donanımsal "debounce" önlemi almadan da aynı şekilde sağlıklı bir okuma yapmak gene çok zor.

En temizi debounce filter+schmitt trigger+kesme yapmanız

tenri

İpi her çekip bıraktığımda saydığım değer aynı olmuyor. Sistem çok garip bir şekilde çalışıyor. Kesme ile de denedim ancak sonuç yine aynı. Sistem çok basit aslında ileri ve geri saydırma yapıyorum. Daha sonra butona basıp bu saydığı değeri başka değişkene atıyorum. Sonrasında da hızlı bir şekilde çek bırak çek bırak yapıyorum ancak değişkene atadığım değer 100 ise çek bırak yaptıktan sonra değer yine 100 olarak kalıyor ancak kaçırma yaptığı için ipin boyu uzamış oluyor.

Alıntı yapılan: kimlenbu - 02 Eylül 2022, 11:08:45Kesme olmadan yüksek hızlarda hassas okuma yapmak imkansız. Ayrıca donanımsal "debounce" önlemi almadan da aynı şekilde sağlıklı bir okuma yapmak gene çok zor.

En temizi debounce filter+schmitt trigger+kesme yapmanız

Dediklerinizin ikisini yaptım. Yaptığım işlemin süresi yani iki tetikleme arası geçen süre 900us, işlemciden debug yaptığım zaman da 15.4us de kod bloğu çalışıyor. Yani her tetikleme başına aslında 15.4us gibi bir süre düşebiliyor ama benim işlem daha yavaş 900us gibi bir süre ve input yaptığımda da kaçırma yapmaması gerekiyor. Anlam veremedim bu nedenle araştırmaya devam ediyorum.

ilyas KAYA

Encoder sorunlu olabilir çok karşılaştım. Encoderi osilaskop a bağlayın kontrol edin. Elin almanı yapmış ne kadar hızla çalışsada kare dalgayı tam verirken cin yada yerli üretimlerde faz kayması yapıyor. Bu da bir ileri bir geri saymaya neden oluyor.