Optik Encoder Seçimi

koray

Üye
Katılım
4 Eylül 2021
Mesajlar
16
Arkadaşlar Merhaba,

İki tekerleğin arasından kablo geçirerek kablonun uzunluğunu hesaplayacak bir proje geliştiriyorum.

Tekerlerin birine encoder bağlı.İlk olarak ky-040 isimli mekanik encoderi denedim.Yavaş hareket ettirildiğinde bir sorun yok fakat hızlı hareketlerde pulse kaybı oluyor ve pull up resistor-100 nf kapasitör gibi elektronik komponentler eklememe rağmen sorun çözülmedi.
360 pulselik bir optik encoder aldım.Bundada aynı sorunları yaşıyorum,hızlı hareketlerde pulse kaybı yaşanıyor.

Tavsiye edebileceğiniz bir encoder çeşidi-pulse sayısı var mı? Veya farklı bir elektronik devre ile sorunu çözebilir miyim?

Teşekkür ederim şimdiden....
 
Tekerler için genelde şu tarz bir şey kullanıyorlar.

Merhaba Gökhan Bey,

Daha önce paylaşmış olduğunuz encoder pdf'inizi inceledim ve bana çok şey kattı.

-E6B2-CWZ6C 2000 pulse.

-LPD3806-600bm-g5-24c 600 pulse.

Üsttteki iki encoder aynı fiyatta. Sizce bu encoderlerden birisi hızlı çevirmelerde pulse kaybını ortadan kaldırır mı? Şimdiki kullandığım E38S6G5-360BG24N parça kodlu encoder ve sorun yaratıyor açıkçası..
 
Ben bu enkoderleri hiç kullanmadım. O yüzden bilgim yok. Paylaşmış olduğum PDF @hafy 'e aittir. Bende ondan yararlanmıştım.
Enkoderler hakkında bilgi sahibi olan üyeler yardımcı olacaktır.
 
Arkadaşlar Merhaba,

İki tekerleğin arasından kablo geçirerek kablonun uzunluğunu hesaplayacak bir proje geliştiriyorum.

Tekerlerin birine encoder bağlı.İlk olarak ky-040 isimli mekanik encoderi denedim.Yavaş hareket ettirildiğinde bir sorun yok fakat hızlı hareketlerde pulse kaybı oluyor ve pull up resistor-100 nf kapasitör gibi elektronik komponentler eklememe rağmen sorun çözülmedi.
360 pulselik bir optik encoder aldım.Bundada aynı sorunları yaşıyorum,hızlı hareketlerde pulse kaybı yaşanıyor.

Tavsiye edebileceğiniz bir encoder çeşidi-pulse sayısı var mı? Veya farklı bir elektronik devre ile sorunu çözebilir miyim?

Teşekkür ederim şimdiden....
Burada enkoderi seçerken hızın ne kadar olacağı, ölçümde gerekli hassasiyet ve bu aletin kullanım sıklığı da önemli. Arduino mekanik enkoder belli şartlar altında iş görebilir ama ömrü kısa olur. Optik yada manyetik enkoderle yapmak lazım hızlı ve sürekli çalışacaksa. Okumak için kullanılacak mcu'nun hızı da önemli hale geliyor, 2000 pulse encoderi yavaş bir mcu ile verimsiz bir kodla okumaya çalışırsanız da adım kaçırabilirsiniz.
 
Burada enkoderi seçerken hızın ne kadar olacağı, ölçümde gerekli hassasiyet ve bu aletin kullanım sıklığı da önemli. Arduino mekanik enkoder belli şartlar altında iş görebilir ama ömrü kısa olur. Optik yada manyetik enkoderle yapmak lazım hızlı ve sürekli çalışacaksa. Okumak için kullanılacak mcu'nun hızı da önemli hale geliyor, 2000 pulse encoderi yavaş bir mcu ile verimsiz bir kodla okumaya çalışırsanız da adım kaçırabilirsiniz.
Merhaba,

Yani hızı konusunda bir kabloyu çekerken ortalama bi hızda yapmasına yetecek kadar hız olsa yeter.Yeri geliyor bir tık hızlandığınızda kayıp yaşanıyor.Bunda çözüm arduinoyu değişmekse zaman olarak çok ileri atacak.Arduinonun yeterli gelip gelmediğini anlamamız nasıl mümkün olabilir?
 
Merhaba,

Yani hızı konusunda bir kabloyu çekerken ortalama bi hızda yapmasına yetecek kadar hız olsa yeter.Yeri geliyor bir tık hızlandığınızda kayıp yaşanıyor.Bunda çözüm arduinoyu değişmekse zaman olarak çok ileri atacak.Arduinonun yeterli gelip gelmediğini anlamamız nasıl mümkün olabilir?
Encoder datasheetlerinde kullanılabilecekleri devir sınırı vb. belirtilmesi lazım. Bunu kurduğunuz düzenekte kullandığınız hızlarda devir/dakika cinsinden hesaplarsanız seçim kolaylaşır. arduino encoderi kontrol için tasarlanmış bir şey, bununla ölçüm yapmaya çalışmayın boşuna. Sistemi çalışır halde kursanız bile kısa sürede encoder bozulup yanlış ölçüm yapmaya başlar.
Ne kadar isabetli olması lazım ölçümün? 2000 pulse bir encoder gereksiz olur heralde. Kabloyu 1mm hassasiyetle mi olçüp keseceksiniz?
Arduino bu iş için yeterli güçte, sistemi doğru kurarsanız çalışır.

ek: Pardon 600 pulse kullandığınızı belirtmişsiniz. verdiğiniz parça koduna bakılırsa encoderde sorun yok gibi. yalnız gerekli hassasiyeti belirleyip encoderden pulse çıkışını arduinonun yetişebileceği frekanslara getirebilirsiniz. Kodu da paylaşırsanız daha doğru yorum yapılır. "digitalRead" ile encoder okumaya yetişemezsiniz mesela...
 
Son düzenleme:
Kodunuz düzgün çalışmıyordur büyük ihtimalle, encoderda sorun aramak en son seçeneğiniz olsun. @semih_s de dediği gibi kodunuzu paylaşırsanız daha iyi olur
 
Encoder datasheetlerinde kullanılabilecekleri devir sınırı vb. belirtilmesi lazım. Bunu kurduğunuz düzenekte kullandığınız hızlarda devir/dakika cinsinden hesaplarsanız seçim kolaylaşır. arduino encoderi kontrol için tasarlanmış bir şey, bununla ölçüm yapmaya çalışmayın boşuna. Sistemi çalışır halde kursanız bile kısa sürede encoder bozulup yanlış ölçüm yapmaya başlar.
Ne kadar isabetli olması lazım ölçümün? 2000 pulse bir encoder gereksiz olur heralde. Kabloyu 1mm hassasiyetle mi olçüp keseceksiniz?
Arduino bu iş için yeterli güçte, sistemi doğru kurarsanız çalışır.

ek: Pardon 600 pulse kullandığınızı belirtmişsiniz. verdiğiniz parça koduna bakılırsa encoderde sorun yok gibi. yalnız gerekli hassasiyeti belirleyip encoderden pulse çıkışını arduinonun yetişebileceği frekanslara getirebilirsiniz. Kodu da paylaşırsanız daha doğru yorum yapılır. "digitalRead" ile encoder okumaya yetişemezsiniz mesela...
Merhaba,

Şuanlık 360 pulselik encoderim var.(E38S6G5-360BG24N)


Henüz bir teker vs bağlamadım.Amacım encoderde herhangi bir pulse kaybı olup olmadığını çözmek.

Kodum şu şekilde;
1691152959637.png
 
Programı kod olarak eklersen biz de burada deneyebiliriz.

1691153457324.png
 
Programı kod olarak eklersen biz de burada deneyebiliriz.

24938 eklentisine bak
volatile unsigned int temp, counter = 0; //This variable will increase or decrease depending on the rotation of encoder

void setup() {
Serial.begin (9600);
pinMode(2, INPUT_PULLUP); // internal pullup input pin 2

pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
//Setting up interrupt
//A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
attachInterrupt(0, ai0, RISING);

//B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
attachInterrupt(1, ai1, RISING);
}

void loop() {
// Send the value of counter
if( counter != temp ){
Serial.println (counter);
temp = counter;
}
}

void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(3)==LOW) {
counter++;
}else{
counter--;
}
}

void ai1() {
// ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
// Check with pin 2 to determine the direction
if(digitalRead(2)==LOW) {
counter--;
}else{
counter++;
}
}
 
Encoder datasheetlerinde kullanılabilecekleri devir sınırı vb. belirtilmesi lazım. Bunu kurduğunuz düzenekte kullandığınız hızlarda devir/dakika cinsinden hesaplarsanız seçim kolaylaşır. arduino encoderi kontrol için tasarlanmış bir şey, bununla ölçüm yapmaya çalışmayın boşuna. Sistemi çalışır halde kursanız bile kısa sürede encoder bozulup yanlış ölçüm yapmaya başlar.
Ne kadar isabetli olması lazım ölçümün? 2000 pulse bir encoder gereksiz olur heralde. Kabloyu 1mm hassasiyetle mi olçüp keseceksiniz?
Arduino bu iş için yeterli güçte, sistemi doğru kurarsanız çalışır.

ek: Pardon 600 pulse kullandığınızı belirtmişsiniz. verdiğiniz parça koduna bakılırsa encoderde sorun yok gibi. yalnız gerekli hassasiyeti belirleyip encoderden pulse çıkışını arduinonun yetişebileceği frekanslara getirebilirsiniz. Kodu da paylaşırsanız daha doğru yorum yapılır. "digitalRead" ile encoder okumaya yetişemezsiniz mesela...

Evet kablo uzunluğunu hassas şekilde ölçmek istiyorum.
 
Kesmelerin içinde digitalread apilerinin olması kodunuzu yavaşlatıyor. Direkt registerlardan okursanız sorununuz düzelir bence
 
volatile unsigned int temp, counter = 0; //This variable will increase or decrease depending on the rotation of encoder

void setup() {
Serial.begin (9600);
pinMode(2, INPUT_PULLUP); // internal pullup input pin 2

pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
//Setting up interrupt
//A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
attachInterrupt(0, ai0, RISING);

//B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
attachInterrupt(1, ai1, RISING);
}

void loop() {
// Send the value of counter
if( counter != temp ){
Serial.println (counter);
temp = counter;
}
}

void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(3)==LOW) {
counter++;
}else{
counter--;
}
}

void ai1() {
// ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
// Check with pin 2 to determine the direction
if(digitalRead(2)==LOW) {
counter--;
}else{
counter++;
}
}
Adım kaçırmıyor da olabilirsiniz. loop döngüsündeki serialWrite komutu tamamlanana kadar encoder birkaç adım atıyor olabilir. bu yüzden seri monitörde adımların 3'er 5'er arttığını görüyorsunuz. interruptların yetişip yetişmediğini ve adım kaçırmadığınızı da osiloskop bağlayarak veya ölçüsü bilinen bir kablo ile ölçüm yapıldığında yavaş ölçümle hızlı ölçüm arasında fark görüyorsanız anlarsınız.
 
Merak edip osiloskoba bağlayıp denedim.
Süreleri sınamak için arduinon pin13'ten çıkış alıp osiloskoba bağladım. Kodu da bu amaca göre biraz düzenledim.

digitalRead ve digitalWrite apilerini kullanmadan;
no api:
void loop() {
  PORTB &=~(1<<5);
  //digitalWrite(13,LOW);
// Send the value of counter
/*if( counter != temp ){
Serial.println (counter);
temp = counter;
}
*/
}

void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(!(PIND>>3&1)) {
counter++;

}
else{
counter--;
PORTB |= 1<<5;
//digitalWrite(13,HIGH);
}
}

Sarı sinyal encoder pulse simule eden buton arduino pin2'ye bağlı (PIND2). butonu bırakınca dahili pull-up dirençleri HIGH oluyor. Mor sinyal pin13.

IMG20230804170222.jpg


5 us'den az sürüyor sayacın artırılması.

API ile de böyle:
api ile:
void loop() {
  PORTB &=~(1<<5);
  //digitalWrite(13,LOW);
// Send the value of counter
/*if( counter != temp ){
Serial.println (counter);
temp = counter;
}
*/
}

void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(3)==LOW) {
counter++;

}
else{
counter--;
PORTB |= 1<<5;
//digitalWrite(13,HIGH);
}
}

Kodu Api ile yazınca 4us civarı uzadı.
IMG20230804172136.jpg



Mevcut apilerle arduinonun interrupt'ı işleyip dönmesi 10us falan tutuyordur max. kabaca saniyede 100.000 adım işler, ama o zaman da loop'a zaman ayıramaz. Atıyorum mesela 10.000 adımişlesin diğer işlemleri düzgün yaparken ve her mm için 10 pulse alacak şekilde bağlansa enkoder, saniyede 10.000pulse/10pulse/mm hesabıyla saniyede 1000mm hızda sorunsuz çalışacağı varsayılabilir... Yine de apileri kaldırmak kolay, kod uzadıkça etkisi hissedilir olabilir. Tabii benim hesap da yanlış olabilir...
 
Esp32 ile buna benzer bir proje geliştiriyordum. Program belli yerlerde bir pini açıp kapatması gerekiyordu, aynı buradakine benzer bir sorun yaşamıştım. Sorunu ararken Esp32 kütüphanesinib digitawrite apisinde delay kullanıldığını farkettim(belki şimdi değişmiştir) bu apiyi kaldırınca bütün sorun çözülmüştü. Büyük ihtimalle bu kütüphanelerin hepsi böyle sorunlarla dolu. Hassas işler için uygun olduğunu düşünmüyorum
 
Esp32 ile buna benzer bir proje geliştiriyordum. Program belli yerlerde bir pini açıp kapatması gerekiyordu, aynı buradakine benzer bir sorun yaşamıştım. Sorunu ararken Esp32 kütüphanesinib digitawrite apisinde delay kullanıldığını farkettim(belki şimdi değişmiştir) bu apiyi kaldırınca bütün sorun çözülmüştü. Büyük ihtimalle bu kütüphanelerin hepsi böyle sorunlarla dolu. Hassas işler için uygun olduğunu düşünmüyorum
bi süreden sonra bu paranoyaklık oluyor.
kütüphane gibi şeyler kullanıp sorunsuz bir çalışma elde etsem bile kütüphane dosyalarını didik didik etmeden rahat edemiyorum
 
STM32F1xx serisi MCU'larda bir timer'in iki kanalı koordineli çalıştırılıp quadrature decoding yapılabiliyor. Eğer pals sıklığı çok fazla ise, bu şekilde doğrudan hardware ile decoding yapmak daha mantıklı olur.

Aslinda bende her turda 600 pals üreten bir ABZ encoder var. Emin değilim ama optik prensip ile çalıştığını düşünüyorum. Ve palsların temiz olmasını bekliyorum. Herhangi bir debouce falan olmaması lazım. Eğer hardware quadrature decoding kullanırsam, bunu 1000 devirde bile döndürsem STM32F1xx in sayabilmesi lazım diye düşünüyorum.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,952
Mesajlar
118,759
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top