- Απαιτούμενα υλικά:
- Υπολογισμός ταχύτητας και απόστασης που καλύπτεται:
- Διάγραμμα κυκλώματος και ρύθμιση υλικού:
- Προσομοίωση:
- Προγραμματισμός του PIC16F877A σας:
- Επεξήγηση εργασίας:
Η μέτρηση της ταχύτητας / σ.α.λ. ενός οχήματος ή ενός κινητήρα ήταν ανέκαθεν ένα συναρπαστικό έργο για να το δοκιμάσουμε. Έτσι, σε αυτό το έργο πρόκειται να φτιάξουμε ένα χρησιμοποιώντας τους μικροελεγκτές PIC για βιομηχανική χρήση. Θα χρησιμοποιήσουμε ένα κομμάτι μαγνήτη και έναν αισθητήρα Hall για να μετρήσουμε την ταχύτητα. Υπάρχουν άλλοι τρόποι / αισθητήρες για τη μέτρηση της ταχύτητας, αλλά, η χρήση ενός αισθητήρα αίθουσας είναι φθηνή και μπορεί επίσης να χρησιμοποιηθεί σε οποιονδήποτε τύπο κινητήρα / οχήματος. Κάνοντας αυτό το έργο θα ενισχύσουμε επίσης τις δεξιότητές μας στην εκμάθηση του PIC16F877A, καθώς το έργο περιλαμβάνει τη χρήση Διακοπών και Χρονόμετρων. Στο τέλος αυτού του έργου θα μπορείτε να υπολογίσετε την ταχύτητα και τις αποστάσεις που καλύπτονται από οποιοδήποτε περιστρεφόμενο αντικείμενο και να τις εμφανίσετε σε μια οθόνη LCD 16x2. Ας ξεκινήσουμε με αυτό το Ψηφιακό Ταχύμετρο και Κύκλωμα Οδομέτρου με PIC.
Απαιτούμενα υλικά:
- PIC16F877Α
- 7805 Ρυθμιστής τάσης
- Αισθητήρας Hall Effect (US1881 / 04E)
- Οθόνη LCD 16 * 2
- Ένα μικρό κομμάτι μαγνήτη
- Σύνδεση καλωδίων
- Πυκνωτές
- Ψωμί.
- Παροχή ηλεκτρικού ρεύματος
Υπολογισμός ταχύτητας και απόστασης που καλύπτεται:
Πριν ξεκινήσουμε να χτίζουμε το κύκλωμα, ας καταλάβουμε πώς θα χρησιμοποιήσουμε έναν αισθητήρα Hall και έναν μαγνήτη για να υπολογίσουμε την ταχύτητα ενός τροχού. Προηγουμένως είχαμε χρησιμοποιήσει την ίδια Τεχνική για να φτιάξουμε το Ταχύμετρο Arduino το οποίο εμφανίζει αναγνώσεις στο Smartphone Android
Ο αισθητήρας Hall είναι μια συσκευή που μπορεί να ανιχνεύσει την παρουσία ενός μαγνήτη με βάση την πολικότητά του. Κολλάμε ένα μικρό κομμάτι μαγνήτη στον τροχό και τοποθετούμε τον αισθητήρα της αίθουσας κοντά του με τέτοιο τρόπο ώστε κάθε φορά που ο τροχός περιστρέφεται ο αισθητήρας της αίθουσας να τον εντοπίζει. Στη συνέχεια, χρησιμοποιούμε τη βοήθεια χρονοδιακόπτων και διακοπών στον μικροελεγκτή PIC για να υπολογίσουμε το χρόνο που απαιτείται για μία πλήρη περιστροφή του τροχού.
Μόλις γίνει γνωστός ο χρόνος που μπορούμε να υπολογίσουμε το RPM χρησιμοποιώντας τους παρακάτω τύπους, όπου 1000 / χρόνος που απαιτείται θα μας δώσουν το RPS και πολλαπλασιάζοντας περαιτέρω με το 60 θα σας δώσει το RPM
rpm = (1000 / timetaken) * 60;
Όπου (1000 / timetaken) δίνει το rps (περιστροφές ανά δευτερόλεπτο) και πολλαπλασιάζεται επί 60 για να μετατρέψει rps σε rpm (περιστροφές ανά λεπτό).
Τώρα για να υπολογίσουμε την ταχύτητα του οχήματος πρέπει να γνωρίζουμε την ακτίνα του τροχού. Στο έργο μας χρησιμοποιήσαμε έναν μικρό τροχό παιχνιδιού που έχει ακτίνα μόλις 3cm. Υποθέσαμε όμως ότι η ακτίνα του τροχού πρέπει να είναι 30cm (0,3m), ώστε να μπορούμε να απεικονίσουμε τις ενδείξεις.
Η τιμή πολλαπλασιάζεται επίσης με 0,37699 δεδομένου ότι γνωρίζουμε ότι Velocity = (RPM (διάμετρος * Pi) / 60). Οι τύποι απλοποιούνται έως
v = radius_of_wheel * rpm * 0,37699;
Μόλις υπολογίσουμε την ταχύτητα, μπορούμε επίσης να υπολογίσουμε την απόσταση που καλύπτεται χρησιμοποιώντας μια παρόμοια μέθοδο. Με τη διάταξη Hall και μαγνήτη γνωρίζουμε ότι πόσες φορές ο τροχός περιστράφηκε. Γνωρίζουμε επίσης την ακτίνα του τροχού, χρησιμοποιώντας την οποία μπορούμε να βρούμε την περιφέρεια του τροχού, υποθέτοντας ότι η ακτίνα του τροχού είναι 0,3 m (R) οι τιμές της περιφέρειας Pi * R * R θα είναι 0,2827. Αυτό σημαίνει ότι για κάθε φορά που ο αισθητήρας της αίθουσας συναντά τον μαγνήτη, μια απόσταση 0,2827 μέτρων καλύπτεται από τον τροχό.
Απόσταση_κάλυψη = απόσταση_κάλυψη + περιφέρεια_αυτή_ο κύκλος
Επειδή, τώρα γνωρίζουμε πώς θα λειτουργήσει αυτό το έργο ας προχωρήσουμε στο διάγραμμα κυκλωμάτων μας και να αρχίσουμε να το κατασκευάζουμε.
Διάγραμμα κυκλώματος και ρύθμιση υλικού:
Το διάγραμμα κυκλώματος αυτού του έργου ταχύμετρου και οδομέτρου είναι πολύ απλό και μπορεί να κατασκευαστεί πάνω σε ένα breadboard. Εάν παρακολουθήσατε τα μαθήματα PIC τότε μπορείτε επίσης να χρησιμοποιήσετε ξανά το υλικό που χρησιμοποιήσαμε για την εκμάθηση μικροελεγκτών PIC. Εδώ χρησιμοποιήσαμε το ίδιο perf Board που έχουμε κατασκευάσει για LED που αναβοσβήνει με μικροελεγκτή PIC, όπως φαίνεται παρακάτω:
Οι συνδέσεις ακίδων για το PIC16F877A MCU δίνονται στον παρακάτω πίνακα.
S.No: |
Αριθμός Pin |
Όνομα καρφιτσώματος |
Συνδεδεμένος με |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
Ε της LCD |
3 |
27 |
RD4 |
D4 της LCD |
4 |
28 |
RD5 |
D5 της οθόνης LCD |
5 |
29 |
RD6 |
D6 της οθόνης LCD |
6 |
30 |
RD7 |
D7 της οθόνης LCD |
7 |
33 |
RB0 / INT |
3 ος pin του αισθητήρα Hall |
Μόλις δημιουργήσετε το έργο σας, θα πρέπει να φαίνεται κάτι τέτοιο στην παρακάτω εικόνα
Όπως μπορείτε να δείτε, έχω χρησιμοποιήσει δύο κουτιά για να τοποθετήσω τον κινητήρα και έναν αισθητήρα αίθουσας σε κοντινή θέση. Μπορείτε να στερεώσετε τον μαγνήτη στο περιστρεφόμενο αντικείμενο σας και να ακουμπήσετε τον αισθητήρα της αίθουσας κοντά του με τέτοιο τρόπο ώστε να ανιχνεύσει τον μαγνήτη.
Σημείωση: Ο αισθητήρας Hall έχει πολικότητες, οπότε βεβαιωθείτε ποιος πόλος ανιχνεύει και τοποθετήστε τον ανάλογα.
Επίσης, βεβαιωθείτε ότι χρησιμοποιείτε μια αντίσταση Pull-up με τον πείρο εξόδου του αισθητήρα αίθουσας.
Προσομοίωση:
Η Προσομοίωση για αυτό το έργο γίνεται χρησιμοποιώντας το Proteus. Δεδομένου ότι το έργο περιλαμβάνει κινούμενα αντικείμενα, δεν είναι δυνατή η επίδειξη του πλήρους έργου χρησιμοποιώντας προσομοίωση, αλλά η λειτουργία της οθόνης LCD μπορεί να επαληθευτεί. Απλώς φορτώστε το hex αρχείο στην Προσομοίωση και προσομοιώστε το. Θα μπορείτε να παρατηρήσετε ότι η οθόνη LCD λειτουργεί όπως φαίνεται παρακάτω.
Για να ελέγξω το ταχύμετρο και το οδόμετρο λειτουργούν, αντικατέστησα τον αισθητήρα Hall με συσκευή Logic state. Κατά τη διάρκεια της προσομοίωσης μπορείτε να κάνετε κλικ στο κουμπί κατάστασης λογικής για να ενεργοποιήσετε το Interrupt και να ελέγξετε εάν η ταχύτητα και η απόσταση που καλύπτεται ενημερώνονται όπως φαίνεται παραπάνω.
Προγραμματισμός του PIC16F877A σας:
Όπως είπαμε νωρίτερα, θα χρησιμοποιήσουμε τη βοήθεια χρονοδιακόπτων και διακοπών στον μικροελεγκτή PIC16F877A για τον υπολογισμό του χρόνου που απαιτείται για μία πλήρη περιστροφή του τροχού. Έχουμε ήδη μάθει πώς να χρησιμοποιούμε χρονοδιακόπτες στο διαγνωστικό μας σεμινάριο. Έχω δώσει τον πλήρη κώδικα του έργου στο τέλος αυτού του άρθρου. Επιπλέον, εξήγησα μερικές σημαντικές γραμμές παρακάτω.
Οι παρακάτω γραμμές κώδικα αρχικοποιούν τη θύρα D ως καρφίτσες εξόδου για διασύνδεση LCD και RB0 ως πείρο εισόδου για χρήση ως εξωτερική καρφίτσα. Επιπλέον, έχουμε ενεργοποιήσει την εσωτερική αντίσταση pull-up χρησιμοποιώντας το OPTION_REG και έχουμε επίσης ορίσει το 64 ως presale. Στη συνέχεια Ενεργοποιούμε την Παγκόσμια και Περιφερειακή Διακοπή για να ενεργοποιήσουμε το Χρονόμετρο και την Εξωτερική Διακοπή. Για να ορίσετε το RB0 ως εξωτερικό bit διακοπής, το INTE πρέπει να γίνει υψηλό. Η τιμή Overflow έχει οριστεί να είναι 100 έτσι ώστε για κάθε 1 χιλιοστό του δευτερολέπτου να ενεργοποιείται η σημαία διακοπής χρονοδιακόπτη TMR0IF. Αυτό θα βοηθήσει στην εκτέλεση ενός χρονοδιακόπτη χιλιοστών του δευτερολέπτου για τον προσδιορισμό του χρόνου που απαιτείται σε χιλιοστά του δευτερολέπτου:
TRISD = 0x00; // Το PORTD δηλώθηκε ως έξοδος για διασύνδεση LCD TRISB0 = 1; // Ορίστε τον πείρο RB0 ως είσοδο για χρήση ως πείρος διακοπής OPTION_REG = 0b00000101; // Timer0 64 as prescalar // Ενεργοποιεί επίσης PULL UPs TMR0 = 100; // Φορτώστε την τιμή χρόνου για 1ms. delayValue μπορεί να είναι μεταξύ 0-256 μόνο TMR0IE = 1; // Ενεργοποίηση bit διακοπής χρονοδιακόπτη στο μητρώο PIE1 GIE = 1; // Ενεργοποίηση καθολικής διακοπής PEIE = 1; // Ενεργοποιήστε την Περιφερειακή Διακοπή INTE = 1; // Ενεργοποιήστε το RB0 ως εξωτερικό πείρο διακοπής
Η παρακάτω συνάρτηση εκτελείται κάθε φορά που εντοπίζεται μια διακοπή. Μπορούμε να ονομάσουμε τη συνάρτηση σύμφωνα με την επιθυμία μας, γι 'αυτό την ονόμασα ως speed_isr (). Αυτό το πρόγραμμα ασχολείται με δύο διακοπές, ένα είναι Timer Interrupt και το άλλο External Interrupt. Κάθε φορά που συμβαίνει ένα χρονόμετρο διακοπής, η σημαία TMR0IF πηγαίνει ψηλά, για να καθαρίσετε και να επαναφέρετε τη διακοπή, πρέπει να την μειώσουμε καθορίζοντας το TMR0IF = 0 όπως φαίνεται στον παρακάτω κώδικα.
void interrupt speed_isr () {if (TMR0IF == 1) // Ο χρονοδιακόπτης έχει υπερχειλίσει {TMR0IF = 0; // Εκκαθάριση χρονοδιακόπτη flag milli_sec ++; } εάν (INTF == 1) {rpm = (1000 / milli_sec) * 60; ταχύτητα = 0,3 * rpm * 0,37699; // (Υποθέτοντας ότι η ακτίνα του τροχού είναι 30cm) INTF = 0; // διαγράψτε τη σημαία διακοπής milli_sec = 0; απόσταση = απόσταση + 028.2; }}
Παρομοίως, όταν συμβαίνει εξωτερική διακοπή, η σημαία INTF θα πάει ψηλά, αυτό θα πρέπει επίσης να διαγραφεί καθορίζοντας INTF = 0. Ο χρόνος που απαιτείται διατηρείται σε παρακολούθηση από το Timer Interrupt και το External Interrupt καθορίζει πότε ο τροχός έχει ολοκληρώσει μία πλήρη περιστροφή. Με αυτά τα δεδομένα η ταχύτητα και η απόσταση που καλύπτεται από τον τροχό υπολογίζεται κατά τη διάρκεια κάθε εξωτερικής διακοπής.
Μόλις υπολογιστεί η ταχύτητα και η απόσταση, μπορούν απλά να εμφανιστούν στην οθόνη LCD χρησιμοποιώντας τις λειτουργίες LCD. Εάν είστε νέοι σε LCD, ανατρέξτε στην οθόνη LCD διασύνδεσης με τον οδηγό PIC16F877A MCU.
Επεξήγηση εργασίας:
Αφού ετοιμάσετε το υλικό και το λογισμικό, απλώς ανεβάστε τον κωδικό στο PIC16F877A σας. Εάν είστε εντελώς νέοι στο PIC, τότε θα πρέπει να διαβάσετε λίγα σεμινάρια για να μάθετε πώς να ανεβάσετε το πρόγραμμα σε έναν μικροελεγκτή PIC16F877A.
Έχω χρησιμοποιήσει μια μεταβλητή POT για να προσαρμόσω την ταχύτητα του κινητήρα για λόγους επίδειξης. Μπορείτε επίσης να χρησιμοποιήσετε το ίδιο για να βρείτε μια εφαρμογή σε πραγματικό χρόνο. Εάν όλα λειτουργούν όπως αναμένεται, θα πρέπει να μπορείτε να καλύψετε την ταχύτητα σε χιλιόμετρα / ώρα και την απόσταση σε όρους μετρητών, όπως φαίνεται στο παρακάτω βίντεο.
Ελπίζω να απολαύσατε το έργο και να το λειτουργήσετε. Εάν όχι, μπορείτε να χρησιμοποιήσετε την παρακάτω ενότητα σχολίων ή το φόρουμ για να δημοσιεύσετε την αμφιβολία σας.