- PWM (Διαμόρφωση πλάτους παλμού)
- Καρφίτσες PWM στο ARM7-LPC2148
- Μητρώα PWM στο ARM7-LPC2148
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και συνδέσεις
- Προγραμματισμός ARM7-LPC2148 για PWM
- Βήματα που εμπλέκονται στον προγραμματισμό LPC2148 για PWM & ADC
Όπως γνωρίζουμε, οι μικροελεγκτές λαμβάνουν αναλογική είσοδο από αναλογικούς αισθητήρες και χρησιμοποιούν ADC (Analog to Digital converter) για την επεξεργασία αυτών των σημάτων. Τι γίνεται όμως αν ένας μικροελεγκτής θέλει να παράγει ένα αναλογικό σήμα για τον έλεγχο αναλογικών συσκευών που λειτουργούν όπως Servo motor, DC motor κλπ; Οι μικροελεγκτές δεν παράγουν τάση εξόδου όπως 1V, 5V αντ 'αυτού χρησιμοποιούν μια τεχνική που ονομάζεται PWM για τη λειτουργία αναλογικών συσκευών. Ένα παράδειγμα PWM είναι ο ανεμιστήρας ψύξης του φορητού υπολογιστή (κινητήρας DC) που πρέπει να ελέγχεται με ταχύτητα σύμφωνα με τη θερμοκρασία και το ίδιο εφαρμόζεται με τη χρήση της τεχνικής Pulse Width Modulation (PWM) στις μητρικές πλακέτες.
Σε αυτό το σεμινάριο θα ελέγξουμε τη φωτεινότητα ενός LED χρησιμοποιώντας τον μικροελεγκτή PWM στον ARM7-LPC2148.
PWM (Διαμόρφωση πλάτους παλμού)
Το PWM είναι ένας καλός τρόπος για τον έλεγχο των αναλογικών συσκευών χρησιμοποιώντας ψηφιακή τιμή, όπως τον έλεγχο της ταχύτητας του κινητήρα, τη φωτεινότητα ενός led κ.λπ. Παρόλο που το PWM δεν παρέχει καθαρή αναλογική έξοδο, αλλά παράγει αξιοπρεπούς αναλογικούς παλμούς για τον έλεγχο των αναλογικών συσκευών. Το PWM διαμορφώνει στην πραγματικότητα το πλάτος ενός ορθογώνιου παλμού για να πάρει μια διακύμανση στη μέση τιμή του προκύπτοντος κύματος.
Κύκλος λειτουργίας του PWM
Το ποσοστό χρόνου στο οποίο το σήμα PWM παραμένει ΥΨΗΛΟ (στην ώρα) ονομάζεται κύκλος λειτουργίας. Εάν το σήμα είναι πάντα ΕΝΕΡΓΟ, βρίσκεται σε κύκλο λειτουργίας 100% και εάν είναι πάντα σβηστό, είναι κύκλος λειτουργίας 0%.
Κύκλος λειτουργίας = Χρόνος ενεργοποίησης / (Χρόνος ενεργοποίησης + χρόνος απενεργοποίησης)
Καρφίτσες PWM στο ARM7-LPC2148
Η παρακάτω εικόνα δείχνει τις ακίδες εξόδου PWM του ARM7-LPC2148. Υπάρχουν συνολικά έξι ακίδες για PWM.
Κανάλι PWM |
Καρφίτσες θύρας LPC2148 |
PWM1 |
P0.0 |
PWM2 |
Σ0.7 |
PWM3 |
Σ0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
Σ0.9 |
Μητρώα PWM στο ARM7-LPC2148
Πριν μπείτε στο έργο μας πρέπει να μάθουμε για τα μητρώα PWM στο LPC2148.
Εδώ είναι η λίστα των καταχωρητών που χρησιμοποιούνται στο LPC2148 για PWM
1. PWMPR: PWM Prescale Register
Χρήση: Είναι καταχωρητής 32-bit. Περιέχει τον αριθμό των φορών (μείον 1) το PCLK πρέπει να κάνει κύκλο πριν από την αύξηση του μετρητή χρονοδιακόπτη PWM (στην πραγματικότητα διατηρεί τη μέγιστη τιμή του μετρητή prescale)
2. PWMPC: Μετρητής Prescaler PWM
Χρήση: Είναι καταχωρητής 32 bit . Περιέχει την αυξανόμενη τιμή μετρητή. Όταν αυτή η τιμή ισούται με την τιμή PR συν 1, ο μετρητής χρονισμού PWM (TC) αυξάνεται.
3. PWMTCR: Μητρώο ελέγχου χρονοδιακόπτη PWM
Χρήση: Περιλαμβάνει τα κομμάτια ελέγχου Counter Enable, Counter Reset και PWM Enable. Είναι ένας καταχωρητής 8-bit.
7: 4 |
3 |
2 |
1 |
0 |
ΚΑΤΟΧΥΡΩΜΕΝΑ |
Ενεργοποίηση PWM |
ΚΑΤΟΧΥΡΩΜΕΝΑ |
ΕΠΑΝΑΦΟΡΑ COUNTER |
ΕΝΕΡΓΟΠΟΙΗΣΗ ΤΟΥ COUNTER |
- Ενεργοποίηση PWM: (Bit-3)
0- PWM Disabled
1- PWM Enabled
- Ενεργοποίηση μετρητή: (Bit-0)
0- Απενεργοποίηση μετρητών
1- Ενεργοποίηση μετρητή
- Επαναφορά μετρητή: (Bit-1)
0- Μην κάνετε τίποτα.
1- Επαναφέρει το PWMTC & PWMPC στο θετικό άκρο του PCLK.
4. PWMTC: Μετρητής χρονοδιακόπτη PWM
Χρήση: Είναι καταχωρητής 32-bit. Περιέχει την τρέχουσα τιμή του αυξανόμενου χρονοδιακόπτη PWM. Όταν ο μετρητής Prescaler (PC) φτάσει την τιμή Prescaler Register (PR) συν 1, αυτός ο μετρητής αυξάνεται.
5. PWMIR: Εγγραφή διακοπής PWM
Χρήση: Είναι ένα μητρώο 16-bit. Περιέχει τις σημαίες διακοπής για PWM Match Channels 0-6. Μια σημαία διακοπής ορίζεται όταν συμβαίνει διακοπή για αυτό το κανάλι (MRx Interrupt) όπου το Χ είναι ο αριθμός καναλιού (0 έως 6).
6. PWMMR0-PWMMR6: Μητρώο αντιστοίχισης PWM
Χρήση: Είναι καταχωρητής 32-bit . Στην πραγματικότητα, η ομάδα Match Channel επιτρέπει τη ρύθμιση 6 μονόπλευρων ελεγχόμενων ή 3 διπλών ακρών ελεγχόμενων εξόδων PWM. Μπορείτε να τροποποιήσετε τα επτά κανάλια αντιστοίχισης για να διαμορφώσετε αυτές τις εξόδους PWM ώστε να ταιριάζουν στις απαιτήσεις σας στο PWMPCR.
7. PWMMCR: Μητρώο ελέγχου αντιστοίχισης PWM
Χρήση: Είναι καταχωρητής 32-bit. Περιλαμβάνει τα κομμάτια Interrupt, Reset και Stop που ελέγχουν το επιλεγμένο Match Channel. Ένας αγώνας συμβαίνει μεταξύ των καταχωρητών αντιστοίχισης PWM και των μετρητών χρονοδιακόπτη PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
ΚΑΤΟΧΥΡΩΜΕΝΑ |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Εδώ το x είναι από 0 έως 6
- PWMMRxI (Bit-0)
Ενεργοποίηση ή απενεργοποίηση διακοπών PWM
0- Απενεργοποίηση διακοπών αγώνα PWM.
1- Ενεργοποίηση διακοπής αγώνα PWM.
- PWMMRxR: (Bit-1)
RESET PWMTC - Τιμή μετρητή χρονοδιακόπτη όποτε ταιριάζει με το PWMRx
0- Μην κάνεις τίποτα.
1- Επαναφέρει το PWMTC.
- PWMMRxS: (Bit 2)
ΔΙΑΚΟΠΗ PWMTC & PWMPC όταν το PWMTC φτάσει την τιμή μητρώου Match
0- Απενεργοποιήστε τη λειτουργία διακοπής PWM.
1- Ενεργοποιήστε τη λειτουργία διακοπής PWM.
8. PWMPCR: Μητρώο ελέγχου PWM
Χρήση: Είναι ένας καταχωρητής 16-bit. Περιέχει τα bit που επιτρέπουν τις εξόδους PWM 0-6 και επιλέγουν τον έλεγχο μονής ή διπλής άκρης για κάθε έξοδο.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
ΑΧΡΗΣΙΜΟΠΟΙΗΤΟΣ |
PWMENA6-PWMENA1 |
ΑΧΡΗΣΙΜΟΠΟΙΗΤΟΣ |
PWMSEL6-PWMSEL2 |
ΑΧΡΗΣΙΜΟΠΟΙΗΤΟΣ |
- PWMSELx (x: 2 έως 6)
- Λειτουργία Single Edge για PWMx
- 1- Λειτουργία Double Edge για PWMx.
- PWMENAx (x: 1 έως 6)
- Απενεργοποίηση PWMx.
- 1- PWMx ενεργοποιημένο.
9. PWMLER: PWM Latch Enable Register
Χρήση: Είναι ένας καταχωρητής 8-bit. Περιέχει τα κομμάτια Match x Latch για κάθε κανάλι αγώνα.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
ΑΧΡΗΣΙΜΟΠΟΙΗΤΟΣ |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 έως 6):
0- Απενεργοποίηση της φόρτωσης νέων τιμών αντιστοίχισης
1- Φόρτωση των νέων τιμών αντιστοίχισης από (PWMMRx) PWMMatch Register κατά την επαναφορά του χρονοδιακόπτη.
Τώρα ας αρχίσουμε να κατασκευάζουμε τη ρύθμιση υλικού για να δείξουμε τη λειτουργία Pulse Width Modulation στον μικροελεγκτή ARM.
Απαιτούμενα στοιχεία
Σκεύη, εξαρτήματα
- Μικροελεγκτής ARM7-LPC2148
- Ρυθμιστής τάσης 3.3V IC
- Ποτενσιόμετρο 10k
- LED (Οποιοδήποτε χρώμα)
- Ενότητα οθόνης LCD (16x2)
- Ψωμί
- Σύνδεση καλωδίων
Λογισμικό
- Keil uVision5
- Flash Magic Tool
Διάγραμμα κυκλώματος και συνδέσεις
Συνδέσεις μεταξύ LCD & ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
Σ0.4 |
RS (Επιλογή εγγραφής) |
Σ0.6 |
Ε (Ενεργοποίηση) |
Σ0.12 |
D4 (Καρφίτσα δεδομένων 4) |
P0.13 |
D5 (Καρφίτσα δεδομένων 5) |
P0.14 |
D6 (Καρφίτσα δεδομένων 6) |
P0.15 |
D7 (Καρφίτσα δεδομένων 7) |
GND |
VSS, R / W, Κ |
+ 5V |
VDD, Α |
Σύνδεση μεταξύ LED & ARM7-LPC2148
Το LED ANODE συνδέεται στην έξοδο PWM (P0.0) του LPC2148, ενώ ο ακροδέκτης CATHODE του LED συνδέεται με τον ακροδέκτη GND του LPC2148.
Σύνδεση μεταξύ ARM7-LPC2148 και ποτενσιόμετρου με ρυθμιστή τάσης 3.3V
Ρυθμιστής τάσης 3.3V IC |
Λειτουργία καρφιτσών |
ARM-7 LPC2148 Pin |
1. Αριστερή καρφίτσα |
- Από την GND |
Καρφίτσα GND |
2. Κεντρική καρφίτσα |
Ρυθμιζόμενη έξοδος 3.3V |
Για είσοδο ποτενσιόμετρου και έξοδο ποτενσιόμετρου σε P0.28 του LPC2148 |
3. Δεξιά καρφίτσα |
+ Ve από 5V ΕΙΣΑΓΩΓΗ |
+ 5V |
Σημεία που πρέπει να σημειωθούν
1. Εδώ χρησιμοποιείται ένας ρυθμιστής τάσης 3.3V για την παροχή αναλογικής τιμής εισόδου στον πείρο ADC (P0.28) του LPC2148 και επειδή χρησιμοποιούμε ισχύ 5V, πρέπει να ρυθμίσουμε την τάση με τον ρυθμιστή τάσης 3.3V.
2. Χρησιμοποιείται ποτενσιόμετρο για τη μεταβολή της τάσης μεταξύ (0V έως 3.3V) για την παροχή αναλογικής εισόδου (ADC) σε LPC2148 ακίδα P0.28
Προγραμματισμός ARM7-LPC2148 για PWM
Για να προγραμματίσουμε το ARM7-LPC2148 χρειαζόμαστε keil uVision & Flash Magic εργαλείο. Χρησιμοποιούμε καλώδιο USB για να προγραμματίσουμε το ARM7 Stick μέσω θύρας micro USB. Γράφουμε κώδικα χρησιμοποιώντας το Keil και δημιουργούμε ένα hex αρχείο και στη συνέχεια το αρχείο HEX αναβοσβήνει στο ARM7 stick χρησιμοποιώντας το Flash Magic. Για να μάθετε περισσότερα σχετικά με την εγκατάσταση του keil uVision και του Flash Magic και πώς να τα χρησιμοποιήσετε, ακολουθήστε τον σύνδεσμο Ξεκινώντας με τον μικροελεγκτή ARM7 LPC2148 και προγραμματίστε τον χρησιμοποιώντας το Keil uVision.
Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε την τεχνική ADC και PWM για τον έλεγχο της φωτεινότητας των LED. Εδώ στο LPC2148 δίνεται αναλογική είσοδος (0 έως 3,3V) μέσω του ακροδέκτη εισόδου ADC P0.28, τότε αυτή η αναλογική είσοδος μετατρέπεται σε ψηφιακή τιμή (0 έως 1023). Στη συνέχεια, αυτή η τιμή μετατρέπεται και πάλι σε ψηφιακή τιμή (0 - 255) καθώς η έξοδος PWM του LPC2148 έχει μόνο ανάλυση 8-bit (2 8). Το LED είναι συνδεδεμένο στον ακροδέκτη PWM P0.0 και η φωτεινότητα του LED μπορεί να ελεγχθεί χρησιμοποιώντας το ποτενσιόμετρο. Για να μάθετε περισσότερα για το ADC στο ARM7-LPC2148 ακολουθήστε τον σύνδεσμο.
Βήματα που εμπλέκονται στον προγραμματισμό LPC2148 για PWM & ADC
Βήμα 1: - Το πρώτο πράγμα είναι να διαμορφώσετε το PLL για παραγωγή ρολογιού καθώς ρυθμίζει το ρολόι συστήματος και το περιφερειακό ρολόι του LPC2148 σύμφωνα με τις ανάγκες των προγραμματιστών. Η μέγιστη συχνότητα ρολογιού για LPC2148 είναι 60Mhz. Οι ακόλουθες γραμμές χρησιμοποιούνται για τη διαμόρφωση της δημιουργίας ρολογιού PLL.
void initilizePLL (void) // Λειτουργία χρήσης PLL για παραγωγή ρολογιού { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; ενώ (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Βήμα 2: - Το επόμενο πράγμα είναι να επιλέξετε τις καρφίτσες PWM και τη λειτουργία PWM του LPC2148 χρησιμοποιώντας τον καταχωρητή PINSEL. Χρησιμοποιούμε το PINSEL0 καθώς χρησιμοποιούμε P0.0 για έξοδο PWM LPC2148.
PINSEL0 = 0x00000002; // Ρύθμιση πείρου P0.0 για έξοδο PWM
Βήμα 3: - Στη συνέχεια πρέπει να επαναφέρετε τα χρονόμετρα χρησιμοποιώντας το PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Ρύθμιση του PWM Timer Control Register ως επαναφορά μετρητή
Και μετά, ορίστε την τιμή προεπιλογής που αποφασίζει την ανάλυση του PWM Το θέτω στο μηδέν
PWMPR = 0Χ00; // Ρύθμιση τιμής προεπιλογής PWM
Βήμα 4: - Στη συνέχεια πρέπει να ρυθμίσουμε το PWMMCR (PWM match control register) καθώς ρυθμίζει τη λειτουργία όπως επαναφορά, διακόπτει το PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Ρύθμιση μητρώου ελέγχου αντιστοίχισης PWM
Βήμα 5: - Η μέγιστη περίοδος του καναλιού PWM ορίζεται χρησιμοποιώντας PWMMR.
PWMMR0 = PWMvalue; // Δίνοντας τιμή PWM Μέγιστη τιμή
Στην περίπτωσή μας η μέγιστη τιμή είναι 255 (Για μέγιστη φωτεινότητα)
Βήμα 6: - Στη συνέχεια πρέπει να ρυθμίσουμε το Latch Enable στους αντίστοιχους καταχωρητές αντιστοίχισης χρησιμοποιώντας PWMLER
PWMLER = (1 << 0); // Μάνδαλο Enalbe PWM
(Χρησιμοποιούμε PWMMR0) Επομένως, ενεργοποιήστε το αντίστοιχο bit ρυθμίζοντας 1 στο PWMLER
Βήμα 7: - Για να ενεργοποιήσετε την έξοδο PWM στον πείρο, πρέπει να χρησιμοποιήσουμε το PWMTCR για να ενεργοποιήσετε τους μετρητές PWM Timer και τις λειτουργίες PWM.
PWMTCR = (1 << 0) - (1 << 3); // Ενεργοποίηση μετρητή PWM και PWM
Βήμα 8: - Τώρα πρέπει να πάρουμε τις τιμές ποτενσιόμετρου για τον καθορισμό του κύκλου λειτουργίας του PWM από τον ακροδέκτη ADC P0.28. Χρησιμοποιούμε λοιπόν τη μονάδα ADC στο LPC2148 για τη μετατροπή των αναλογικών εισόδων ποτενσιόμετρων (0 έως 3.3V) στις τιμές ADC (0 έως 1023).
Εδώ μετατρέπουμε τις τιμές από 0-1023 σε 0-255 διαιρώντας τις με 4 καθώς το PWM του LPC2148 έχει ανάλυση 8-Bit (2 8).
Βήμα 9: - Για την επιλογή ADC pin P0.28 στο LPC2148, χρησιμοποιούμε
PINSEL1 = 0x01000000; // Ρύθμιση P0.28 ως ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Ρύθμιση ρολογιού και PDN για μετατροπή A / D
Οι ακόλουθες γραμμές καταγράφουν την αναλογική είσοδο (0 έως 3.3V) και τη μετατρέπουν σε ψηφιακή τιμή (0 έως 1023). Και έπειτα αυτές οι ψηφιακές τιμές διαιρούνται με 4 για να τις μετατρέψουν σε (0 έως 255) και τελικά τροφοδοτούνται ως έξοδος PWM σε ακροδέκτη P0.0 του LPC2148 στην οποία είναι συνδεδεμένο το LED.
AD0CR - = (1 << 1); // Επιλέξτε κανάλι AD0.1 στον χρόνο καθυστέρησης εγγραφής ADC (10). AD0CR - = (1 << 24); // Ξεκινήστε τη μετατροπή A / D ενώ ((AD0DR1 & (1 << 31)) == 0); // Ελέγξτε το bit DONE στο ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Λάβετε το ΑΠΟΤΕΛΕΣΜΑ από τον καταχωρητή δεδομένων ADC dutycycle = adcvalue / 4; // τύπος για λήψη τιμών dutycycle από (0 έως 255) PWMMR1 = dutycycle; // ορίστε τιμή dutycycle σε PWM register register PWMLER - = (1 << 1); // Ενεργοποιήστε την έξοδο PWM με τιμή dutycycle
Βήμα 10: - Στη συνέχεια προβάλλουμε αυτές τις τιμές στη μονάδα οθόνης LCD (16X2). Προσθέτουμε λοιπόν τις ακόλουθες γραμμές για να αρχικοποιήσουμε την οθόνη LCD
Void LCD_INITILIZE (void) // Λειτουργία για την προετοιμασία της οθόνης LCD { IO0DIR = 0x0000FFF0; // Ορίζει τους ακροδέκτες P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 ως χρόνο καθυστέρησης OUTPUT (20). LCD_SEND (0x02); // Αρχικοποιήστε το lcd σε λειτουργία 4-bit LCD_SEND (0x28). // 2 γραμμές (16X2) LCD_SEND (0x0C); // Εμφάνιση στο δρομέα εκτός LCD_SEND (0x06). // Αυτόματη αύξηση κέρσορα LCD_SEND (0x01). // Οθόνη καθαρή οθόνη LCD_SEND (0x80). // Πρώτη θέση πρώτης γραμμής }
Καθώς συνδέσαμε την οθόνη LCD σε λειτουργία 4-Bit με LPC2148, πρέπει να στείλουμε τιμές που θα εμφανίζονται ως nibble by nibble (Upper Nibble & Lower Nibble). Χρησιμοποιούνται λοιπόν οι ακόλουθες γραμμές.
void LCD_DISPLAY (char * msg) // Λειτουργία εκτύπωσης των χαρακτήρων που στέλνονται ένας προς έναν { uint8_t i = 0; ενώ (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Στέλνει Άνω μύτη IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH για εκτύπωση δεδομένων IO0CLR = 0x00000020; // Χρόνος καθυστέρησης λειτουργίας εγγραφής RW LOW (2); IO0CLR = 0x00000040; // EN = 0, RS και RW αμετάβλητα (δηλ. RS = 1, RW = 0) χρόνος καθυστέρησης (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Στέλνει χαμηλότερη μύτη IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; χρόνος καθυστέρησης (2) IO0CLR = 0x00000040; χρόνος καθυστέρησης (5) i ++; } }
Για να εμφανίσουμε αυτές τις τιμές ADC & PWM χρησιμοποιούμε τις ακόλουθες γραμμές στη συνάρτηση int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc). // Εμφάνιση τιμών ADC (0 έως 1023) LCD_SEND (0xC0). sprintf (ledoutput, "PWM OP =%. 2f", φωτεινότητα); LCD_DISPLAY (ledoutput). // Εμφάνιση τιμών dutycycle από (0 έως 255)
Ο πλήρης κώδικας και η περιγραφή βίντεο του σεμιναρίου δίνονται παρακάτω.