- Απαιτούμενα υλικά
- ADC σε STM8S103F3P6
- Διάγραμμα κυκλώματος για ανάγνωση τιμών ADC σε STM8S και οθόνη σε οθόνη LCD
- Βιβλιοθήκη ADC για STM8S103F3P6
- Πρόγραμμα STM8S για ανάγνωση αναλογικής τάσης και οθόνης σε LCD
- Ανάγνωση αναλογικής τάσης από δύο ποτενσιόμετρα χρησιμοποιώντας STM8S
Εάν είστε τακτικός αναγνώστης που ακολουθεί τα εκπαιδευτικά μας STM8S Microcontroller, θα γνωρίζετε ότι στο τελευταίο μας σεμινάριο, μάθαμε πώς να συνδέουμε μια οθόνη LCD 16x2 με STM8. Τώρα, προχωρώντας σε αυτό το σεμινάριο, θα μάθουμε πώς να χρησιμοποιούμε τη δυνατότητα ADC στον μικροελεγκτή STM8S103F3P6. Το ADC είναι ένα πολύ χρήσιμο περιφερειακό σε έναν μικροελεγκτή που χρησιμοποιείται συχνά από ενσωματωμένους προγραμματιστές για τη μέτρηση μονάδων που βρίσκονται σε συνεχή αλλαγή όπως η μεταβαλλόμενη τάση, ρεύμα, θερμοκρασία, υγρασία κ.λπ.
Όπως γνωρίζουμε «Ζούμε σε έναν αναλογικό κόσμο με ψηφιακές συσκευές», που σημαίνει ότι όλα γύρω μας όπως η ταχύτητα του ανέμου, η ένταση του φωτός, η θερμοκρασία και όλα όσα αντιμετωπίζουμε όπως η ταχύτητα, η ταχύτητα, η πίεση κ.λπ. είναι αναλογικά στη φύση. Αλλά οι μικροελεγκτές και οι μικροεπεξεργαστές μας είναι ψηφιακές συσκευές και δεν θα μπορούν να μετρήσουν αυτές τις παραμέτρους χωρίς ένα σημαντικό περιφερειακό που ονομάζεται Αναλογικός σε Ψηφιακός Μετατροπέας (ADC). Έτσι, σε αυτό το άρθρο, ας μάθουμε πώς να χρησιμοποιούμε το ADC σε μικροελεγκτή STM8S με μεταγλωττιστή COMIC C.
Απαιτούμενα υλικά
Σε αυτό το άρθρο, θα διαβάσουμε δύο αναλογικές τιμές τάσης από δύο ποτενσιόμετρα και θα εμφανίσουμε την τιμή ADC του σε μια οθόνη LCD 16x2. Για να το κάνουμε αυτό, θα χρειαστούμε τα ακόλουθα στοιχεία.
- Πίνακας ανάπτυξης STM8S103F3P6
- Προγραμματιστής ST-Link V2
- LCD 16x2
- Ποτενσιόμετρα
- Σύνδεση καλωδίων
- 1 k αντίσταση
ADC σε STM8S103F3P6
Υπάρχουν πολλοί τύποι ADC και κάθε μικροελεγκτής έχει τις δικές του προδιαγραφές. Στο STM8S103F3P6, έχουμε ADC με ανάλυση 5 καναλιών και 10-bit. με ανάλυση 10 bit, θα μπορούμε να μετρήσουμε την ψηφιακή τιμή από 0 έως 1024 και ένα κανάλι ADC υποδεικνύει ότι έχουμε 5 ακίδες στον μικροελεγκτή που μπορούν να υποστηρίξουν ADC, αυτές οι 5 ακίδες επισημαίνονται στην παρακάτω εικόνα.
Όπως μπορείτε να δείτε, και οι πέντε ακίδες (AIN2, AIN3, AIN4, AIN5 και AIN6) είναι πολυπλέκτες με άλλα περιφερειακά, πράγμα που σημαίνει ότι εκτός από το να ενεργεί μόνο ως πείρος ADC, αυτές οι ακίδες μπορούν επίσης να χρησιμοποιηθούν για την εκτέλεση άλλων επικοινωνιών όπως για παράδειγμα, οι ακίδες 2 και 3 (AIN5 και AIN 6) δεν μπορούν να χρησιμοποιηθούν μόνο για ADC αλλά και για σειριακή επικοινωνία και λειτουργίες GPIO. Λάβετε υπόψη ότι δεν θα είναι δυνατή η χρήση του ίδιου πείρου και για τους τρεις σκοπούς, οπότε αν χρησιμοποιούμε αυτές τις δύο ακίδες για ADC, τότε δεν θα είμαστε σε θέση να πραγματοποιήσουμε σειριακή επικοινωνία. Άλλα σημαντικά χαρακτηριστικά ADC για STM8S103P36 μπορείτε να βρείτε στον παρακάτω πίνακα που λαμβάνεται από το φύλλο δεδομένων.
Στον παραπάνω πίνακα, το Vdd αντιπροσωπεύει την τάση λειτουργίας και το Vss αντιπροσωπεύει τη γείωση. Έτσι, στην περίπτωσή μας στον πίνακα ανάπτυξης, έχουμε τον μικροελεγκτή που λειτουργεί σε 3.3V, μπορείτε να ελέγξετε το διάγραμμα κυκλώματος πλακέτας ανάπτυξης από την αρχή με το σεμινάριο STM8S. Με 3.3V ως τάση λειτουργίας, η συχνότητα ρολογιού ADC μπορεί να ρυθμιστεί μεταξύ 1 έως 4MHz και το εύρος τάσης μετατροπής μας είναι μεταξύ 0V έως 3.3V. Αυτό σημαίνει ότι το ADC 10 bit θα διαβάσει 0 όταν παρέχεται 0V (Vss) και θα διαβάσει το μέγιστο 1024 όταν παρέχεται 3.3V (Vdd). Μπορούμε εύκολα να αλλάξουμε αυτό το 0-5V αλλάζοντας την τάση λειτουργίας του MCU εάν απαιτείται.
Διάγραμμα κυκλώματος για ανάγνωση τιμών ADC σε STM8S και οθόνη σε οθόνη LCD
Το πλήρες διάγραμμα κυκλώματος που χρησιμοποιείται σε αυτό το έργο δίνεται παρακάτω, είναι πολύ παρόμοιο με το σεμινάριο STM8S LCD που συζητήσαμε προηγουμένως.
Όπως μπορείτε να δείτε, τα μόνα πρόσθετα στοιχεία εκτός από την οθόνη LCD είναι δύο ποτενσιόμετρα POT_1 και POT_2 . Αυτά τα δοχεία συνδέονται με τις θύρες PC4 και PD6, οι οποίες είναι οι ακίδες ANI2 και ANI6 όπως συζητήθηκε στην εικόνα pinout νωρίτερα.
Τα ποτενσιόμετρα συνδέονται με τέτοιο τρόπο ώστε όταν το αλλάζουμε, θα έχουμε 0-5 V στις αναλογικές ακίδες μας. Θα προγραμματίσουμε τον ελεγκτή μας να διαβάσει αυτήν την αναλογική τάση σε ψηφιακή τιμή (0 έως 1024) και να την εμφανίσει στην οθόνη LCD. Στη συνέχεια, θα υπολογίσουμε επίσης την ισοδύναμη τιμή τάσης και θα την εμφανίσουμε στην οθόνη LCD, να θυμάστε ότι ο ελεγκτής μας τροφοδοτείται από 3.3V, οπότε ακόμα και αν παρέχουμε 5V στον πείρο ADC, θα μπορεί να διαβάζει μόνο από 0V έως 3.3V.
Μόλις ολοκληρωθούν οι συνδέσεις, το υλικό μου μοιάζει με αυτό όπως φαίνεται παρακάτω. Μπορείτε να δείτε τα δύο ποτενσιόμετρα στα δεξιά και τον προγραμματιστή ST-link στα αριστερά.
Βιβλιοθήκη ADC για STM8S103F3P6
Για να προγραμματίσουμε τις λειτουργίες ADC στο STM8S, θα χρησιμοποιήσουμε τον μεταγλωττιστή Cosmic C μαζί με τις βιβλιοθήκες SPL. Αλλά για να διευκολύνω τις διαδικασίες, έκανα ένα άλλο αρχείο κεφαλίδας που μπορεί να βρεθεί στο GitHub με τον παρακάτω σύνδεσμο.
Βιβλιοθήκη ADC για STM8S103F3P6
Εάν γνωρίζετε τι κάνετε, μπορείτε να δημιουργήσετε ένα αρχείο κεφαλίδας χρησιμοποιώντας τον παραπάνω κώδικα και να το προσθέσετε στον κατάλογο "συμπερίληψη αρχείων" στη σελίδα του έργου σας. Διαφορετικά, ακολουθήστε το ξεκίνημα με τον οδηγό STM8S για να μάθετε πώς να ρυθμίσετε το περιβάλλον προγραμματισμού και το μεταγλωττιστή σας. Μόλις η ρύθμιση είναι έτοιμη, το IDE σας θα πρέπει να έχει τα ακόλουθα αρχεία κεφαλίδας, τουλάχιστον αυτά που περικυκλώνονται με κόκκινο χρώμα.
Το παραπάνω αρχείο κεφαλίδας αποτελείται από μια συνάρτηση που ονομάζεται ADC_Read () . Αυτή η λειτουργία μπορεί να κληθεί στο κύριο πρόγραμμά σας για να λάβετε την τιμή ADC σε οποιαδήποτε ακίδα. Για παράδειγμα, το ADC_Read (AN2) θα επιστρέψει την τιμή ADC στην ακίδα AN2 ως αποτέλεσμα. Η λειτουργία εμφανίζεται παρακάτω.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int αποτέλεσμα = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE) ADC1_Cmd (ΕΝΕΡΓΟΠΟΙΗΣΗ); ADC1_StartConversion (); ενώ (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); αποτέλεσμα = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Όπως βλέπετε, μπορούμε να περάσουμε οκτώ παραμέτρους σε αυτήν τη λειτουργία και αυτό καθορίζει τον τρόπο διαμόρφωσης του ADC. Στον παραπάνω κώδικα βιβλιοθήκης, έχουμε ορίσει τη λειτουργία μετατροπής σε συνεχή και, στη συνέχεια, λαμβάνουμε τον αριθμό καναλιού να περάσει μια παράμετρο. Και έπειτα πρέπει να ορίσουμε τη συχνότητα CPU του ελεγκτή μας, από προεπιλογή (εάν δεν έχετε συνδέσει εξωτερικό κρύσταλλο), το STM8S θα λειτουργεί με έναν εσωτερικό ταλαντωτή 16Mhz. Επομένως, έχουμε αναφέρει το " ADC1_PRESSEL_FCPU_D18 " ως τιμή προ- κλιμάκωσης . Μέσα σε αυτήν τη λειτουργία, χρησιμοποιούμε άλλες μεθόδους που ορίζονται από το αρχείο κεφαλίδας SPL stm8s_adc1.h . Ξεκινάμε με De-προετοιμασία των ADC ακίδων και στη συνέχεια ADC1_Init () για την προετοιμασία του ADC περιφερειακού. Ο ορισμός αυτής της λειτουργίας από το εγχειρίδιο χρήστη SPL φαίνεται παρακάτω.
Στη συνέχεια, ορίζουμε την εξωτερική σκανδάλη χρησιμοποιώντας ένα χρονοδιακόπτη και απενεργοποιούμε την εξωτερική σκανδάλη αφού δεν θα τη χρησιμοποιούμε εδώ. Και στη συνέχεια έχουμε ρυθμίσει την ευθυγράμμιση προς τα δεξιά και οι δύο τελευταίες παράμετροι χρησιμοποιούνται για να ορίσουμε τη σκανδάλη Schmitt, αλλά θα την απενεργοποιήσουμε για αυτό το σεμινάριο. Έτσι, για να το πούμε σύντομα, το ADC μας θα λειτουργεί σε συνεχή λειτουργία μετατροπής στον απαιτούμενο ακροδέκτη ADC με εξωτερική σκανδάλη και σκανδάλη Schmitt απενεργοποιημένη. Μπορείτε να ελέγξετε το φύλλο δεδομένων εάν χρειάζεστε περισσότερες πληροφορίες σχετικά με τον τρόπο χρήσης της εξωτερικής ενεργοποίησης ή της επιλογής ενεργοποίησης Schmitt, δεν θα το συζητήσουμε σε αυτό το σεμινάριο.
Πρόγραμμα STM8S για ανάγνωση αναλογικής τάσης και οθόνης σε LCD
Ο πλήρης κωδικός που χρησιμοποιείται στο αρχείο main.c βρίσκεται στο κάτω μέρος αυτής της σελίδας. Αφού προσθέσετε τα απαιτούμενα αρχεία κεφαλίδας και αρχεία προέλευσης, θα πρέπει να μπορείτε να μεταγλωττίσετε απευθείας το κύριο αρχείο. Η εξήγηση του κώδικα στο κύριο αρχείο έχει ως εξής. Δεν θα εξηγήσω το πρόγραμμα STM8S LCD αφού το έχουμε ήδη συζητήσει στο προηγούμενο σεμινάριο.
Ο σκοπός του κώδικα θα είναι η ανάγνωση τιμών ADC από δύο ακίδες και η μετατροπή του σε τιμή τάσης. Θα εμφανίσουμε επίσης την τιμή ADC και την τιμή τάσης στην οθόνη LCD. Έτσι, έχω χρησιμοποιήσει μια συνάρτηση που ονομάζεται LCD_Print Var, η οποία παίρνει μια μεταβλητή σε ακέραια μορφή και τη μετατρέπει σε χαρακτήρα έτσι ώστε να την εμφανίζει στην οθόνη LCD. Χρησιμοποιήσαμε τους απλούς τελεστές συντελεστή (%) και διαιρέσουμε (/) για να πάρουμε κάθε ψηφίο από τη μεταβλητή και τοποθετήσαμε μεταβλητές όπως d1, d2, d3 και d4 όπως φαίνεται παρακάτω. Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε τη λειτουργία LCD_Print_Char για να εμφανίσουμε αυτούς τους χαρακτήρες στην οθόνη LCD.
άκυρο LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Στη συνέχεια κάτω από την κύρια συνάρτηση, έχουμε τέσσερις μεταβλητές δηλωθεί. Δύο από αυτά χρησιμοποιούνται για να αποθηκεύσουν την τιμή ADC (0 έως 1024) και οι άλλες δύο χρησιμοποιούνται για να πάρουν την πραγματική τιμή τάσης.
unsigned int ADC_value_1 = 0; χωρίς υπογραφή int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Στη συνέχεια, πρέπει να προετοιμάσουμε τους ακροδέκτες GPIO και τη διαμόρφωση ρολογιού για να διαβάσουμε την αναλογική τάση. Εδώ θα διαβάσουμε την αναλογική τάση από τους ακροδέκτες AIN2 και AIN6 που είναι ακίδες PC4 και PD6 αντίστοιχα. Πρέπει να ορίσουμε αυτούς τους πείρους σε κατάσταση κυμαινότητας όπως φαίνεται παρακάτω. Θα ενεργοποιήσουμε επίσης το περιφερειακό ρολογιού για ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ΕΝΕΡΓΟΠΟΙΗΣΗ); // Ενεργοποίηση περιφερειακού ρολογιού για ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT). GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Τώρα που οι πείροι είναι έτοιμοι, πρέπει να μπείτε στο άπειρο βρόχο για να διαβάσετε την αναλογική τάση. Εφόσον έχουμε το αρχείο κεφαλίδας, μπορούμε εύκολα να διαβάσουμε την αναλογική τάση από τους ακροδέκτες AIN2 και AIN 6 χρησιμοποιώντας τις παρακάτω γραμμές.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Το επόμενο βήμα είναι να μετατρέψετε αυτήν την ένδειξη ADC (0 έως 1023) σε αναλογική τάση. Με αυτόν τον τρόπο, μπορούμε να εμφανίσουμε την ακριβή τιμή τάσης που δίνεται στους ακροδέκτες AIN2 και AIN6. Οι τύποι για τον υπολογισμό της αναλογικής τάσης μπορούν να δοθούν από-
Αναλογική τάση = Ανάγνωση ADC * (3300/1023)
Στην περίπτωσή μας σε ελεγκτές STM8S103F3, έχουμε ADC με ανάλυση 10-bit, επομένως χρησιμοποιήσαμε το 1023 (2 ^ 10) . Επίσης, στην ανάπτυξή μας, ο ελεγκτής διαθέτει 3.3V που είναι 3300, οπότε διαιρέσαμε το 3300 με το 1023 στους παραπάνω τύπους. Περίπου 3300/1023 θα μας δώσει 3.226, έτσι στο πρόγραμμά μας, έχουμε τις ακόλουθες γραμμές για να μετρήσουμε την πραγματική τάση ADC χρησιμοποιώντας την τάση ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) μετατροπή της τιμής ADC 1 σε 0 σε 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // μετατρέψτε την τιμή ADC 1 σε 0 έως 3300mV
Το υπόλοιπο μέρος του κώδικα χρησιμοποιείται μόνο για την εμφάνιση αυτών των τεσσάρων τιμών στην οθόνη LCD. Έχουμε επίσης καθυστέρηση 500 ms, έτσι ώστε η LCD να ενημερώνεται για κάθε 500 mS. Μπορείτε να το μειώσετε περαιτέρω εάν χρειάζεστε ταχύτερες ενημερώσεις.
Ανάγνωση αναλογικής τάσης από δύο ποτενσιόμετρα χρησιμοποιώντας STM8S
Συντάξτε τον κωδικό και ανεβάστε τον στον πίνακα ανάπτυξης. Εάν εμφανιστεί κάποιο σφάλμα σύνταξης, βεβαιωθείτε ότι έχετε προσθέσει όλα τα αρχεία κεφαλίδας και τα αρχεία προέλευσης όπως συζητήθηκε προηγουμένως. Μόλις μεταφορτωθεί ο κωδικός, θα πρέπει να δείτε ένα μικρό μήνυμα καλωσορίσματος που λέει "ADC σε STM8S" και στη συνέχεια θα πρέπει να δείτε την παρακάτω οθόνη.
Οι τιμές D1 και D2 υποδεικνύουν την τιμή ADC από τους πείρους Ain2 και AIN6 αντίστοιχα. Στη δεξιά πλευρά, εμφανίζονται επίσης οι ισοδύναμες τιμές τάσης. Αυτή η τιμή πρέπει να είναι ίση με την τάση που εμφανίζεται στους ακροδέκτες AIN2 και AIN6 αντίστοιχα. Μπορούμε να ελέγξουμε το ίδιο χρησιμοποιώντας ένα πολύμετρο, μπορούμε επίσης να αλλάξουμε τα ποτενσιόμετρα για να ελέγξουμε αν η τιμή τάσης αλλάζει επίσης ανάλογα.
Πλήρης εργασία μπορείτε επίσης να βρείτε στο παρακάτω βίντεο. Ελπίζω να απολαύσατε το σεμινάριο και να μάθετε κάτι χρήσιμο, αν έχετε οποιεσδήποτε ερωτήσεις, αφήστε το στην παρακάτω ενότητα σχολίων. Μπορείτε επίσης να χρησιμοποιήσετε τα φόρουμ μας για να ξεκινήσετε μια συζήτηση ή να δημοσιεύσετε άλλες τεχνικές ερωτήσεις.