Döner kodlayıcıları kullanarak Arduino'yu ne kadar hassas hale getirebilirim?


15

Adım motorları büyük bir motor için genellikle pahalıdır. Bununla birlikte, güçlü, standart bir DC motor ve bir döner kodlayıcı ile bir step motoru "simüle edebilirsiniz". Arduino ile döner kodlayıcılar sadece temel bir döngü ile değil, diğer kodlarla ne kadar doğru? "Nabzı atlayacak" ve sık sık yeterli dönüş kaydetmeyecek mi? Bunu çok daha fazla kodla nasıl ele alabilirim? Bunu yapmanın daha iyi bir yolu var mı? Kesmeler yardımcı olur mu? Bu soruna yardımcı olacak bir devre var mı?

Not: Muhtemelen saniyede 4 dönüşü aşmayacaktır ... (Bu çok fazla olabilir, ancak inç başına 10 dönüş doğrusal hareket varsa dakikada sadece 24 inç olacak bir kurşun vida tipi mekanizma yapıyorsanız. )


Hızlı döndürüldüğünde düzgün çalışmayı reddeden döner kodlayıcıları kullandım. Sanırım fiyatı değişir.
jippie

Yanıtlar:


10

Kesintiler bu durumda kullanacağınız şeydir.

Bahsettiğiniz oranlar, muhtemelen bir döngü içinde sayabileceğiniz kadar yavaştır , ancak tipik bir döngü tamamlanması için çok sayıda saat döngüsü alacağından ve döngü başına öğretici sayısına bağlı olarak bu önerilmez. , bazı sayıları kaçırabilirsiniz.

Kesmeler bu amaç için yapılır, çünkü döngünün durumundan bağımsız olarak herhangi bir zamanda tetiklenebilirler.

attachInterrupt()Üç argüman alacak bir fonksiyon var .

  1. Kesme Pimi
  2. Kesinti Hizmeti Rutini
  3. kip

Aşağıda bir kesintiyi saymak için bir örnek verilmiştir

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Modlar aşağıdaki gibidir:

DÜŞÜK, DEĞİŞİM, YÜKSELTME, DÜŞÜYOR

Kesmeleri kullanma hakkında daha fazla bilgiyi burada bulabilirsiniz .

Kullandığınız kodlayıcıya bağlı olarak, kodu ihtiyaçlarınıza göre uyarlamanız ve konumunuzu belirlemek için biraz daha hesaplama yapmanız gerekecektir, ancak bu iyi bir başlangıç ​​noktası olmalıdır.

Düzenle Burada , döner kodlayıcı kullanmak için Arduino Sandbox'tan bazı örnek kod verilmiştir.


1
Duemilanove üzerindeki bir kesmeli tahrikli kenar detektörü, saniyede 100 kenarı (motorda 6500 rpm) kolayca idare eder.
Wayfaring Stranger

@WayfaringStranger Öyleyse bir Uno'da sorun yok, o zaman. Teşekkürler!
Anonim Penguen

1
@AnnonomusPerson - Ne kadar iş koymak istiyorsun? Çıplak kalırsanız ( ISR_NAKED()), otomatik C bağlam tasarrufunu atlayabilir ve 100-500 Khz kesinti oranlarını sorunsuz bir şekilde çekebilirsiniz, ancak temelde bu noktada C'de montaj yazıyorsunuz.
Connor Wolf

1
Kesin yanıtı kesin mutlak bok optimize etmek hakkında tamamen banannas belgesi istiyorsanız, buraya bakın . Kesme gecikmesini daha da azaltmak için kodu doğrudan kesme tablosuna yerleştirme!
Connor Wolf

1
Ayrıca, düşük gecikmeli kesmeler yapacaksanız, arduino attachInterrupt işlevinin, kesmeyi ISR()doğrudan kullanmaya karşı ek bir işlev çağrısı ek yükü enjekte ettiğini unutmayın .
Connor Wolf

3

Önceden yazılmış kütüphanelere ve örneklere bazı referanslar eklemek, farklı yaklaşımlar ve eksik adımlara yatkınlığa karşı hız ile deneyimler arasında karşılaştırma yapmak.

Döner kodlayıcıları okuma: http://playground.arduino.cc/Main/RotaryEncoders

Quadrature Enkoder Arduino için çok Hızlı (Çözüm ile): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Teensy Encoder kütüphanesi: https://www.pjrc.com/teensy/td_libs_Encoder.html

Arduino'da döner kodlayıcı okuma: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.