- Περιστροφικός κωδικοποιητής και οι τύποι του
- KY-040 Rotary Encoder Pinout και περιγραφή
- Πώς λειτουργεί το Rotary Encoder
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος διασύνδεσης περιστροφικού κωδικοποιητή PIC16F877A
- Επεξήγηση κώδικα
Ένας περιστροφικός κωδικοποιητής είναι μια συσκευή εισόδου που βοηθά το χρήστη να αλληλεπιδράσει με ένα σύστημα. Μοιάζει περισσότερο με ποτενσιόμετρο ραδιοφώνου, αλλά εξάγει μια σειρά παλμών που κάνει την εφαρμογή του μοναδική. Όταν περιστρέφεται το κουμπί του κωδικοποιητή, περιστρέφεται με τη μορφή μικρών βημάτων που το βοηθούν να χρησιμοποιηθεί για τον έλεγχο του κινητήρα stepper / servo, πλοήγηση σε μια ακολουθία του μενού και αύξηση / μείωση της τιμής ενός αριθμού και πολλά άλλα.
Σε αυτό το άρθρο, θα μάθουμε για τους διαφορετικούς τύπους Rotary Encoders και πώς λειτουργεί. Θα το συνδέσουμε επίσης με τον PIC Microcontroller PIC16F877A και θα ελέγξουμε την τιμή ενός ακέραιου περιστρέφοντας τον Encoder και θα εμφανίσουμε την τιμή του σε μια οθόνη LCD 16 * 2. Στο τέλος αυτού του σεμιναρίου, θα είστε άνετοι με τη χρήση Rotary Encoder για τα έργα σας. Ας ξεκινήσουμε λοιπόν…
Περιστροφικός κωδικοποιητής και οι τύποι του
Ο περιστροφικός κωδικοποιητής ονομάζεται συχνά κωδικοποιητής άξονα. Είναι ένας ηλεκτρομηχανικός μετατροπέας, που σημαίνει ότι μετατρέπει τις μηχανικές κινήσεις σε ηλεκτρονικούς παλμούς ή με άλλα λόγια μετατρέπει τη γωνιακή θέση ή τη θέση κίνησης ή άξονα σε ψηφιακό ή αναλογικό σήμα. Αποτελείται από ένα κουμπί που όταν περιστρέφεται θα κινείται βήμα προς βήμα και θα παράγει μια ακολουθία παλμών τρένων με προκαθορισμένο πλάτος για κάθε βήμα.
Υπάρχουν πολλοί τύποι περιστροφικού κωδικοποιητή στην αγορά που ο σχεδιαστής μπορεί να επιλέξει έναν σύμφωνα με την αίτησή του. Οι πιο συνηθισμένοι τύποι παρατίθενται παρακάτω
- Αυξητικός κωδικοποιητής
- Απόλυτος κωδικοποιητής
- Μαγνητικός κωδικοποιητής
- Οπτικός κωδικοποιητής
- Κωδικοποιητής λέιζερ
Αυτοί οι κωδικοποιητές ταξινομούνται με βάση το σήμα εξόδου και την τεχνολογία ανίχνευσης, ο αυξητικός κωδικοποιητής και οι απόλυτοι κωδικοποιητές ταξινομούνται με βάση το σήμα εξόδου και ο μαγνητικός, οπτικός και λέιζερ κωδικοποιητής ταξινομούνται με βάση την τεχνολογία αίσθησης. Ο κωδικοποιητής που χρησιμοποιείται εδώ είναι ένας αυξητικός κωδικοποιητής τύπου.
Ο απόλυτος κωδικοποιητής αποθηκεύει τις πληροφορίες θέσης ακόμη και μετά την αφαίρεση της τροφοδοσίας και οι πληροφορίες θέσης θα είναι διαθέσιμες όταν εφαρμόζουμε ξανά ισχύ.
Ο άλλος βασικός τύπος, ο αυξητικός κωδικοποιητής παρέχει δεδομένα όταν ο κωδικοποιητής αλλάζει τη θέση του. Δεν μπόρεσε να αποθηκεύσει τις πληροφορίες θέσης.
KY-040 Rotary Encoder Pinout και περιγραφή
Τα pinouts του περιστροφικού κωδικοποιητή αυξητικού τύπου KY-040 φαίνονται παρακάτω. Σε αυτό το έργο, θα συνδέσουμε αυτόν τον Rotary Encoder με τον δημοφιλή μικροελεγκτή PIC16F877A από το μικροτσίπ.
Οι δύο πρώτοι ακροδέκτες (Ground και Vcc) χρησιμοποιούνται για την τροφοδοσία του Encoder, συνήθως χρησιμοποιείται τροφοδοσία + 5V. Εκτός από την περιστροφή του κουμπιού σε ρολόι προς τα δεξιά και αριστερόστροφα, ο κωδικοποιητής διαθέτει επίσης διακόπτη (Active low) που μπορεί να πατηθεί πιέζοντας το κουμπί προς τα μέσα. Το σήμα από αυτόν τον διακόπτη λαμβάνεται μέσω του πείρου 3 (SW). Τέλος, έχει τους δύο ακροδέκτες εξόδου (DT και CLK) που παράγουν τις κυματομορφές όπως ήδη συζητήθηκε παρακάτω. Έχουμε συνδέσει προηγουμένως αυτόν τον Rotary Encoder με τον Arduino.
Πώς λειτουργεί το Rotary Encoder
Η έξοδος εξαρτάται εξ ολοκλήρου από τα εσωτερικά επιθέματα χαλκού που παρέχουν τη σύνδεση με GND και VCC με τον άξονα.
Υπάρχουν δύο μέρη του Rotary Encoder. Τροχός άξονα που συνδέεται με τον άξονα και περιστρέφεται δεξιόστροφα ή αριστερόστροφα ανάλογα με την περιστροφή του άξονα, και τη βάση όπου γίνεται η ηλεκτρική σύνδεση. Η βάση έχει θύρες ή σημεία που συνδέονται με DT ή CLK με τέτοιο τρόπο ώστε όταν ο τροχός άξονα περιστρέφεται, θα συνδέει τα σημεία βάσης και θα παρέχει τετράγωνο κύμα και στη θύρα DT και CLK.
Η έξοδος θα είναι όπως όταν περιστρέφεται ο άξονας-
Δύο θύρες παρέχουν το τετράγωνο κύμα αλλά υπάρχει μικρή διαφορά στο χρονισμό. Εξαιτίας αυτού, εάν δεχτούμε την έξοδο ως 1 και 0, μπορεί να υπάρχουν μόνο τέσσερις καταστάσεις, 0 0, 1 0, 1 1, 0 1. Η ακολουθία της δυαδικής εξόδου καθορίζει τη στροφή δεξιόστροφα ή αριστερόστροφα. Όπως, για παράδειγμα, εάν ο Περιστροφικός κωδικοποιητής παρέχει 1 0 σε κατάσταση αδράνειας και παρέχει 1 1 μετά από αυτό, αυτό σημαίνει ότι ο κωδικοποιητής αλλάζει τη θέση του με ένα μόνο βήμα προς την δεξιόστροφη κατεύθυνση, αλλά εάν παρέχει 0 0 μετά το ρελαντί 1 0, σημαίνει ότι ο άξονας αλλάζει τις θέσεις του σε μια φορά αριστερόστροφα με ένα βήμα.
Απαιτούμενα στοιχεία
Ήρθε η ώρα να προσδιορίσουμε τι χρειαζόμαστε για διασύνδεση Rotary Encoder με PIC Microcontroller
- PIC16F877Α
- 4.7k αντίσταση
- 1 k αντίσταση
- 10k ποτ
- Πυκνωτής κεραμικών δίσκων 33pF - 2 τεμάχια
- 20Mhz κρύσταλλο
- Οθόνη 16x2
- Περιστροφικός κωδικοποιητής
- Προσαρμογέας 5V.
- Πίνακας ψωμιού
- Καλώδια σύνδεσης.
Διάγραμμα κυκλώματος διασύνδεσης περιστροφικού κωδικοποιητή PIC16F877A
Ακολουθεί η εικόνα της τελικής εγκατάστασης μετά τη σύνδεση των εξαρτημάτων σύμφωνα με το Διάγραμμα κυκλώματος:
Χρησιμοποιήσαμε μία αντίσταση 1Κ για την αντίθεση της οθόνης LCD αντί για χρήση ποτενσιόμετρου. Επίσης, ελέγξτε το πλήρες βίντεο που δίνεται στο τέλος.
Επεξήγηση κώδικα
Ο πλήρης κωδικός PIC δίνεται στο τέλος αυτού του έργου με ένα βίντεο επίδειξης, εδώ εξηγούμε μερικά σημαντικά μέρη του κώδικα. Εάν είστε νέοι με το PIC Microcontroller, ακολουθήστε τα μαθήματα PIC από την αρχή.
Όπως συζητήσαμε προηγουμένως, πρέπει να ελέγξουμε την έξοδο και να διαφοροποιήσουμε τη δυαδική έξοδο τόσο για το DT όσο και για το CLK, οπότε δημιουργήσαμε ένα τμήμα if-else για τη λειτουργία.
if (Encoder_CLK! = position) { if (Encoder_DT! = position) { // lcd_com (0x01); μετρητής ++; // Αυξήστε τον μετρητή που θα εκτυπωθεί στο lcd lcd_com (0xC0). lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, μετρητής); } αλλιώς { // lcd_com (0x01); lcd_com (0xC0); μετρητής--; // μείωση του μετρητή lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, μετρητής); // lcd_puts ("Αριστερά"); } }
Πρέπει επίσης να αποθηκεύσουμε τη θέση σε κάθε βήμα. Για να γίνει αυτό, χρησιμοποιήσαμε μια μεταβλητή "θέση" που αποθηκεύει την τρέχουσα θέση.
θέση = Encoder_CLK; // Είναι να αποθηκεύσετε τη θέση του ρολογιού κωδικοποιητή στη μεταβλητή. Μπορεί να είναι 0 ή 1.
Εκτός από αυτό παρέχεται μια επιλογή για ειδοποίηση σχετικά με το πάτημα του διακόπτη στην οθόνη LCD.
εάν (Encoder_SW == 0) { sw_delayms (20); // καθυστέρηση απόρριψης εάν (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("πατημένος διακόπτης"); // itoa (μετρητής, τιμή, 10); // lcd_puts (τιμή);
Η λειτουργία system_init χρησιμοποιείται για την προετοιμασία της λειτουργίας pin I / O, LCD και για την αποθήκευση της θέσης Rotary Encoder.
void system_init () { TRISB = 0x00; // PORT B ως έξοδος, Αυτή η θύρα χρησιμοποιείται για LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Αυτό θα προετοιμάσει τη θέση LCD = Encoder_CLK; // Έγραψε τη θέση CLK στο σύστημα init, πριν από την έναρξη του βρόχου. }
Η λειτουργία LCD είναι γραμμένη στη βιβλιοθήκη lcd.c και lcd.h όπου δηλώνονται οι lcd_puts (), lcd_cmd ().
Για τη δήλωση μεταβλητής, bit διαμόρφωσης και άλλα αποσπάσματα κώδικα, βρείτε τον πλήρη κωδικό παρακάτω.