Seberapa tepat saya bisa mendapatkan Arduino menggunakan rotary encoders?

15

Motor stepper sering mahal untuk motor besar. Namun, dengan motor DC standar yang kuat dan rotary encoder, Anda dapat "mensimulasikan" motor stepper. Seberapa akuratkah rotary encoders dengan Arduino hanya dengan loop dasar dan tidak banyak kode lainnya? Apakah akan "kehilangan pulsa" dan tidak cukup sering merekam rotasi? Bagaimana saya bisa menangani ini dengan lebih banyak kode? Apakah ada cara yang lebih baik untuk melakukan ini? Apakah interupsi membantu? Apakah ada semacam rangkaian yang akan membantu dengan masalah ini?

Catatan: Ini mungkin tidak akan melebihi 4 rotasi per detik ... (Itu mungkin banyak tetapi jika Anda melakukan mekanisme jenis sekrup timah yang hanya 24 inci per menit jika ada 10 rotasi per inci dari gerakan linear. )

Penguin Anonim
sumber
Saya telah menggunakan rotary encoders yang menolak untuk bekerja dengan baik ketika berputar cepat. Saya kira itu bervariasi dengan harga.
jippie

Jawaban:

10

Interupsi adalah apa yang akan Anda gunakan dalam situasi ini.

Tingkat yang telah Anda sebutkan cukup lambat di mana Anda mungkin akan dapat menghitungnya di dalam sebuah loop, namun ini tidak disarankan, karena loop tipikal akan membutuhkan banyak siklus clock untuk diselesaikan, dan tergantung pada jumlah instrumen per loop , Anda mungkin kehilangan beberapa hitungan.

Interupsi dibuat untuk tujuan ini, karena mereka dapat dipicu kapan saja, terlepas dari keadaan loop.

Ada fungsi bernama attachInterrupt()yang akan mengambil tiga argumen.

  1. Pin Interrupt
  2. Layanan Interupsi Rutin
  3. Mode

Di bawah ini adalah contoh untuk menghitung interupsi

volatile int myCounter = 0;

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

void count(){
    myCounter++;
}

Mode adalah sebagai berikut:

RENDAH, PERUBAHAN, NAIK, JATUH

Informasi lebih lanjut tentang menggunakan interupsi dapat ditemukan di sini .

Bergantung pada pembuat enkode yang Anda gunakan, Anda perlu menyesuaikan kode kebutuhan Anda, dan melakukan beberapa perhitungan lagi untuk menentukan posisi Anda, tetapi ini harus menjadi titik awal yang baik.

Sunting Berikut ini adalah beberapa contoh kode dari Arduino Sandbox untuk menggunakan rotary encoder.

Matt Clark
sumber
1
Detektor tepi penggerak interupsi pada Duemilanove dengan mudah menangani 100 tepi per detik (6500rpm pada motor).
Wayfaring Stranger
@WayfaringStranger Jadi tidak ada masalah pada Uno, kalau begitu. Terima kasih!
Anonymous Penguin
1
@AnnonomusPerson - Berapa banyak pekerjaan yang ingin Anda lakukan? Jika Anda telanjang ( ISR_NAKED()), Anda dapat melewati penyimpanan konteks C otomatis, dan menarik laju interupsi 100-500 Khz tanpa masalah, tetapi pada dasarnya Anda menulis assembly dalam C pada saat itu.
Connor Wolf
1
Jika Anda ingin dokumen banannas sepenuhnya tentang mengoptimalkan omong kosong mutlak dari tanggapan interupsi, lihat di sini . Menempatkan kode langsung di tabel interupsi untuk mengurangi latensi interupsi lebih lanjut!
Connor Wolf
1
Juga, perhatikan bahwa jika Anda menggunakan interupsi latensi rendah, fungsi arduino attachInterrupt menyuntikkan seluruh overhead fungsi-panggilan tambahan dibandingkan menggunakan interupsi ISR()secara langsung.
Connor Wolf
3

Menambahkan beberapa referensi ke perpustakaan dan contoh yang sudah ditulis, untuk memungkinkan perbandingan antara pendekatan yang berbeda, dan pengalaman dengan kecepatan versus kerentanan terhadap langkah-langkah yang hilang.

Membaca rotary encoders: http://playground.arduino.cc/Main/RotaryEncoders

Quadrature Encoder terlalu cepat untuk Arduino (dengan Solusi): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Perpustakaan Encoder Teensy: https://www.pjrc.com/teensy/td_libs_Encoder.html

Membaca rotary encoder di Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

gwideman
sumber