Daftar Isi:

Bagaimana Menafsirkan Arah Rotasi Dari Saklar Rotary Digital Dengan PIC: 5 Langkah
Bagaimana Menafsirkan Arah Rotasi Dari Saklar Rotary Digital Dengan PIC: 5 Langkah

Video: Bagaimana Menafsirkan Arah Rotasi Dari Saklar Rotary Digital Dengan PIC: 5 Langkah

Video: Bagaimana Menafsirkan Arah Rotasi Dari Saklar Rotary Digital Dengan PIC: 5 Langkah
Video: World's Largest FREE WILL Debate w/ Top Physicists & Philosophers 2024, November
Anonim
Bagaimana Menginterpretasikan Arah Rotasi Dari Saklar Rotary Digital Dengan PIC
Bagaimana Menginterpretasikan Arah Rotasi Dari Saklar Rotary Digital Dengan PIC

Tujuan dari Instruksi ini adalah untuk mengilustrasikan bagaimana menghubungkan sakelar putar digital (kode kuadrat) dengan mikrokontroler. Jangan khawatir, saya akan menjelaskan apa artinya kode kuadratur bagi kita. Antarmuka ini dan perangkat lunak yang menyertainya akan memungkinkan mikrokontroler untuk mengenali arah putaran untuk setiap gerakan dari satu tahanan ke yang lain. Saya baru-baru ini menggunakan sakelar jenis ini dalam proyek mikrokontroler yang memerlukan titik setel tekanan untuk dimasukkan menggunakan kenop dengan 16 detent alih-alih tombol atas/bawah. Idenya adalah untuk memungkinkan pengguna "memasukkan" tekanan yang diinginkan. Akibatnya, kami harus mengembangkan rutin perangkat lunak untuk mendapatkan informasi posisi dari sakelar dan menyimpulkan arah rotasi untuk menambah atau mengurangi titik setel tekanan untuk sistem utama. Dalam Instruksi ini, saya akan membahas antarmuka fisik ke mikrokontroler, teori operasi sakelar putar, teori operasi perangkat lunak serta deduksi rutin. Akhirnya, saya akan menunjukkan kepada Anda aplikasi saya dari rutinitas deduksi. Seiring kemajuan kita, saya akan mencoba untuk menjaga hal-hal yang agak umum sehingga ide dapat diterapkan pada platform sebanyak mungkin, tetapi saya juga akan membagikan apa yang saya lakukan sehingga Anda dapat melihat aplikasi tertentu.

Langkah 1: Bagian

Bagian
Bagian

Untuk menerapkan ini, Anda memerlukan:Sakelar putar (kode kuadratur)Resistor tarik Platform mikrokontroler yang sesuaiUntuk proyek saya, saya menggunakan enkoder optik Grayhill 61C22-01-04-02. Lembar data untuk sakelar putar meminta resistor tarik 8,2k ohm pada dua jalur data yang berasal dari sakelar. Anda akan ingin memeriksa lembar data untuk encoder yang Anda pilih untuk digunakan. Sakelar putar yang saya gunakan juga dapat dipesan dengan sakelar tombol tekan aksial. Ini adalah fitur yang berguna untuk melakukan pilihan yang telah dipanggil, dll. Tapi saya tidak akan membahas antarmukanya di sini. Saya memiliki "platform mikrokontroler yang cocok" terdaftar karena (saya pikir) ini dapat diimplementasikan pada lebih dari satu platform. Saya telah melihat banyak orang menggunakan mikrokontroler lain untuk Instructables jadi saya ingin menunjukkan pendekatan umum juga. Saya menulis semua kode di PIC Basic Pro untuk digunakan dengan Microchip PIC16F877A. Sungguh, hal utama yang Anda butuhkan pada mikrokontroler adalah kemampuan untuk menginterupsi ketika ada perubahan logika pada salah satu dari dua pin. Pada PIC16F877A, ini disebut interupsi perubahan PORTB. Mungkin ada nama lain untuk itu di pengontrol lain. Fitur interupsi mikrokontroler ini adalah bagian dari apa yang membuat implementasi ini begitu elegan.

Langkah 2: Antarmuka Perangkat Keras

Antarmuka Perangkat Keras
Antarmuka Perangkat Keras

Solusi "sederhana" adalah memiliki sakelar "single pole-16 throw" dengan 16 koneksi ke mikrokontroler. Setiap keluaran saklar kemudian akan diikatkan ke sebuah pin pada mikrokontroler sehingga setiap posisi dial dapat diperiksa oleh mikrokontroler. Ini adalah penggunaan pin I/O yang berlebihan. Hal-hal menjadi lebih buruk jika kita menginginkan lebih dari 16 posisi (penahanan) tersedia bagi kita di sakelar. Setiap posisi tambahan pada sakelar akan membutuhkan input tambahan ke mikrokontroler. Ini dengan cepat menjadi penggunaan input yang sangat tidak efisien pada mikrokontroler. Masukkan keindahan sakelar putar. Sakelar putar hanya memiliki dua keluaran ke mikrokontroler yang terdaftar sebagai A dan B pada lembar data. Hanya ada empat kemungkinan level logika yang dapat diambil oleh jalur ini: AB = 00, 01, 10 dan 11. Ini sangat mengurangi jumlah jalur input yang harus Anda gunakan dalam menghubungkan sakelar ke mikrokontroler. Jadi, kami telah memotong jumlah baris input menjadi hanya dua. Sekarang apa? Sepertinya kita benar-benar membutuhkan 16 status berbeda tetapi sakelar baru ini hanya memiliki empat. Sudahkah kita menembak diri kita sendiri di kaki? Tidak. Baca terus. Kami akan membahas sedikit teori di balik operasi sakelar putar untuk dijelaskan.

Langkah 3: Teori Operasi Perangkat Keras

Teori Operasi Perangkat Keras
Teori Operasi Perangkat Keras
Teori Operasi Perangkat Keras
Teori Operasi Perangkat Keras
Teori Operasi Perangkat Keras
Teori Operasi Perangkat Keras

Penginderaan arah rotasi dimungkinkan menggunakan sakelar "single pole-16 throw" yang disebutkan di atas tetapi menggunakan banyak input pada mikrokontroler. Menggunakan sakelar putar mengurangi jumlah input ke mikrokontroler tetapi sekarang kita perlu menafsirkan sinyal yang berasal dari sakelar dan menerjemahkannya ke arah rotasi. Saya sebutkan sebelumnya bahwa sakelar diberi kode kuadratur. Ini juga merupakan salah satu keanggunan utama dalam solusi ini. Ini berarti bahwa ada kode 2-bit yang diberikan sakelar yang sesuai dengan posisi sakelar. Anda mungkin berpikir: "Jika ada input dua bit ke mikrokontroler, bagaimana kita mewakili semua 16 posisi?" Itu pertanyaan yang bagus. Kami tidak mewakili mereka semua. Kita hanya perlu mengetahui posisi relatif kenop sehingga kita dapat menentukan arah putaran. Posisi absolut kenop tidak relevan. Untuk rotasi searah jarum jam, kode yang diberikan sakelar berulang setiap empat detent dan diberi kode abu-abu. Kode abu-abu berarti bahwa hanya ada satu perubahan bit untuk setiap perubahan posisi. Alih-alih input AB menghitung untuk rotasi searah jarum jam dalam biner seperti ini: 00, 01, 10, 11, itu berubah seperti ini: 00, 10, 11, 01. Perhatikan bahwa untuk pola terakhir, hanya ada satu input yang berubah antara set. Nilai berlawanan arah jarum jam untuk input AB ke mikrokontroler akan terlihat seperti ini: 00, 01, 11, 10. Ini hanyalah kebalikan dari pola searah jarum jam dengan AB = 00 terdaftar pertama. Lihat diagram untuk penjelasan yang lebih visual.

Langkah 4: Teori Operasi Perangkat Lunak

Teori Operasi Perangkat Lunak
Teori Operasi Perangkat Lunak

Rutin yang menyimpulkan arah rotasi didorong oleh interupsi. Mikrokontroler yang Anda pilih harus dapat menginterupsi setiap kali ada perubahan pada salah satu (setidaknya) dua pin saat interupsi diaktifkan. Ini disebut interupsi perubahan PORTB pada PIC16F877A. Setiap kali saklar diputar, mikrokontroler akan terganggu dan eksekusi program akan dikirim ke Interrupt Service Routine (ISR). ISR akan dengan cepat mengetahui ke arah mana sakelar diputar, mengatur tanda dengan tepat dan dengan cepat kembali ke program utama. Kami membutuhkan ini terjadi dengan cepat jika pengguna memutar sakelar dengan sangat cepat. Kami tahu pola AB berkode abu-abu berulang setiap empat posisi jadi jika kami membuat pekerjaan rutin untuk transisi antara empat posisi itu, itu akan berhasil untuk yang lainnya. Perhatikan bahwa dalam satu siklus empat posisi, ada empat sisi. Tepi naik dan tepi turun untuk input A serta input B. Mikroprosesor akan terputus setiap kali ada tepi yang berarti mikrokontroler akan terganggu setiap kali kenop diputar. Akibatnya, ISR perlu mencari tahu ke arah mana kenop diputar. Untuk membantu kami mengetahui bagaimana melakukan ini, kami beralih ke bentuk gelombang untuk rotasi searah jarum jam. Perhatikan bahwa setiap kali A memiliki tepi, nilai barunya selalu berbeda dari nilai B. Ketika kenop berpindah dari posisi 1 ke 2, A bertransisi dari logika-0 ke logika-1. B masih 0 untuk transisi ini dan tidak cocok dengan nilai baru A. Ketika kenop berpindah dari posisi 3 ke 4, A memiliki sisi jatuh sementara B tetap pada logika-1. Perhatikan lagi, bahwa B dan nilai baru A berbeda. Saat ini, kita dapat melihat bahwa setiap kali A menyebabkan interupsi selama rotasi searah jarum jam, nilai barunya berbeda dari nilai B. Mari kita periksa B untuk melihat apa yang terjadi. B memiliki tepi naik ketika sakelar beralih dari posisi 2 ke 3. Di sini, nilai baru B adalah sama dengan A. Melihat tepi terakhir yang tersisa untuk rotasi searah jarum jam, B memiliki tepi jatuh yang bergerak dari posisi 4 ke 5. (Posisi 5 sama dengan posisi 1.) Nilai baru B juga sama dengan A di sini! Kami sekarang dapat membuat beberapa pengurangan! Jika A menyebabkan interupsi dan nilai baru A berbeda dari nilai B, maka putarannya searah jarum jam. Selain itu, jika B menyebabkan interupsi dan nilai baru B sama dengan A, maka rotasinya searah jarum jam. Mari kita cepat memeriksa kasus rotasi berlawanan arah jarum jam. Sama seperti rotasi searah jarum jam, rotasi berlawanan arah jarum jam akan menyebabkan empat interupsi dalam satu siklus: dua untuk input A dan dua untuk input B. Input A memiliki tepi naik ketika kenop bergerak dari posisi 4 ke 3 dan tepi jatuh bergerak dari posisi 2 ke 1 Ketika kenop bergerak dari posisi 4 ke 3, nilai baru A sama dengan nilai B. Perhatikan bahwa ketika A bergerak dari posisi 2 ke 1, nilai barunya juga sama dengan nilai B. Sekarang, kita dapat melihat bahwa ketika A menyebabkan interupsi dan nilai barunya cocok dengan nilai B, rotasinya berlawanan arah jarum jam. Dengan cepat, kita akan melihat input B untuk memverifikasi semuanya. B akan menyebabkan interupsi ketika kenop bergerak dari posisi 5 (yang sama dengan 1) ke 4 dan saat kenop bergerak dari posisi 3 ke 2. Dalam kedua kasus ini, nilai B yang baru tidak sesuai dengan nilai yang ada dari A yang merupakan kebalikan dari kasus ketika B menyebabkan interupsi untuk rotasi searah jarum jam. Ini adalah kabar baik. Semuanya memeriksa seperti seharusnya. Untuk meringkas, jika A menyebabkan interupsi dan nilai barunya tidak sesuai dengan nilai B atau jika B menyebabkan interupsi dan nilai baru B cocok dengan nilai A kita tahu ada rotasi searah jarum jam. Kita dapat memeriksa kasus lain untuk rotasi berlawanan arah jarum jam dalam perangkat lunak atau kita dapat berasumsi bahwa karena itu bukan rotasi searah jarum jam, itu berlawanan arah jarum jam. Rutinitas saya hanya membuat asumsi.

Langkah 5: Perangkat Lunak

Perangkat lunak
Perangkat lunak
Perangkat lunak
Perangkat lunak

Saya tidak menggunakan interupsi bawaan di PIC Basic Pro. Saya menggunakan beberapa file yang saya sertakan dalam kode saya dari Darrel Taylor untuk menjalankan rutinitas. Di sinilah kredit besar untuk Darrel berada! File-file tersebut gratis. Kunjungi saja situs webnya untuk informasi lebih lanjut, aplikasi lain, dan untuk mengunduh file. Anda dapat melewati bagian ini jika Anda tidak menggunakan PIC dengan interupsi Darrel Taylor. Cukup atur interupsi seperlunya pada platform yang Anda gunakan. Untuk menyiapkan interupsi Darrel Taylor (DT), ada dua hal yang harus dilakukan: 1.) Sertakan file DT_INTS-14.bas dan ReEnterPBP.bas di code.2.) Salin dan tempel ini ke kode Anda. ASMINT_LIST makro;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASMISisipkan tab dan spasi seperti grafik di akhir Instructable sehingga Anda dapat melihat hal-hal sedikit lebih mudah dalam kode Anda. Anda harus sedikit memodifikasinya agar sesuai dengan kebutuhan Anda. Di bawah Label, ganti ISR dengan nama subrutin yang merupakan ISR Anda. Jangan lupa garis bawahnya! Anda membutuhkannya! Agar interupsi bekerja, ada dua hal lagi yang harus dilakukan: 1.) Tulis ISR. Anda akan menulis ini seperti Anda akan menulis subrutin PBP kecuali bahwa Anda harus memasukkan @ INT_RETURN di akhir subrutin alih-alih RETURN. Ini akan mengakui interupsi dan mengembalikan eksekusi program ke tempat yang ditinggalkannya di loop utama. Di dalam ISR, Anda perlu menghapus flag interupsi sehingga program Anda tidak terjebak dalam interupsi rekursif. Cukup membaca PORTB saja yang perlu dilakukan untuk menghapus flag interupsi pada PIC16F877A. Setiap mikrokontroler yang berbeda memiliki cara yang berbeda untuk membersihkan flag interupsi. Periksa lembar data untuk mikrokontroler Anda.2.) Ketika Anda mencapai titik dalam kode Anda bahwa Anda ingin mengaktifkan interupsi, gunakan baris kode ini:@ INT_ENABLE RBC_INTBila Anda ingin menonaktifkan interupsi cukup gunakan:@ INT_DISABLE RBC_INTAda banyak dari hal-hal yang dikemas ke dalam apa yang baru saja saya bahas jadi saya akan meringkas dengan cepat. Sejauh ini, program Anda akan terlihat seperti ini:; Setiap pengaturan atau kode yang diperlukan TERMASUK "DT_INTS-14.bas"TERMASUK "ReEnterPBP.bas"ASMINT_LIST makro;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, ya endm INT_CREATEENDASM; Pengaturan lain yang diperlukan atau kode@ INT_ENABLE RBC_INT; Kode yang perlu tahu ke arah mana kenop berputar@ INT_DISABLE RBC_INT; Kode lainnyaEND; Akhir dari programmyISR:;Kode ISR di sini@ INT_RETURN (Tabel Pengaturan Handler Interrupt) Saya pikir ini adalah tempat siapa pun yang tidak menggunakan interupsi PIC atau DT dapat bergabung lagi. Sekarang, kita harus benar-benar menulis ISR sehingga mikrokontroler tahu ke arah mana kenop berputar. Ingat dari bagian teori perangkat lunak bahwa kita dapat menyimpulkan arah rotasi jika kita mengetahui input yang menyebabkan interupsi, nilai barunya dan nilai input lainnya. Berikut pseudocodenya: Baca PORTB ke dalam variabel awal untuk menghapus flag interupsi Periksa apakah A menyebabkan interupsi. Jika benar, Bandingkan A dan B. Periksa jika berbeda, jika berbeda, Itu adalah rotasi searah jarum jam Lain, Itu berlawanan arah jarum jam EndifPeriksa apakah B menyebabkan interupsi. Jika benar, Bandingkan A dan B Periksa jika berbeda, jika sama, Itu adalah rotasi searah jarum jam Lain, Berlawanan arah jarum jam EndifKembali dari interupsi Bagaimana kita tahu jika perubahan pada A atau B menyebabkan interupsi? Menemukan nilai baru dari input yang diubah dan input lainnya (tidak berubah) itu mudah karena kita dapat membacanya di dalam ISR. Kita perlu tahu apa keadaan masing-masing sebelum eksekusi dikirim ke ISR. Ini terjadi dalam rutinitas utama. Rutin utama duduk dan menunggu variabel byte yang kami sebut CWflag disetel ke 1 atau dihapus ke 0 oleh ISR. Setelah setiap perubahan kenop yang diakui atau jika tidak ada aktivitas kenop, variabel diatur ke 5 untuk menunjukkan keadaan idle. Jika flag disetel atau dikosongkan, rutinitas utama segera menambah atau mengurangi tekanan set point secara tepat berdasarkan rotasi dan kemudian mengatur variabel CWflag kembali ke 5 karena kenop sekarang idle lagi. Karena rutin utama adalah memeriksa CWflag, ini juga mendokumentasikan status nilai sakelar putar A dan B. Ini sangat sederhana dan terlihat seperti ini:oldA = AoldB = BTidak ada yang super mewah di sini. Cukup sertakan dua baris di awal loop yang memeriksa CWflag untuk rotasi. Kami baru saja memperbarui nilai logika input dari kenop putar di dalam loop kenaikan/penurunan dalam rutinitas utama sehingga kami dapat melihat input apa yang menyebabkan interupsi ketika ISR dijalankan. Berikut adalah kode ISR:ABchange:scratch = PORTB ' Baca PORTB untuk menghapus tanda interupsi ' Jika A menyebabkan interupsi, periksa B untuk arah rotasi IF oldA != A THEN ' Jika A dan B berbeda, itu adalah rotasi searah jarum jam IF A != B THEN GOTO CW ' Sebaliknya, rotasi berlawanan arah jarum jam ELSE GOTO CCW ENDIF ENDIF ' Jika B menyebabkan interupsi, periksa A untuk arah putaran IF oldB != B THEN ' Jika A dan B sama, maka adalah rotasi searah jarum jam JIKA A == B THEN GOTO CW ' Sebaliknya, rotasi berlawanan arah jarum jam ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI telah menyertakan kode ISR dalam file AB_ISR.bas karena tab dalam kode tidak muncul sebagaimana mestinya. Sekarang, karena ISR memiliki nilai lama untuk input A dan B, ia dapat menentukan input mana yang menyebabkan interupsi, membandingkannya dengan input lain (tidak berubah) dan menentukan arahnya dari rotasi. Semua rutinitas utama yang harus dilakukan adalah memeriksa CWflag untuk melihat ke arah mana kenop telah berputar (jika ada) dan menambah atau mengurangi penghitung, titik setel atau apa pun yang Anda suka atau butuhkan. Saya harap ini membantu dan belum terlalu membingungkan. Jenis antarmuka ini sangat berguna jika sistem Anda sudah menggunakan interupsi karena ini hanya satu interupsi lagi untuk ditambahkan. Menikmati!

Direkomendasikan: