Αυτό είναι το 9ο σεμινάριό μας για την εκμάθηση μικροελεγκτών PIC χρησιμοποιώντας MPLAB και XC8. Μέχρι τώρα, έχουμε καλύψει πολλά βασικά σεμινάρια, όπως να ξεκινήσετε με το MPLABX, το LED να αναβοσβήνει με το PIC, τους χρονοδιακόπτες σε PIC, τη διασύνδεση LCD, τη διεπαφή 7-τμημάτων κ.λπ. και αρχίστε να μαθαίνετε.
Σε αυτό το σεμινάριο, θα μάθουμε πώς να χρησιμοποιούμε το ADC με τον μικροελεγκτή PIC PICF877A. Τα περισσότερα από τα έργα του Μικροελεγκτή θα περιλαμβάνουν ADC (Αναλογικός σε Ψηφιακός μετατροπέας) σε αυτό, επειδή είναι ένας από τους πιο χρησιμοποιούμενους τρόπους για την ανάγνωση δεδομένων από τον πραγματικό κόσμο. Σχεδόν όλοι οι αισθητήρες όπως αισθητήρας θερμοκρασίας, αισθητήρας ροής, αισθητήρας πίεσης, αισθητήρες ρεύματος, αισθητήρες τάσης, γυροσκόπια, επιταχυνσιόμετρα, αισθητήρας απόστασης και σχεδόν κάθε γνωστός αισθητήρας ή μετατροπέας παράγει αναλογική τάση από 0V έως 5V με βάση την ανάγνωση των αισθητήρων. Ένας αισθητήρας θερμοκρασίας για παράδειγμα μπορεί να εκπέμψει 2.1V όταν η θερμοκρασία είναι 25C και να φτάσει μέχρι 4,7 όταν η θερμοκρασία είναι 60C. Για να γνωρίζει τη θερμοκρασία του πραγματικού κόσμου, το MCU πρέπει απλώς να διαβάσει την τάση εξόδου αυτού του αισθητήρα θερμοκρασίας και να το συσχετίσει με τη θερμοκρασία του πραγματικού κόσμου. Ως εκ τούτου, το ADC είναι ένα σημαντικό εργαλείο εργασίας για έργα MCU και ας μάθουμε πώς μπορούμε να το χρησιμοποιήσουμε στο PIC16F877A μας.
Ελέγξτε επίσης τα προηγούμενα άρθρα μας σχετικά με τη χρήση ADC σε άλλους μικροελεγκτές:
- Πώς να χρησιμοποιήσετε το ADC στο Arduino Uno;
- Εκμάθηση Raspberry Pi ADC
- Διασύνδεση ADC0808 με 8051 μικροελεγκτή
ADC σε μικροελεγκτή PIC PIC16F877A:
Υπάρχουν πολλοί τύποι ADC και ο καθένας έχει τη δική του ταχύτητα και ανάλυση. Οι πιο συνηθισμένοι τύποι ADC είναι flash, διαδοχικές προσεγγίσεις και sigma-delta. Ο τύπος ADC που χρησιμοποιείται στο PIC16F877A ονομάζεται σύντομα ως Διαδοχική προσέγγιση ADC ή SAR. Ας μάθουμε λοιπόν λίγο για το SAR ADC πριν αρχίσουμε να το χρησιμοποιούμε.
Διαδοχική προσέγγιση ADC: Το SAR ADC λειτουργεί με τη βοήθεια ενός συγκριτή και ορισμένων λογικών συνομιλιών. Αυτός ο τύπος ADC χρησιμοποιεί μια τάση αναφοράς (η οποία είναι μεταβλητή) και συγκρίνει την τάση εισόδου με την τάση αναφοράς χρησιμοποιώντας ένα συγκριτικό και η διαφορά, η οποία θα είναι μια ψηφιακή έξοδος, αποθηκεύεται από το πιο σημαντικό bit (MSB). Η ταχύτητα της σύγκρισης εξαρτάται από τη συχνότητα ρολογιού (Fosc) στην οποία λειτουργεί το PIC.
Τώρα που γνωρίζουμε ορισμένα βασικά στοιχεία για το ADC, ας ανοίξουμε το δελτίο δεδομένων μας και να μάθουμε πώς να χρησιμοποιούμε το ADC στο PIC16F877A MCU μας. Το PIC που χρησιμοποιούμε διαθέτει 10-bit ADC 8-καναλιών. Αυτό σημαίνει ότι η τιμή εξόδου του ADC μας θα είναι 0-1024 (2 ^ 10) και υπάρχουν 8 ακίδες (κανάλια) στο MCU μας που μπορούν να διαβάσουν την αναλογική τάση. Η τιμή 1024 επιτυγχάνεται με 2 ^ 10 αφού το ADC μας είναι 10 bit. Οι οκτώ ακίδες που μπορούν να διαβάσουν την αναλογική τάση αναφέρονται στο φύλλο δεδομένων. Ας δούμε την παρακάτω εικόνα.
Τα αναλογικά κανάλια AN0 έως AN7 επισημαίνονται για εσάς. Μόνο αυτοί οι ακροδέκτες θα μπορούν να διαβάζουν την αναλογική τάση. Έτσι, πριν διαβάσετε μια τάση εισόδου, πρέπει να καθορίσετε στον κώδικά μας ποιο κανάλι πρέπει να χρησιμοποιηθεί για την ανάγνωση της τάσης εισόδου. Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε το κανάλι 4 με ποτενσιόμετρο για να διαβάσουμε την αναλογική τάση σε αυτό το κανάλι.
Η μονάδα A / D έχει τέσσερις καταχωρητές που πρέπει να διαμορφωθούν για να διαβάζουν δεδομένα από τις καρφίτσες εισόδου. Αυτά τα μητρώα είναι:
• Υψηλό μητρώο αποτελεσμάτων A / D (ADRESH)
• Χαμηλός κατάλογος αποτελεσμάτων A / D (ADRESL)
• Μητρώο ελέγχου A / D 0 (ADCON0)
• Μητρώο ελέγχου A / D 1 (ADCON1)
Προγραμματισμός για ADC:
Το πρόγραμμα για τη χρήση ADC με μικροελεγκτή PIC είναι πολύ απλό, απλώς πρέπει να κατανοήσουμε αυτούς τους τέσσερις καταχωρητές και στη συνέχεια η ανάγνωση οποιασδήποτε αναλογικής τάσης θα είναι απλή. Ως συνήθως, αρχικοποιήστε τα bit διαμόρφωσης και ας ξεκινήσουμε με το κεντρικό κεντρικό ().
Μέσα στο κεντρικό κεντρικό () πρέπει να προετοιμάσουμε το ADC μας χρησιμοποιώντας τον καταχωρητή ADCON1 και τον καταχωρητή ADCON0. Ο καταχωρητής ADCON0 έχει τα ακόλουθα bit:
Σε αυτόν τον καταχωρητή πρέπει να ενεργοποιήσουμε τη μονάδα ADC κάνοντας ADON = 1 και να ενεργοποιήσουμε το ρολόι μετατροπής A / D χρησιμοποιώντας τα bits ADCS1 και ADCS0 bits, τα υπόλοιπα δεν θα ρυθμιστούν προς το παρόν. Στο πρόγραμμά μας το ρολόι μετατροπής A / D επιλέγεται ως Fosc / 16, μπορείτε να δοκιμάσετε τις δικές σας συχνότητες και να δείτε πώς αλλάζει το αποτέλεσμα. Πλήρεις λεπτομέρειες είναι διαθέσιμες στη σελίδα φύλλου δεδομένων 127. Ως εκ τούτου, το ADCON0 θα αρχικοποιηθεί ως εξής.
ADCON0 = 0b01000001;
Τώρα ο καταχωρητής ADCON1 έχει τα ακόλουθα bits:
Σε αυτό το μητρώο πρέπει να κάνουμε A / D Result Format Select bit high by ADFM = 1 και να κάνουμε ADCS2 = 1 για να επιλέξουμε ξανά το Fosc / 16. Τα άλλα bit παραμένουν μηδενικά καθώς έχουμε προγραμματίσει να χρησιμοποιήσουμε την εσωτερική τάση αναφοράς. Πλήρεις λεπτομέρειες διαθέσιμες στο φύλλο δεδομένων σελίδα 128. Ως εκ τούτου, το ADCON1 θα ορίσουμε ως εξής.
ADCON1 = 0x11000000;
Τώρα μετά την προετοιμασία της μονάδας ADC στην κύρια λειτουργία μας, ας μπείτε στον βρόχο while και να αρχίσουμε να διαβάζουμε τις τιμές ADC. Για να διαβάσετε μια τιμή ADC πρέπει να ακολουθήσετε τα ακόλουθα βήματα.
- Αρχικοποιήστε το ADC Module
- Επιλέξτε το αναλογικό κανάλι
- Ξεκινήστε το ADC κάνοντας το Go / Done λίγο υψηλό
- Περιμένετε να πάει το bit Go / DONE
- Λάβετε το αποτέλεσμα ADC από το μητρώο ADRESH και ADRESL
1. Αρχικοποίηση της ενότητας ADC: Έχουμε ήδη μάθει πώς να αρχικοποιούμε ένα ADC, οπότε απλώς καλούμε αυτήν την παρακάτω συνάρτηση για να προετοιμάσουμε το ADC
Η συνάρτηση void ADC_Initialize () έχει ως εξής.
άκυρο ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON και Fosc / 16 επιλέγεται ADCON1 = 0b11000000; // Επιλέχθηκε εσωτερική τάση αναφοράς}
2. Επιλέξτε το αναλογικό κανάλι: Τώρα πρέπει να επιλέξουμε ποιο κανάλι πρόκειται να χρησιμοποιήσουμε για να διαβάσουμε την τιμή ADC. Αφήνει να κάνει μια λειτουργία για αυτό, έτσι ώστε να είναι εύκολο για μας να μετακινηθούν μεταξύ κάθε κανάλι στο εσωτερικό του , ενώ βρόχο.
unsigned int ADC_Read (κανάλι char χωρίς υπογραφή) {// **** Επιλογή καναλιού ** /// ADCON0 & = 0x11000101; // Εκκαθάριση των καναλιών επιλογής καναλιών ADCON0 - = κανάλι << 3; // Ρύθμιση των απαιτούμενων Bits // ** Η επιλογή καναλιού ολοκληρώθηκε *** ///}
Στη συνέχεια, το κανάλι που θα επιλεγεί λαμβάνεται στο μεταβλητό κανάλι. Στη γραμμή
ADCON0 & = 0x1100101;
Η προηγούμενη επιλογή καναλιού (εάν υπάρχει) διαγράφεται. Αυτό γίνεται με τη χρήση του bitwise και του τελεστή "&". Τα bits 3, 4 και 5 αναγκάζονται να είναι 0 ενώ τα υπόλοιπα αφήνονται να βρίσκονται στις προηγούμενες τιμές τους.
Στη συνέχεια, το επιθυμητό κανάλι επιλέγεται αριστερά αλλάζοντας τον αριθμό καναλιού τρεις φορές και ρυθμίζοντας τα bit χρησιμοποιώντας το bitwise ή το χειριστή "-".
ADCON0 - = κανάλι << 3; // Ρύθμιση των απαιτούμενων Bits
3. Ξεκινήστε το ADC κάνοντας το Go / Done bit high: Μόλις επιλεγεί το κανάλι, πρέπει να ξεκινήσουμε τη μετατροπή ADC απλά κάνοντας το GO_nDONE bit υψηλό:
GO_nDONE = 1; // Αρχικοποιεί τη μετατροπή A / D
4. Περιμένετε να μειωθεί το bit Go / DONE: Το bit GO / DONE θα παραμείνει υψηλό έως ότου ολοκληρωθεί η μετατροπή ADC, επομένως πρέπει να περιμένουμε μέχρι να μειωθεί ξανά αυτό το bit. Αυτό μπορεί να γίνει χρησιμοποιώντας ένα βρόχο λίγο .
ενώ (GO_nDONE) // Περιμένετε να ολοκληρωθεί η μετατροπή A / D
5. Λάβετε το αποτέλεσμα ADC από το μητρώο ADRESH και ADRESL: Όταν το bit Go / DONE μειωθεί ξανά, αυτό σημαίνει ότι η μετατροπή ADC έχει ολοκληρωθεί. Το αποτέλεσμα του ADC θα είναι μια τιμή 10-bit. Δεδομένου ότι το MCU μας είναι MCU 8-bit, το αποτέλεσμα χωρίζεται σε άνω 8-bit και τα χαμηλότερα 2-bit. Το ανώτερο αποτέλεσμα 8-bit αποθηκεύεται στον καταχωρητή ADRESH και το κάτω 2-bit αποθηκεύεται στον καταχωρητή ADRESL. Ως εκ τούτου, πρέπει να τα προσθέσουμε στα μητρώα για να λάβουμε την τιμή ADC των 10 bit. Αυτό το αποτέλεσμα επιστρέφεται από τη συνάρτηση όπως φαίνεται παρακάτω:
επιστροφή ((ADRESH << 8) + ADRESL); // Αποτέλεσμα επιστροφών
Η πλήρης λειτουργία που χρησιμοποιείται για την επιλογή του καναλιού ADC, την ενεργοποίηση του ADC και την επιστροφή του αποτελέσματος εμφανίζεται εδώ.
unsigned int ADC_Read (κανάλι char χωρίς υπογραφή) {ADCON0 & = 0x11000101; // Εκκαθάριση των καναλιών επιλογής καναλιών ADCON0 - = κανάλι << 3; // Ρύθμιση των απαιτούμενων Bits __delay_ms (2); // Χρόνος απόκτησης για φόρτιση του πυκνωτή κράτησης GO_nDONE = 1; // Ξεκινά τη μετατροπή A / D ενώ (GO_nDONE). // Περιμένετε να ολοκληρωθεί η μετατροπή A / D ((ADRESH << 8) + ADRESL). // Αποτέλεσμα επιστροφών}
Τώρα έχουμε μια λειτουργία που θα λαμβάνει την επιλογή καναλιού ως είσοδο και θα μας επιστρέφει την τιμή ADC. Ως εκ τούτου μπορούμε να ονομάσουμε απευθείας αυτή τη λειτουργία μέσα μας ενώ βρόχου, δεδομένου ότι είμαστε ανάγνωση της αναλογικής τάσης από το κανάλι 4 σε αυτό το σεμινάριο, η κλήση της συνάρτησης θα είναι ως εξής.
i = (ADC_Read (4)); // αποθηκεύστε το αποτέλεσμα του adc στο "i".
Προκειμένου να απεικονίσουμε την έξοδο του ADC μας, θα χρειαζόμαστε κάποιες ενότητες οθόνης όπως το LCD ή το 7-τμήμα. Σε αυτό το σεμινάριο χρησιμοποιούμε οθόνη 7 τμημάτων για να επαληθεύσουμε την έξοδο. Αν θέλετε να μάθετε πώς να χρησιμοποιείτε 7 τμήματα με pic ακολουθήστε το σεμινάριο εδώ.
Ο πλήρης κωδικός δίνεται παρακάτω και η διαδικασία εξηγείται επίσης στο βίντεο στο τέλος.
Ρύθμιση και δοκιμή υλικού:
Όπως συνήθως προσομοιώνετε τον κώδικα χρησιμοποιώντας το Proteus πριν πάρετε πραγματικά με το υλικό μας, τα σχήματα του έργου εμφανίζονται παρακάτω:
Οι συνδέσεις της τετραψήφιας ενότητας επτά τμημάτων με τον μικροελεγκτή PIC είναι ίδιες με το προηγούμενο έργο, μόλις προσθέσαμε ένα ποτενσιόμετρο στον ακροδέκτη 7 που είναι το αναλογικό κανάλι 4. Μεταβάλλοντας το δοχείο, μια μεταβλητή τάση θα σταλεί στο MCU η οποία θα διαβαστεί από την ενότητα ADC και θα εμφανιστεί στην ενότητα 7-τμημάτων. Ελέγξτε το προηγούμενο σεμινάριο για να μάθετε περισσότερα σχετικά με την τετραψήφια οθόνη 7 τμημάτων και τη διασύνδεσή της με το PIC MCU.
Εδώ χρησιμοποιήσαμε την ίδια πλακέτα μικροελεγκτή PIC που έχουμε δημιουργήσει στο LED αναβοσβήνει Tutorial. Αφού διασφαλίσετε τη σύνδεση, ανεβάστε το πρόγραμμα στο PIC και θα δείτε μια έξοδο σαν αυτή
Εδώ έχουμε διαβάσει την τιμή ADC από το δοχείο και τη μετατρέψαμε στην πραγματική τάση χαρτογραφώντας την έξοδο 0-1024 ως 0-5 βολτ (όπως φαίνεται στο πρόγραμμα). Στη συνέχεια, η τιμή εμφανίζεται στο 7-τμήμα και επαληθεύεται χρησιμοποιώντας το πολύμετρο.
Αυτό είναι, τώρα είμαστε έτοιμοι να χρησιμοποιήσουμε όλους τους αναλογικούς αισθητήρες που διατίθενται στην αγορά, προχωρήστε και δοκιμάστε αυτό και αν έχετε προβλήματα όπως συνήθως χρησιμοποιήστε την ενότητα σχολίων, θα χαρούμε να σας βοηθήσουμε.