Daftar Isi:

Dekoder Rotary Sederhana: 4 Langkah
Dekoder Rotary Sederhana: 4 Langkah

Video: Dekoder Rotary Sederhana: 4 Langkah

Video: Dekoder Rotary Sederhana: 4 Langkah
Video: Apa itu Encoder dan Bagaimana Cara Kerjanya 2024, November
Anonim
Image
Image
Dekoder Putar Sederhana
Dekoder Putar Sederhana

Instruksi ini menjelaskan metode sederhana decoding rotary encoder sekuensial menggunakan Arduino Uno R3.

Rutinitas perangkat lunak yang ringkas digunakan untuk menghitung jumlah transisi, menghilangkan pantulan kontak, dan menentukan arah rotasi. Komponen tambahan dan tabel pencarian tidak diperlukan.

Versi kode interupsi dan non-interupsi disediakan.

Versi interupsi kode hanya membutuhkan satu pin interupsi.

Gambar-gambar:

  • Foto pembuka menunjukkan encoder yang dirakit.
  • Tangkapan layar menunjukkan kode untuk versi interupsi dan hitungan saat poros encoder diputar searah jarum jam dan berlawanan arah jarum jam.
  • Video menunjukkan hitungan selama rotasi cepat.

Langkah 1: Diagram Sirkuit

Diagram Sirkuit
Diagram Sirkuit

Diagram pengkabelan encoder ditunjukkan pada gbr.1.

Kabel jumper disolder langsung ke pin encoder.

Tukarkan dua kabel biru jika arah hitungan dibalik.

Langkah 2: Daftar Bagian

Bagian berikut diperoleh dari

  • 1 hanya Arduino UNO R3 dengan Kabel USB.
  • 1 hanya rotary encoder sekuensial (EC11 atau setara) dengan sakelar.
  • 1 hanya kenop yang sesuai dengan poros.
  • 3 hanya kabel jumper male-to-male Arduino.

Langkah 3: Teori

Teori
Teori

Rotary encoder berurutan menghasilkan dua gelombang persegi yang masing-masing dipindahkan sebesar 90 derajat seperti yang ditunjukkan pada Gambar.1.

Pola logika pada Kontak A dan Kontak B berbeda ketika poros diputar searah jarum jam (CW) dan berlawanan arah jarum jam (CCW) melalui posisi 1 sampai 6.

Metode umum untuk menentukan arah rotasi meliputi:

  • perangkat keras
  • interupsi kembar
  • tabel pencarian pola

Proyek ini menggunakan metode perangkat lunak yang tidak memerlukan tabel pencarian. [1]

Arah

Alih-alih melihat pola keluaran dari Kontak A dan Kontak B, mari kita fokus pada Kontak A.

Jika kami mengambil sampel Kontak B setelah setiap transisi Kontak A, kami mencatat bahwa:

  • Kontak A dan Kontak B memiliki status logika yang berlawanan ketika encoder diputar CW
  • Kontak A dan Kontak B memiliki status logika yang sama ketika encoder diputar CCW

Kode sebenarnya:

// ----- Hitung transisi

CurrentStateA = stateContactA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead(ContactB); jika (CurrentStateA == CurrentStateB) Hitung++; if (CurrentStateA != CurrentStateB) Hitung--; LastStateA = CurrentStateA; }

Metode ini menawarkan keuntungan sebagai berikut:

  • tabel pencarian tidak diperlukan
  • hanya satu jalur interupsi yang diperlukan

Debounce

Semua encoder mekanis mengalami “contact bouncing”.

Jika kontak sakelar tidak membuat/putus dengan bersih, status logikanya akan berosilasi dengan cepat dari TINGGI ke RENDAH hingga kontak sakelar menetap. Ini menghasilkan penghitungan palsu.

Salah satu metode untuk menekan pantulan kontak adalah dengan menambahkan kapasitor kecil di setiap kontak sakelar. Kapasitor dan resistor pull-up terkait membentuk integrator yang secara efektif memperpendek frekuensi tinggi dan memungkinkan tegangan sakelar naik/turun dengan anggun.

Kelemahan dari pendekatan ini adalah bahwa transisi mungkin terlewatkan jika poros encoder diputar dengan cepat.

Perangkat Lunak Debouncing

Metode ini menggunakan dua counter (Open, Closed) yang telah disetel ke nol. [2]

Setelah transisi terdeteksi pada Kontak A:

  • Polling terus menerus Hubungi A.
  • Tingkatkan penghitung Terbuka, dan setel ulang penghitung Tertutup, setiap kali Kontak A TINGGI.
  • Tingkatkan penghitung Tertutup, dan setel ulang penghitung Terbuka, setiap kali Kontak A RENDAH.
  • Keluar dari loop ketika salah satu penghitung mencapai hitungan yang telah ditentukan. Kami secara efektif mencari periode kondisi mapan setelah bouncing kontak apa pun.

Kode sebenarnya:

// ----- Debounce Kontak A

while (1) { if (digitalRead(ContactA)) { // ----- ContactA Terbuka Tertutup = 0; // Kosongkan integrator berlawanan Open++; // Integrasikan jika (Buka > MaxCount) mengembalikan TINGGI; } else { // ----- KontakA Tertutup Buka = 0; // Kosongkan integrator berlawanan Closed++; // Integrasikan jika (Closed > MaxCount) mengembalikan LOW; } }

Tidak perlu melakukan debounce Kontak B karena transisi Kontak A dan Kontak B tidak bersamaan.

Perhitungan

Sebuah "penahanan" mekanis secara efektif menggandakan hitungan Anda karena dua hitungan terdaftar di antara klik (lihat gambar 1).

Jumlah "detents" dapat ditentukan menggunakan aritmatika modulo 2 seperti yang ditunjukkan di bawah ini.

Kode sebenarnya:

// ----- Hitung "penahan"

if (Hitung % 2 == 0) { Serial.print("Hitung: "); Serial.println(Hitung / 2); }

Referensi

Informasi lebih lanjut dapat ditemukan di:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Langkah 4: Perangkat Lunak

Proyek ini memerlukan versi terbaru dari Ardino Uno R3 IDE (lingkungan pengembangan terintegrasi) yang tersedia dari

Unduh masing-masing dari dua sketsa Arduino berikut (terlampir)

  • rotary_encoder_1.ino (versi polling)
  • rotary_encoder_2.no (versi interupsi)

Klik dua kali pada versi pilihan Anda dan ikuti petunjuk di layar.

Menikmati …

Klik di sini untuk melihat instruksi saya yang lain.

Direkomendasikan: