- Τι είναι το PWM (Pulse with Modulation);
- PWM σε STM32
- Απαιτούμενα στοιχεία
- Καρφίτσωμα Λεπτομέρειες STM32
- Διάγραμμα κυκλώματος και συνδέσεις
- Προγραμματισμός STM32
Στο προηγούμενο άρθρο έχουμε δει για μετατροπή ADC χρησιμοποιώντας STM32. Σε αυτό το σεμινάριο, θα μάθουμε για το PWM (Pulse Width Modulation) στο STM32 και πώς μπορούμε να ελέγξουμε τη φωτεινότητα των LED ή την ταχύτητα του ανεμιστήρα DC χρησιμοποιώντας την τεχνική PWM.
Γνωρίζουμε ότι υπάρχουν δύο τύποι σήματος: Αναλογικό και Ψηφιακό. Τα αναλογικά σήματα έχουν τάσεις όπως (3V, 1V… κλπ) και τα ψηφιακά σήματα έχουν (1 'και 0's). Οι έξοδοι των αισθητήρων είναι αναλογικών σημάτων και αυτά τα αναλογικά σήματα μετατρέπονται σε ψηφιακά χρησιμοποιώντας ADC, επειδή οι μικροελεγκτές κατανοούν μόνο ψηφιακά. Μετά την επεξεργασία αυτών των τιμών ADC, και πάλι η έξοδος πρέπει να μετατραπεί σε αναλογική μορφή για να οδηγήσει τις αναλογικές συσκευές. Για αυτό χρησιμοποιούμε συγκεκριμένες μεθόδους όπως PWM, Digital to Analog (DAC) converter κ.λπ.
Τι είναι το PWM (Pulse with Modulation);
Το PWM είναι ένας τρόπος ελέγχου των αναλογικών συσκευών χρησιμοποιώντας ψηφιακή τιμή, όπως τον έλεγχο της ταχύτητας του κινητήρα, τη φωτεινότητα ενός led κ.λπ. Γνωρίζουμε ότι ο κινητήρας και το led λειτουργούν με αναλογικό σήμα. Αλλά το PWM δεν παρέχει καθαρή αναλογική έξοδο, το PWM μοιάζει με αναλογικό σήμα κατασκευασμένο από βραχείς παλμούς, το οποίο παρέχεται από τον κύκλο λειτουργίας.
Κύκλος λειτουργίας του PWM
Το ποσοστό χρόνου στο οποίο το σήμα PWM παραμένει ΥΨΗΛΟ (στην ώρα) ονομάζεται κύκλος λειτουργίας. Εάν το σήμα είναι πάντα ΕΝΕΡΓΟ, βρίσκεται σε κύκλο λειτουργίας 100% και εάν είναι πάντα σβηστό, είναι κύκλος λειτουργίας 0%.
Κύκλος λειτουργίας = Χρόνος ενεργοποίησης / (Χρόνος ενεργοποίησης + χρόνος απενεργοποίησης)
PWM σε STM32
Το STM32F103C8 έχει 15 ακροδέκτες PWM και 10 ακίδες ADC. Υπάρχουν 7 χρονόμετρα και κάθε έξοδος PWM παρέχεται από ένα κανάλι συνδεδεμένο σε 4 χρονόμετρα. Έχει ανάλυση PWM 16-bit (2 16), δηλαδή μετρητές και οι μεταβλητές μπορούν να είναι τόσο μεγάλες όσο 65535. Με ρυθμό ρολογιού 72MHz, μια έξοδος PWM μπορεί να έχει μέγιστη περίοδο περίπου ένα χιλιοστό του δευτερολέπτου.
- Έτσι, η τιμή 65535 δίνει ΠΛΗΡΗΣ ΦΩΤΙΣΜΟΣ LED και ΠΛΗΡΗ ΤΑΧΥΤΗΤΑ ανεμιστήρα DC (100% Duty Cycle)
- Ομοίως, η τιμή 32767 δίνει HALF BRIGHTNESS των LED και HALF SPEED του DC Fan (50% Duty Cycle)
- Και η τιμή του 13107 δίνει (20%) BRIGHTNESS ΚΑΙ (20%) SPEED (20% Duty Cycle)
Σε αυτό το σεμινάριο, χρησιμοποιούμε ποτενσιόμετρο και STM32 για να διαφοροποιήσουμε τη φωτεινότητα των LED και την ταχύτητα ενός ανεμιστήρα DC με την τεχνική PWM. Μια οθόνη 16x2 LCD χρησιμοποιείται για την εμφάνιση της τιμής ADC (0-4095) και της τροποποιημένης μεταβλητής (τιμή PWM) που είναι έξοδος (0-65535).
Ακολουθούν μερικά παραδείγματα PWM με άλλους μικροελεγκτές:
- Δημιουργία PWM χρησιμοποιώντας μικροελεγκτή PIC με MPLAB και XC8
- Servo Motor Control με Raspberry Pi
- Arduino LED Dimmer με χρήση PWM
- Διαμόρφωση πλάτους παλμού (PWM) χρησιμοποιώντας MSP430G2
Δείτε όλα τα σχετικά έργα PWM εδώ.
Απαιτούμενα στοιχεία
- STM32F103C8
- Ανεμιστήρας DC
- ULN2003 IC Driver Motor
- LED (ΚΟΚΚΙΝΟ)
- LCD (16x2)
- Ποτενσιόμετρο
- Ψωμί
- Μπαταρία 9V
- Καλώδια αλτών
DC Fan: Ο ανεμιστήρας DC που χρησιμοποιείται εδώ είναι ανεμιστήρας BLDC από παλιό υπολογιστή. Απαιτείται εξωτερική τροφοδοσία, οπότε χρησιμοποιούμε μπαταρία 9V dc.
ULN2003 Motor Driver IC: Χρησιμοποιείται για την οδήγηση του κινητήρα προς τη μία κατεύθυνση, καθώς ο κινητήρας είναι μονοκατευθυντικός και απαιτείται εξωτερική ισχύς για τον ανεμιστήρα. Μάθετε περισσότερα για το Κύκλωμα οδηγού κινητήρα με βάση το ULN2003 εδώ. Ακολουθεί το διάγραμμα φωτογραφιών του ULN2003:
Οι ακίδες (IN1 έως IN7) είναι ακροδέκτες εισόδου και (OUT 1 έως OUT 7) είναι αντίστοιχοι ακροδέκτες εξόδου. Στο COM δίνεται θετική τάση πηγής που απαιτείται για συσκευές εξόδου.
LED: Χρησιμοποιείται κόκκινο χρώμα LED που εκπέμπει κόκκινο φως. Οποιαδήποτε χρώματα μπορούν να χρησιμοποιηθούν.
Ποτενσιόμετρα: Χρησιμοποιούνται δύο ποτενσιόμετρα το ένα είναι για διαχωριστικό τάσης για αναλογική είσοδο στο ADC και ένα άλλο για τον έλεγχο της φωτεινότητας του led.
Καρφίτσωμα Λεπτομέρειες STM32
Όπως μπορούμε να δούμε οι ακίδες PWM υποδεικνύονται σε μορφή κυμάτων (~), υπάρχουν 15 τέτοιες ακίδες, οι ακίδες ADC παρουσιάζονται σε πράσινο χρώμα, υπάρχουν 10 ακίδες ADC που χρησιμοποιούνται για αναλογικές εισόδους.
Διάγραμμα κυκλώματος και συνδέσεις
Οι συνδέσεις του STM32 με διάφορα στοιχεία εξηγούνται ως εξής:
STM32 με αναλογική είσοδο (ADC)
Το ποτενσιόμετρο που βρίσκεται στην αριστερή πλευρά του κυκλώματος χρησιμοποιείται ως ρυθμιστής τάσης που ρυθμίζει την τάση από τον πείρο 3.3V. Η έξοδος από το ποτενσιόμετρο, δηλαδή ο κεντρικός πείρος του ποτενσιόμετρου συνδέεται με τον πείρο ADC (PA4) του STM32.
STM32 με LED
Ο ακροδέκτης εξόδου STM32 PWM (PA9) συνδέεται στον θετικό πείρο LED μέσω μιας αντίστασης σειράς και ενός πυκνωτή.
LED με αντίσταση και πυκνωτή
Μια αντίσταση σε σειρά και ένας πυκνωτής παράλληλα συνδέονται με LED για τη δημιουργία σωστού αναλογικού κύματος από την έξοδο PWM, καθώς η αναλογική έξοδος δεν είναι καθαρή από όταν παράγεται απευθείας από τον πείρο PWM.
STM32 με ULN2003 & ULN2003 με ανεμιστήρα
Ο πείρος εξόδου STM32 PWM (PA8) συνδέεται με τον πείρο εισόδου (IN1) του ULN2003 IC και ο αντίστοιχος πείρος εξόδου (OUT1) του ULN2003 συνδέεται με αρνητικό καλώδιο του DC FAN.
Ο θετικός πείρος του ανεμιστήρα DC είναι συνδεδεμένος στον ακροδέκτη COM του ULN2003 IC και η εξωτερική μπαταρία (9V DC) είναι επίσης συνδεδεμένη στον ίδιο πείρο COM του ULN2003 IC. Ο ακροδέκτης GND του ULN2003 συνδέεται με τον ακροδέκτη GND του STM32 και ο αρνητικός συσσωρευτής συνδέεται με τον ίδιο ακροδέκτη GND.
STM32 με LCD (16x2)
Κωδικός 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) |
Ένα ποτενσιόμετρο στη δεξιά πλευρά χρησιμοποιείται για τον έλεγχο της αντίθεσης της οθόνης LCD. Ο παραπάνω πίνακας δείχνει τη σύνδεση μεταξύ LCD και STM32.
Προγραμματισμός STM32
Όπως και το προηγούμενο σεμινάριο, προγραμματίσαμε το STM32F103C8 με το Arduino IDE μέσω θύρας USB χωρίς να χρησιμοποιήσουμε τον προγραμματιστή FTDI. Για να μάθετε σχετικά με τον προγραμματισμό STM32 με το Arduino IDE ακολουθήστε τον σύνδεσμο. Μπορούμε να προχωρήσουμε στον προγραμματισμό όπως στο Arduino. Ο πλήρης κωδικός δίνεται στο τέλος.
Σε αυτήν την κωδικοποίηση πρόκειται να πάρουμε μια αναλογική τιμή εισόδου από τον πείρο ADC (PA4) που είναι συνδεδεμένος με τον κεντρικό πείρο του αριστερού ποτενσιόμετρου και στη συνέχεια μετατρέπουμε την αναλογική τιμή (0-3.3V) σε ψηφιακή ή ακέραια μορφή (0-4095). Αυτή η ψηφιακή τιμή παρέχεται περαιτέρω ως έξοδος PWM για τον έλεγχο της φωτεινότητας LED και της ταχύτητας του ανεμιστήρα DC. Μια οθόνη LCD 16x2 χρησιμοποιείται για την εμφάνιση ADC και αντιστοιχισμένης τιμής (τιμή εξόδου PWM).
Πρώτα πρέπει να συμπεριλάβουμε το αρχείο κεφαλίδας LCD, να δηλώνουμε τις καρφίτσες LCD και να τις προετοιμάζουμε χρησιμοποιώντας τον παρακάτω κώδικα. Μάθετε περισσότερα σχετικά με τη διασύνδεση LCD με STM32 εδώ.
#περιλαμβάνω
Στη συνέχεια δηλώστε και ορίστε τα ονόματα των ακίδων χρησιμοποιώντας την καρφίτσα του STM32
const int analoginput = PA4; // Είσοδος από ποτενσιόμετρο const int led = PA9; // Έξοδος LED const int fan = PA8; // έξοδος ανεμιστήρα
Τώρα μέσα στην εγκατάσταση () , πρέπει να εμφανίσουμε μερικά μηνύματα και να τα διαγράψουμε μετά από λίγα δευτερόλεπτα και να καθορίσουμε τους ακροδέκτες εξόδου INPUT και PWM
lcd.begin (16,2); // Ετοιμασία LCD lcd.clear (); // Διαγράφει LCD lcd.setCursor (0,0); // Ορίζει τον κέρσορα στη σειρά0 και στη στήλη0 lcd.print ("CIRCUIT DIGEST"); // Εμφανίζει κύκλωμα Digest lcd.setCursor (0,1); // Ορίζει τον κέρσορα στη στήλη0 και στη σειρά1 lcd.print ("PWM USING STM32"); // Εμφανίζει PWM χρησιμοποιώντας καθυστέρηση STM32 (2000). // Χρόνος καθυστέρησης lcd.clear (); // Διαγράφει τον κωδικό pinMode LCD (αναλογική είσοδος, INPUT). // ορίστε την αναλογική λειτουργία pin pin ως INPUT pinMode (led, PWM); // ορίστε τη λειτουργία pin pin ως έξοδος PWM pinMode (ανεμιστήρας, PWM). // ορίστε τον ανεμιστήρα λειτουργίας pin ως έξοδο PWM
Ο πείρος αναλογική είσοδος (PA4) έχει οριστεί ως INPUT από pinMode (analoginput, INPUT), LED πείρος έχει οριστεί ως PWM εξόδου από pinMode (οδήγησε, PWM) και ο πείρος του ανεμιστήρα ρυθμίζεται ως PWM εξόδου από pinMode (ανεμιστήρα, PWM) . Εδώ οι ακίδες εξόδου PWM συνδέονται με LED (PA9) και ανεμιστήρα (PA8).
Στη συνέχεια στη συνάρτηση void loop () , διαβάζουμε το αναλογικό σήμα από τον πείρο ADC (PA4) και το αποθηκεύουμε σε μια ακέραια μεταβλητή που μετατρέπει την αναλογική τάση σε ψηφιακές ακέραιες τιμές (0-4095) χρησιμοποιώντας τον παρακάτω κωδικό int valueadc = analogRead (analoginput);
Σημαντικό πράγμα που πρέπει να σημειωθεί εδώ είναι οι ακίδες PWM που είναι κανάλια του STM32 με ανάλυση 16-bit (0-65535), οπότε πρέπει να το χαρτογραφήσουμε με αναλογικές τιμές χρησιμοποιώντας τη λειτουργία χάρτη όπως παρακάτω
int αποτέλεσμα = χάρτης (valueadc, 0, 4095, 0, 65535).
Εάν δεν χρησιμοποιηθεί η χαρτογράφηση, δεν θα έχουμε πλήρη ταχύτητα ανεμιστήρα ή πλήρη φωτεινότητα LED μεταβάλλοντας το ποτενσιόμετρο.
Στη συνέχεια γράφουμε την έξοδο PWM στο LED χρησιμοποιώντας pwmWrite (led, αποτέλεσμα) και PWM έξοδο σε ανεμιστήρα χρησιμοποιώντας pwmWrite (ανεμιστήρας, αποτέλεσμα ) συναρτήσεις.
Τέλος, εμφανίζουμε την αναλογική τιμή εισόδου (τιμή ADC) και τις τιμές εξόδου (τιμές PWM) στην οθόνη LCD χρησιμοποιώντας τις ακόλουθες εντολές
lcd.setCursor (0,0); // Ορίζει τον κέρσορα στη σειρά0 και στη στήλη0 lcd.print ("ADC value ="); // εκτυπώνει τις λέξεις "" lcd.print (valueadc); // εμφανίζει valueadc lcd.setCursor (0,1); // Ορίζει τον κέρσορα στη στήλη0 και στη σειρά1 lcd.print ("Output ="); // εκτυπώνει τις λέξεις στο "" lcd.print (αποτέλεσμα); // εμφανίζει το αποτέλεσμα της τιμής
Ο πλήρης κώδικας με ένα βίντεο επίδειξης δίνεται παρακάτω.