- Σύγκριση ADC σε Arduino και STM32F103C8
- ADC στο STM32
- Πώς μετατρέπεται ένα αναλογικό σήμα σε ψηφιακή μορφή
- Καρφίτσες ADC σε STM32F103C8T6
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και εξηγήσεις
- Προγραμματισμός STM32 για ανάγνωση τιμών ADC
Ένα κοινό χαρακτηριστικό που χρησιμοποιείται σχεδόν σε κάθε ενσωματωμένη εφαρμογή είναι η μονάδα ADC (Analog to Digital Converter). Αυτοί οι αναλογικοί σε ψηφιακοί μετατροπείς μπορούν να διαβάσουν τάση από αναλογικούς αισθητήρες όπως αισθητήρας θερμοκρασίας, αισθητήρας κλίσης, αισθητήρας ρεύματος, αισθητήρας Flex και πολλά άλλα. Έτσι σε αυτό το σεμινάριο θα μάθουμε πώς να χρησιμοποιούμε το ADC στο STM32F103C8 για να διαβάσουμε αναλογικές τάσεις χρησιμοποιώντας το Energia IDE. Θα συνδέσουμε ένα μικρό ποτενσιόμετρο με την πλακέτα Blue Pill STM32 και θα παρέχουμε μια μεταβαλλόμενη τάση σε έναν αναλογικό πείρο, θα διαβάσουμε την τάση και θα την εμφανίσουμε στην οθόνη LCD 16x2.
Σύγκριση ADC σε Arduino και STM32F103C8
Στην πλακέτα Arduino, περιέχει 6 κανάλια (8 κανάλια στο Mini και Nano, 16 στο Mega), 10-bit ADC με εύρος τάσης εισόδου 0V – 5V. Αυτό σημαίνει ότι θα αντιστοιχίσει τις τάσεις εισόδου μεταξύ 0 και 5 βολτ σε ακέραιες τιμές μεταξύ 0 και 1023. Τώρα στην περίπτωση του STM32F103C8 έχουμε 10 κανάλια, 12-bit ADC με εύρος εισόδου 0V -3.3V. Θα αντιστοιχίσει τις τάσεις εισόδου μεταξύ 0 και 3,3 βολτ σε ακέραιες τιμές μεταξύ 0 και 4095.
ADC στο STM32
Το ADC που είναι ενσωματωμένο στους μικροελεγκτές STM32 χρησιμοποιεί την αρχή SAR (διαδοχικός καταχωρητής προσέγγισης), με την οποία η μετατροπή πραγματοποιείται σε διάφορα βήματα. Ο αριθμός των βημάτων μετατροπής είναι ίσος με τον αριθμό των bit στον μετατροπέα ADC. Κάθε βήμα καθοδηγείται από το ρολόι ADC. Κάθε ρολόι ADC παράγει ένα bit από αποτέλεσμα σε έξοδο. Ο εσωτερικός σχεδιασμός ADC βασίζεται στην τεχνική μεταγωγής πυκνωτή. Εάν είστε νέοι στο STM32, τότε ρίξτε μια ματιά στον οδηγό Ξεκινώντας με το STM32.
Ανάλυση 12-bit
Αυτό το ADC είναι ADC 10 καναλιών 12 bit. Εδώ ο όρος 10 κανάλι υπονοεί ότι υπάρχουν 10 ακροδέκτες ADC χρησιμοποιώντας τους οποίους μπορούμε να μετρήσουμε την αναλογική τάση. Ο όρος 12-bit υπονοεί την ανάλυση του ADC. 12-bit σημαίνει 2 έως την ισχύ των δέκα (2 12) που είναι 4096. Αυτός είναι ο αριθμός των βημάτων δείγματος για το ADC μας, οπότε το εύρος των τιμών ADC μας θα είναι από 0 έως 4095. Η τιμή θα αυξηθεί από 0 σε 4095 με βάση την τιμή της τάσης ανά βήμα, η οποία μπορεί να υπολογιστεί με τον τύπο
ΤΑΣΗ / ΒΗΜΑ = ΤΑΣΗ ΑΝΑΦΟΡΑΣ / 4096 = (3.3 / 4096 = 8.056mV) ανά μονάδα.
Πώς μετατρέπεται ένα αναλογικό σήμα σε ψηφιακή μορφή
Καθώς οι υπολογιστές αποθηκεύουν και επεξεργάζονται μόνο δυαδικές / ψηφιακές τιμές (1 και 0). Έτσι, τα αναλογικά σήματα όπως η έξοδος του αισθητήρα σε βολτ πρέπει να μετατραπούν σε ψηφιακές τιμές για επεξεργασία και η μετατροπή πρέπει να είναι ακριβής. Όταν μια αναλογική τάση εισόδου δίνεται στο STM32 στις αναλογικές εισόδους του, η αναλογική τιμή διαβάζεται και αποθηκεύεται σε ακέραια μεταβλητή. Αυτή η αποθηκευμένη αναλογική τιμή (0-3.3V) μετατρέπεται σε ακέραιες τιμές (0-4096) χρησιμοποιώντας τον παρακάτω τύπο:
ΤΑΣΗ ΕΙΣΟΔΟΥ = (Τιμή ADC / Ανάλυση ADC) * Τάση αναφοράς
Ανάλυση = 4096
Αναφορά = 3.3V
Καρφίτσες ADC σε STM32F103C8T6
Υπάρχουν 10 αναλογικές ακίδες στο STM32 από PA0 έως PB1.
Ελέγξτε επίσης πώς να χρησιμοποιήσετε το ADC σε άλλους μικροελεγκτές:
- Πώς να χρησιμοποιήσετε το ADC στο Arduino Uno;
- Διασύνδεση ADC0808 με 8051 μικροελεγκτή
- Χρήση της μονάδας ADC του μικροελεγκτή PIC
- Εκμάθηση Raspberry Pi ADC
- Πώς να χρησιμοποιήσετε το ADC στο MSP430G2 - Μέτρηση αναλογικής τάσης
Απαιτούμενα στοιχεία
- STM32F103C8
- LCD 16 * 2
- Ποτενσιόμετρο 100k
- Ψωμί
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος και εξηγήσεις
Το διάγραμμα κυκλώματος για διασύνδεση LCD 16 * 2 και αναλογική είσοδος σε μια πλακέτα STM32F103C8T6 φαίνεται παρακάτω.
Οι συνδέσεις που γίνονται για LCD δίνονται παρακάτω:
Κωδικός LCD αριθ |
Όνομα Pin LCD |
Όνομα Pin STM32 |
1 |
Έδαφος (Gnd) |
Έδαφος (G) |
2 |
VCC |
5V |
3 |
VEE |
Καρφίτσα από το Κέντρο Ποτενσιόμετρου |
4 |
Εγγραφή Επιλογή (RS) |
PB11 |
5 |
Ανάγνωση / εγγραφή (RW) |
Έδαφος (G) |
6 |
Ενεργοποίηση (EN) |
PB10 |
7 |
Bit δεδομένων 0 (DB0) |
Χωρίς σύνδεση (NC) |
8 |
Bit δεδομένων 1 (DB1) |
Χωρίς σύνδεση (NC) |
9 |
Bit δεδομένων 2 (DB2) |
Χωρίς σύνδεση (NC) |
10 |
Bit δεδομένων 3 (DB3) |
Χωρίς σύνδεση (NC) |
11 |
Bit δεδομένων 4 (DB4) |
PB0 |
12 |
Bit δεδομένων 5 (DB5) |
PB1 |
13 |
Bit δεδομένων 6 (DB6) |
PC13 |
14 |
Bit δεδομένων 7 (DB7) |
PC14 |
15 |
Θετικό LED |
5V |
16 |
Αρνητικό LED |
Έδαφος (G) |
Οι συνδέσεις γίνονται σύμφωνα με τον παραπάνω πίνακα. Υπάρχουν δύο ποτενσιόμετρα στο κύκλωμα, το πρώτο χρησιμοποιείται για διαχωριστή τάσης που μπορεί να χρησιμοποιηθεί για να μεταβάλλει τάση και να παρέχει αναλογική είσοδο στο STM32. Ο αριστερός πείρος αυτού του ποτενσιόμετρου λαμβάνει θετική τάση εισόδου από το STM32 (3.3V) και ο δεξί πείρος συνδέεται στη γείωση, ο κεντρικός πείρος του ποτενσιόμετρου συνδέεται με τον αναλογικό πείρο εισόδου (PA7) του STM32. Το άλλο ποτενσιόμετρο χρησιμοποιείται για να μεταβάλλει την αντίθεση της οθόνης LCD. Η πηγή τροφοδοσίας για το STM32 παρέχεται μέσω τροφοδοσίας USB από υπολογιστή ή φορητό υπολογιστή.
Προγραμματισμός STM32 για ανάγνωση τιμών ADC
Στο προηγούμενο σεμινάριό μας, μάθαμε για τον προγραμματισμό της πλακέτας STM32F103C8T6 χρησιμοποιώντας θύρα USB. Επομένως, δεν χρειαζόμαστε προγραμματιστή FTDI τώρα. Απλώς συνδέστε τον με υπολογιστή μέσω θύρας USB του STM32 και ξεκινήστε τον προγραμματισμό με το ARDUINO IDE. Ο προγραμματισμός του STM32 σας στο ARDUINO IDE για ανάγνωση αναλογικής τάσης είναι πολύ απλός. Είναι ίδιο με το arduino board. Δεν χρειάζεται να αλλάξετε τους ακροδέκτες του STM32.
Σε αυτό το πρόγραμμα θα διαβάσει την αναλογική τιμή και θα υπολογίσει την τάση με αυτήν την τιμή και στη συνέχεια θα εμφανίσει στην οθόνη LCD και τις δύο, αναλογικές και ψηφιακές τιμές.
Καθορίστε πρώτα τις ακίδες LCD. Αυτά καθορίζουν σε ποιον ακροδέκτη STM32 συνδέονται οι ακίδες LCD. Μπορείτε να τροποποιήσετε σύμφωνα με τις απαιτήσεις σας.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // αναφέρετε τα ονόματα των καρφιτσών με το οποίο είναι συνδεδεμένο το LCD
Στη συνέχεια, συμπεριλαμβάνουμε το αρχείο κεφαλίδας για την οθόνη LCD. Αυτό καλεί τη βιβλιοθήκη που περιέχει τον κωδικό για το πώς πρέπει να επικοινωνεί το STM32 με την οθόνη LCD. Βεβαιωθείτε επίσης ότι η λειτουργία Liquid Crystal καλείται με τα ονόματα pin που μόλις ορίσαμε παραπάνω.
#περιλαμβάνω
Μέσα στη λειτουργία setup () , απλώς θα δώσαμε ένα εισαγωγικό μήνυμα που θα εμφανίζεται στην οθόνη LCD. Μπορείτε να μάθετε σχετικά με τη διασύνδεση LCD με STM32.
lcd.begin (16, 2); // Χρησιμοποιούμε LCD 16 * 2 lcd.clear (); // Εκκαθάριση της οθόνης lcd.setCursor (0, 0); // Στην πρώτη σειρά πρώτη στήλη lcd.prin t ("CIRCUITDIGEST"); // Εκτυπώστε αυτό το lcd.setCursor (0, 1); // Στη δεύτερη σειρά, πρώτη στήλη n lcd.print ("STM32F103C8"); // Εκτύπωση αυτής της καθυστέρησης (2000). // περιμένετε δύο δευτερόλεπτα lcd.clear (); // Εκκαθάριση της οθόνης lcd.setCursor (0, 0); // Στην πρώτη σειρά πρώτη στήλη lcd.print ("USING ADC IN"); // Εκτύπωση αυτού του lcd.setCursor (0,1); // Στη δεύτερη στήλη πρώτη στήλη lcd.print ("STM32F103C8"); // Εκτύπωση αυτής της καθυστέρησης (2000); // περιμένετε δύο δευτερόλεπτα lcd.clear (); // Διαγράψτε την οθόνη
Τέλος, μέσα στη λειτουργία άπειρου βρόχου () , αρχίζουμε να διαβάζουμε την αναλογική τάση που παρέχεται στον πείρο PA7 από το ποτενσιόμετρο. Όπως ήδη συζητήσαμε, ο μικροελεγκτής είναι μια ψηφιακή συσκευή και δεν μπορεί να διαβάσει απευθείας το επίπεδο τάσεων. Χρησιμοποιώντας την τεχνική SAR το επίπεδο τάσης χαρτογραφείται από 0 έως 4096. Αυτές οι τιμές ονομάζονται τιμές ADC, για να λάβετε αυτήν την τιμή ADC απλώς χρησιμοποιήστε την ακόλουθη γραμμή
int val = analogRead (A7); // διαβάστε την τιμή ADC από τον πείρο PA 7
Εδώ η συνάρτηση analogRead () χρησιμοποιείται για να διαβάσει την αναλογική τιμή του πείρου. Τέλος αποθηκεύουμε αυτήν την τιμή σε μια μεταβλητή που ονομάζεται " val ". Ο τύπος αυτής της μεταβλητής είναι ακέραιος επειδή θα λάβουμε μόνο τιμές που κυμαίνονται από 0 έως 4096 για να αποθηκευτούν σε αυτήν τη μεταβλητή.
Το επόμενο βήμα θα ήταν ο υπολογισμός της τιμής τάσης από την τιμή ADC. Για να το κάνουμε αυτό έχουμε τους ακόλουθους τύπους
Τάση = (Τιμή ADC / Ανάλυση ADC) * Τάση αναφοράς e
Στην περίπτωσή μας γνωρίζουμε ήδη ότι η ανάλυση ADC του μικροελεγκτή μας είναι 4096. Η τιμή ADC βρίσκεται επίσης στην προηγούμενη γραμμή και αποθηκεύτηκε η μεταβλητή που ονομάζεται val. Η τάση αναφοράς είναι ίση με την τάση στην οποία λειτουργεί ο μικροελεγκτής. Όταν η πλακέτα STM32 τροφοδοτείται μέσω καλωδίου USB, τότε η τάση λειτουργίας είναι 3.3V. Μπορείτε επίσης να μετρήσετε την τάση λειτουργίας χρησιμοποιώντας ένα πολύμετρο στο Vcc και τον πείρο γείωσης στην πλακέτα. Έτσι, ο παραπάνω τύπος ταιριάζει στην περίπτωσή μας όπως φαίνεται παρακάτω
τάση πλωτήρα = (float (val) / 4096) * 3.3; // τύποι για τη μετατροπή της τιμής ADC σε voltag e
Ίσως να μπερδευτείτε με τη γραμμή float (val). Αυτό χρησιμοποιείται για τη μετατροπή της μεταβλητής "val" από τον τύπο δεδομένων int σε τύπο δεδομένων "float". Αυτή η μετατροπή είναι απαραίτητη γιατί μόνο αν έχουμε το αποτέλεσμα του val / 4096 στο float μπορούμε να το πολλαπλασιάσουμε 3.3. Εάν η τιμή ληφθεί σε ακέραιο θα είναι πάντα 0 και το αποτέλεσμα θα είναι επίσης μηδέν. Μόλις υπολογίσουμε την τιμή και την τάση ADC, το μόνο που μένει είναι να εμφανίσουμε το αποτέλεσμα στην οθόνη LCD που μπορεί να γίνει χρησιμοποιώντας τις ακόλουθες γραμμές
lcd.setCursor (0, 0); // ορίστε τον κέρσορα στη στήλη 0, γραμμή 0 lcd.print ("ADC Val:"); lcd.print (val); // Εμφάνιση τιμής ADC lcd.setCursor (0, 1); // ορίστε τον κέρσορα στη στήλη 0, γραμμή 1 lcd.print ("Voltage:"); lcd.print (τάση); // Τάση οθόνης
Ο πλήρης κώδικας και το βίντεο επίδειξης δίνονται παρακάτω.