Diagram pengkabelan encoder sgp 1 0196. Menghubungkan encoder ke mikrokontroler PIC

Akhirnya saya mendapatkan sentuhan yang luar biasa ini dan sekarang saya ingin memberi tahu Anda cara bekerja dengannya. Encoder saya (EC12E24204A9) adalah seperti ini:

Encoder memiliki tiga pin: Common, A dan B. Common biasanya selalu terhubung ke ground dan dua lainnya ke pin mikrokontroler. Pin A dan B harus ditarik ke catu daya positif melalui resistor urutan 10 kOhm untuk mengecualikan alarm palsu dari pickup. Saya tidak akan merekomendasikan menggunakan pengetatan mikrokontroler internal. Dia sangat lemah. Untuk mendemonstrasikan cara kerjanya, mari kita tutup 8 LED lagi. (catatan: Jika mega16, mega32 dan yang lebih lama digunakan, maka Anda harus mematikan jtag, jika tidak setengah dari LED tidak akan menyala)
Jadi kami mendapat skema berikut:


Putar kenop encoder ke kanan - lampu menyala ke kanan. Putar ke kiri - lampu berjalan ke kiri. Bagaimana cara kerja pembuat enkode? Kami akan mencari tahu. Tidak ada yang rumit. Mari kita lihat grafik di bawah ini.
Ketika encoder diputar ke satu arah, sinyalnya terlihat seperti ini:

Ke yang lainnya:

Timbul pertanyaan, bagaimana mikrokontroler membedakan arah putaran encoder?

Ada dua algoritma polling encoder yang populer:

  • Interupsi Polling
  • Jajak pendapat yang membandingkan keadaan pembuat enkode sebelumnya dan yang sekarang

Masing-masing metode survei ini memiliki kelebihan dan kekurangannya masing-masing. Saya mencoba keduanya dan memilih metode kedua. Hal yang baik tentang polling dengan interupsi adalah Anda dapat memberikan respons instan terhadap rotasi kenop encoder. Tetapi ada juga kelemahan serius. Seperti kontak bouncing. Untuk menekannya tentunya bisa menggunakan berbagai software dan hardware tools, tapi saya tidak repot. Mari kita lihat lebih dekat algoritma polling kedua. Selama operasi, mikrokontroler terus membaca data dari pin di mana encoder hang dan membandingkan apa yang dibaca dengan hasil pembacaan sebelumnya. Bergantung pada hasil perbandingan keadaan, program menarik kesimpulan tentang arah rotasi. Ada komentar dalam program, saya pikir mereka akan cukup untuk memahami algoritme. Jika Anda memiliki pertanyaan, Anda dapat bertanya, seperti biasa, di komentar.

Pembuat enkode tambahan seperti potensiometer, tetapi tidak seperti potensiometer, ia tidak memiliki posisi ujung, ia dapat berputar di kedua arah untuk jumlah putaran yang tidak terbatas. Perlu juga dicatat bahwa encoder tambahan tidak berputar semulus potensiometer, tetapi dalam beberapa langkah. Hal ini dapat dilihat di radio mobil, osiloskop, pusat musik, mesin cuci, dan peralatan lainnya, di mana penyesuaian parameter dilakukan dalam batas yang lebar. Tentu saja, parameter juga dapat diubah menggunakan tombol, misalnya, untuk membuat musik 20 nilai lebih keras, saat mengontrol tombol, Anda perlu menekannya 20 kali, dan saat mengontrol encoder, putar di sudut tertentu, tergantung pada algoritma pemrosesan.

Pembuat enkode tambahan mewakili dua kontak, urutan penutupan yang tergantung pada arah rotasi.


Faktanya encoder tambahan mengubah rotasi poros menjadi impuls listrik berisi informasi tentang arah putaran.

Mari kita buat rangkaian uji yang ditunjukkan pada gambar di atas dan sambungkan ke pin A dan B osiloskop, resistor pull-up - 4.7K.
Mari kita putar encoder searah jarum jam.


Sekarang berlawanan arah jarum jam.


Osilogram menunjukkan bahwa, tergantung pada arah rotasi, urutan penutupan kontak berubah. Tapi bagian depan tidak selalu menjadi begitu indah.


Karena kontak bersifat mekanis, mereka cenderung memantul, yaitu, ketika menutup karena elastisitas bahan, terjadi beberapa korsleting dan bukaan yang tidak terkendali, yang dapat dilihat pada osilogram di atas.

Ada dua cara untuk menangani bouncing, pertama terdiri dalam menambahkan kapasitor dan resistor seperti yang ditunjukkan pada gambar di bawah ini.


Karena bouncing adalah fenomena jangka pendek, itu mudah dipadamkan oleh kapasitor.


Osilogram menunjukkan bahwa setelah memasang kapasitor, bagian depan menjadi kurang curam, dan pantulan menghilang.

Cara kedua- perangkat lunak dan itu semua tergantung pada pelaksanaan polling output encoder. Jika status encoder dipantau oleh interupsi eksternal, kemudian setelah interupsi dipicu, perlu dilakukan penundaan 20-30 milidetik, di mana MC tidak akan merespons perubahan status keluaran, yaitu tidak akan terasa terpental. Jika polling pin encoder diimplementasikan pada timer, maka interval antar polling harus lebih lama dari durasi pantulan, yaitu 20-30 milidetik yang sama.

mari kita pertimbangkan metode pemrosesan data yang berasal dari encoder.
Metode pertama adalah kita menghubungkan salah satu kaki encoder ke output interupsi eksternal dan mengaturnya untuk interupsi di tepi jatuh. Dalam interupsi, kami memeriksa keadaan kaki lainnya, dan jika itu nol, maka rotasi terjadi dalam satu arah, sebaliknya di yang lain. Di bawah ini adalah kode yang mengimplementasikan metode ini untuk AVR.
#termasuk ISR (INT2_vect) (jika (PINB & 0X02) (PORTB | = (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<Ketika encoder diputar ke satu sisi, LED menyala, ketika encoder diputar ke sisi lain, padam.

Cara kedua adalah membandingkan keadaan saat ini dan sebelumnya... Mari kita nyatakan level logika rangkaian pulsa sebagai nol dan satu.


Kemudian kita mendapatkan jumlah status encoder yang terbatas. Digit pertama adalah level logika dari output pertama encoder, yang kedua adalah level logika dari output kedua.

Misalkan keadaan terakhir di mana pembuat enkode berada sama dengan tiga, jika keadaan berikutnya sama dengan satu, maka ia berputar ke satu arah, jika dua, lalu ke arah lain. Ternyata Anda dapat memperbaiki transisi dari satu keadaan ke keadaan lain dan menentukan arah rotasi, tetapi implementasi paling sederhana adalah ketika Anda beralih dari 11 ke 01 dan 10. Di bawah ini adalah kode yang mengimplementasikan algoritma yang dijelaskan untuk AVR,
#define F_CPU 8000000UL #include #termasuk uint8_t last_state = 0; ISR (TIMER0_COMP_vect) (// kedua pin encoder terhubung ke pin 2 dan 3 dari port B // membaca statusnya uint8_t current_state = (PINB & 0x06) >> 1; // memperhitungkan transisi hanya jika status sebelumnya adalah 11 // dan jika tidak sama dengan yang baru if ((last_state == 3) && (last_state! = current_state)) (// jika state baru adalah 01 - nyalakan LED if (current_state == 1) (PORTB | = 0x01;) // jika status baru adalah 10 - matikan LED if (current_state == 2) (PORTB & = ~ 0x01;)) // saat keluar dari interupsi, status saat ini menjadi last_state sebelumnya = current_state;) int main (void) (// dua input untuk menghubungkan encoder DDRB & = ~ 0x06; // tarik input ke catu daya PORTB | = 0x06; // output untuk menghubungkan LED DDRB | = 0x01 ; // atur timer untuk reset secara kebetulan TCCR0 = (1<Itu saja.
Enkoder dibeli

Modul encoder KY-040 adalah sensor sudut rotasi mekanis, yang mengubah sudut rotasi objek yang berputar (misalnya, poros) menjadi sinyal listrik yang digeser 90 derajat relatif satu sama lain. Modul ini memiliki tiga pin - CLK, DT dan SW. Sinyal yang digeser 90 derajat relatif satu sama lain muncul tepat pada pin CLK dan DT ketika diputar searah / berlawanan arah jarum jam, pin SW digunakan untuk mendapatkan keadaan sumbu tengah encoder, yang berfungsi sebagai tombol.

Jadi, tanpa masuk ke detail perangkat encoder dalam sirkuit (ini akan menjadi artikel terpisah), mari kita hubungkan ke papan Arduino Uno. Diagram koneksi modul encoder bersama dengan indikator tujuh segmen multi-digit:

Kita cukup mengurai status sinyal yang diberikan oleh pin CLK dan DT, untuk ini ada diagram rangkaian kecil yang akan menunjukkan bagaimana sinyal digeser ketika berputar ke satu arah atau lainnya.

Dapat dilihat dari diagram bahwa setiap kali sinyal A (pin encoder CLK) berubah dari tinggi ke rendah, keadaan sinyal B (pin encoder DT) terbaca. Jika sinyal B memberikan level sinyal yang tinggi, berarti putaran encoder searah jarum jam. Jika sinyal B memberikan level sinyal rendah pada transisi sinyal A dari level rendah ke level tinggi, ini berarti putaran encoder berlawanan arah jarum jam. Dengan membaca kedua sinyal ini dalam program, Anda dapat menentukan arah rotasi, juga saat menghitung pulsa sinyal B, Anda dapat menambah atau mengurangi penghitung pulsa perangkat lunak.

Untuk membaca sinyal A dan B, serta sinyal dari sumbu tengah encoder (ingat - ini berfungsi seperti tombol), Anda dapat menerapkan struktur yang dijelaskan di bawah ini. Desain ini dapat dibangun ke dalam sketsa, menambahkan berbagai fungsionalitas ke dalamnya, semuanya hanya dibatasi oleh keinginan dan imajinasi pengembang. Tubuh struktur cukup baik dikomentari, komentar lebih lanjut dapat dihapus untuk kesederhanaan teks sketsa. Jadi, struktur untuk membaca dan mengubah sinyal encoder menjadi data yang berguna:

// Variabel sementara untuk menyimpan level sinyal // diterima dari encoder unsigned char encoder_A, encoder_B, encoder_A_prev; // Variabel untuk melacak klik tombol - // sumbu tengah encoder static bool SW_State = false; void setup () (// Presets // Deklarasi variabel // Inisialisasi port, dll.) void loop () (// Hubungkan CLK ke pin 3 pada board Arduino // Hubungkan DT ke pin 4 pada board Arduino // Baca nilai keluaran encoder // Dan simpan dalam variabel encoder_A = digitalRead (3); encoder_B = digitalRead (4); // Jika level sinyal A rendah, // dan pada siklus sebelumnya tinggi jika (! Encoder_A && encoder_A_prev) ( // Jika level sinyal B tinggi if (encoder_B) (// Ini berarti rotasi searah jarum jam // Di sini Anda dapat menyisipkan operasi kenaikan // Di sini Anda dapat menyisipkan sebagian dari Anda sendiri // operasi pemrosesan data ke arah yang diperlukan) // Jika level sinyal Ke rendah yang lain (// Ini berarti rotasi berlawanan arah jarum jam // Di sini Anda dapat memasukkan operasi penurunan // Di sini Anda dapat memasukkan beberapa operasi pemrosesan data // Anda sendiri ke arah yang diperlukan)) // Anda harus menyimpan status level sinyal saat ini A // untuk digunakan menggunakan nilai ini dalam siklus pemindaian berikutnya dari program encoder_A_prev = encoder_A; // Kami bekerja dengan sumbu tengah encoder - sebuah tombol // Bagian kode ini membentuk semacam pemicu sakelar // Membaca nilai pin 2 pada papan Arduino // yang terhubung dengan pin SW encoder // Jika sumbu tengah ditekan, maka sinyal SW akan low level jika (! digitalRead (2)) (// Jika variabel SW_State disetel ke false, maka setel ke true jika (! SW_State) (// Dan ingat keadaan SW_State = true;) // Dan sebaliknya - jika variabel SW_State disetel ke true , // lalu reset ke false else (// Dan ingat keadaan SW_State = false;)))

Sketsa untuk memproses sinyal encoder dan menampilkan nilai penghitung pada tampilan ditunjukkan di bawah ini. Sketsa ini memiliki struktur bawaan untuk membaca dan mengubah sinyal encoder, yang dijelaskan di atas.

#include "LedControl.h" / * * Kami menghubungkan library LedControl.h * dan membuat objek kelas LedControl * sedangkan tampilan 7-segmen dengan driver MAX72xx * harus terhubung ke board Arduino sebagai berikut: * Arduino -> Modul Tampilan MAX72xx * Arduino -> Modul Tampilan MAX72xx * Arduino -> Modul Tampilan MAX72xx * Arduino -> Modul Tampilan MAX72xx * Arduino -> Modul Tampilan MAX72xx * Arduino -> Modul Encoder * Arduino -> Modul Encoder * Arduino -> Encoder Modul * / LedControl lc = LedControl (12, 11, 10, 1); // Beri nama alamat port pada board Arduino const int Dir = 4; const int Langkah = 3; const int Saklar = 2; // Counter adalah variabel untuk menyimpan nilai counter static long Counter = 0; // SW_State - pemicu bendera untuk melacak penekanan sumbu pusat static bool SW_State = false; // Variabel sementara untuk menyimpan level sinyal encoder unsigned char encoder_A, encoder_B, encoder_A_prev; void setup () (// Perangkat (tampilan 7-segmen) dikeluarkan dari mode tidur lc.shutdown (0, false); // Atur kecerahan tampilan ke 8 // Total kemungkinan mode kecerahan dari 0 hingga 15 lc. setIntensity (0 , 8); // Hapus tampilan lc.clearDisplay (0); // Konfigurasi port untuk encoder pinMode (Dir, INPUT); pinMode (Langkah, INPUT); pinMode (Switch, INPUT);) void loop () (// Baca nilai output encoder // Dan simpan dalam variabel encoder_A = digitalRead (Langkah); encoder_B = digitalRead (Dir); // Jika level sinyal A rendah, // dan di siklus sebelumnya high if (! Encoder_A && encoder_A_prev) ( // Jika level sinyal B tinggi if (encoder_B) (// Ini berarti rotasi searah jarum jam // Kondisi kita: // Jika nilai counter lebih besar dari atau sama dengan jumlah maksimum if (Counter> = 99999999) (// Reset nilai counter Counter = 0;) else (// Jika tidak, naikkan setiap kali Anda mengklik satu Counter ++;)) // Jika level sinyal B rendah lagi (// Zn Membaca rotasi berlawanan arah jarum jam // Jika nilai counter kurang dari atau sama dengan nol jika (Counter<= 0) { //проинициализировать значение максимальным числом Counter = 99999999; } else { //Иначе декрементировать при каждом щелчке на единицу Counter --; } } } //Обязательно нужно сохранить состояние текущего уровня сигнала А //для использования этого значения в следующем цикле сканирования программы encoder_A_prev = encoder_A; //Работаем с центральной осью энкодера - кнопкой //Этот кусок кода образует собой как бы перекидной триггер //Считываем значение пина 2 на плате Arduino //которомый проименован как Switch //Если центральная ось нажата - то сигнал Switch будет иметь низкий уровень if(!digitalRead(Switch)) { //Если переменная SW_State установлена в false то установить её в true if(!SW_State) { //И запомнить состояние SW_State = true; } //И наоборот - если переменная SW_State установлена в true, //то сбросить её в false else { //И запомнить состояние SW_State = false; } } //Часть программы которая заполняет разряды //семисегментного дисплея значением счетчика long intCounter = Counter; int divCounter; for(int i = 0; i < 8; i ++) { divCounter = intCounter % 10; intCounter = intCounter / 10; if(intCounter == 0 && SW_State) { if(divCounter == 0) { if(i == 0) { lc.setChar(0, 0, "0", false); } else { lc.setChar(0, i, " ", false); } } else { lc.setDigit(0, i, divCounter, false); } } else { lc.setDigit(0, i, divCounter, false); } } }

Video cara kerjanya:


Kami harap Anda menyukai materi artikel ini, tinggalkan pertanyaan, keinginan, dan kritik Anda di komentar di bawah.

  • Menggunakan encoder optik industri di Arduino
Harap aktifkan javascript agar komentar berfungsi.

Untuk mengimplementasikan proyek demo, kita perlu:

  • enkoder 24 posisi;
  • 16 LED (3mm);
  • Sopir LED A6276;
  • mikrokontroler PIC18F2550.

Encoder adalah elemen kontrol modern dan asli untuk perangkat digital, dan dalam tampilannya mirip dengan resistor variabel (lihat gambar di bawah). Nama lain dari kontrol ini adalah sensor sudut, sensor rotasi. Rotasi poros disertai dengan klik, misalnya 24 klik per putaran. Encoder memiliki 3 output - A, B, C dan digunakan untuk input data cepat ke perangkat digital. Beberapa model memiliki tombol built-in yang dipicu dengan menekan poros encoder (satu output lagi ditambahkan).

Prinsip kerja encoder

Saat memutar satu klik, misalnya ke kanan, kontak A+C ditutup terlebih dahulu, lalu B+C. Ketika poros berputar di klik ini, kontak terbuka dalam urutan yang sama. Ketika poros diputar ke arah lain, urutan penutupan dengan kontak C berubah, yaitu. ketika berbelok ke kiri, pertama B + C ditutup, lalu A + C.

Menggunakan encoder dalam proyek mikrokontroler, mungkin menggunakan encoder yang sama, menerapkan beberapa jenis input data yang berbeda, namun, ini memerlukan beberapa umpan balik dan visualisasi sehingga pengguna mengetahui informasi apa yang dia masukkan dan di posisi mana encoder berada.

Diagram skematik

Pin encoder A dan B terhubung ke port mikrokontroler RB4 dan RB5, pin encoder C terhubung ke ground. Perlu dicatat bahwa resistor pull-up harus dihubungkan ke jalur sinyal pin A dan B. Encoder tidak sengaja terhubung ke jalur I / O mikrokontroler yang ditentukan: pertama, port B memiliki resistor pull-up bawaan dan kita tidak harus menghubungkan yang eksternal, dan kedua, port B mikrokontroler memiliki fungsi yang sangat fungsi yang berguna - "interrupt-on-change" - interupsi pada perubahan level, yang memungkinkan kami memantau status encoder.

16 LED 3mm konvensional digunakan untuk memvisualisasikan data input dan akan ditempatkan pada PCB di sekitar encoder yang terpasang. LED terhubung ke chip A6276.

A6276 adalah driver LED serial 16-bit. Driver berisi register geser CMOS 16-bit, kait dan driver terkait untuk menggerakkan LED, dan dapat menggerakkan lebih banyak LED daripada yang dimungkinkan oleh mikrokontroler. Selain itu, driver dapat dikontrol melalui antarmuka SPI, yang selanjutnya mengurangi jumlah jalur I / O yang digunakan dan membuat proyek dapat diskalakan.

Perangkat lunak mikrokontroler untuk memecahkan masalah kita relatif sederhana. Ada 3 mode operasi (input informasi) dan umpan balik:

  • Mode pemosisian 360 ° - dalam mode ini, LED menunjukkan "posisi" enkoder saat ini, pengguna dapat memutar poros enkoder ke kiri dan kanan di sudut mana pun;
  • Mode "Volume / Level" - dalam mode ini, LED menunjukkan nilai saat ini antara level minimum dan maksimum dari rentang input (seperti level volume pada perangkat audio);
  • Mode Toggle Rotary 3-Position - Dalam mode ini hanya ada tiga posisi yang dapat dipilih yang dipilih pengguna dengan memutar poros encoder ke kiri / kanan.

Demonstrasi proyek

Unduhan

Arsip ZIP dengan proyek di lingkungan MPLAB dan kode sumber di Hitech C, serta diagram skematik dan topologi papan sirkuit tercetak berada.

Dalam proyek demo ini, kita akan melihat tugas memasangkan kontrol yang disebut encoder dengan mikrokontroler PIC.

Untuk mengimplementasikan proyek demo, kita perlu:

  • enkoder 24 posisi;
  • 16 LED (3mm);
  • pengemudi LED;
  • mikrokontroler.

Encoder adalah elemen kontrol modern dan asli untuk perangkat digital, dan dalam tampilannya mirip dengan resistor variabel (lihat gambar di bawah). Nama lain dari kontrol ini adalah sensor sudut, sensor rotasi. Rotasi poros disertai dengan klik, misalnya 24 klik per putaran. Encoder memiliki 3 pin - A, B, C dan digunakan untuk entri data cepat ke perangkat digital. Beberapa model memiliki tombol built-in yang dipicu dengan menekan poros encoder (satu output lagi ditambahkan).

Prinsip kerja encoder

Saat memutar satu klik, misalnya ke kanan, kontak A+C ditutup terlebih dahulu, lalu B+C. Ketika poros berputar di klik ini, kontak terbuka dalam urutan yang sama. Ketika poros diputar ke arah lain, urutan penutupan dengan kontak C berubah, yaitu. ketika berbelok ke kiri, pertama B + C ditutup, lalu A + C.

Menggunakan encoder dalam proyek mikrokontroler, mungkin menggunakan encoder yang sama, menerapkan beberapa jenis input data yang berbeda, namun, ini memerlukan beberapa umpan balik dan visualisasi sehingga pengguna mengetahui informasi apa yang dia masukkan dan di posisi mana encoder berada.


Diagram skematik: menghubungkan encoder ke mikrokontroler PIC (klik untuk memperbesar)

Pin encoder A dan B terhubung ke port mikrokontroler RB4 dan RB5, pin encoder C terhubung ke ground. Perlu dicatat bahwa resistor pull-up harus dihubungkan ke jalur sinyal pin A dan B. Encoder tidak sengaja terhubung ke jalur I / O mikrokontroler yang ditentukan: pertama, port B memiliki resistor pull-up bawaan dan kita tidak harus menghubungkan yang eksternal, dan kedua, port B mikrokontroler memiliki fungsi yang sangat fungsi yang berguna - "interrupt-on-change" - interupsi pada perubahan level, yang memungkinkan kami memantau status encoder.

16 LED 3mm konvensional digunakan untuk memvisualisasikan data input dan akan ditempatkan pada PCB di sekitar encoder yang terpasang. LED terhubung ke chip A6276.

Sirkuit mikro adalah driver LED dengan input informasi serial 16-bit. Driver berisi register geser CMOS 16-bit, kait dan driver terkait untuk menggerakkan LED, dan dapat menggerakkan lebih banyak LED daripada yang dimungkinkan oleh mikrokontroler. Selain itu, driver dapat dikontrol melalui antarmuka SPI, yang selanjutnya mengurangi jumlah jalur I / O yang digunakan dan membuat proyek dapat diskalakan.

Perangkat lunak mikrokontroler untuk memecahkan masalah kita relatif sederhana. Ada 3 mode operasi (input informasi) dan umpan balik:

  • Mode pemosisian 360 ° - dalam mode ini, LED menunjukkan "posisi" enkoder saat ini, pengguna dapat memutar poros enkoder ke kiri dan kanan di sudut mana pun;
  • Mode "Volume / Level" - dalam mode ini, LED menunjukkan nilai saat ini antara level minimum dan maksimum dari rentang input (seperti level volume pada perangkat audio);
  • Mode Toggle Rotary 3-Position - Dalam mode ini hanya ada tiga posisi yang dapat dipilih yang dipilih pengguna dengan memutar poros encoder ke kiri / kanan.

Demonstrasi proyek