- Βοηθητικό μοτέρ
- Έλεγχος Servo Motor με χρήση LPC2148 PWM & ADC
- Καρφίτσες PWM & ADC στο ARM7-LPC2148
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και συνδέσεις
- Προγραμματισμός ARM7-LPC2148 για έλεγχο κινητήρα σερβο
Στο προηγούμενο σεμινάριό μας, έχουμε διασυνδέσει stepper motor με ARM7-LPC2148. Σε αυτό το σεμινάριο, θα ελέγξουμε το Servo Motor με ARM7-LPC2148. Ο σερβοκινητήρας έχει χαμηλό πλεονέκτημα κατανάλωσης ισχύος έναντι του κινητήρα stepper Ένας σερβοκινητήρας σταματά την κατανάλωση ισχύος όταν επιτευχθεί η επιθυμητή θέση αλλά ο βηματικός κινητήρας συνεχίζει να καταναλώνει ισχύ για να κλειδώσει τον άξονα στην επιθυμητή θέση. Οι σερβοκινητήρες χρησιμοποιούνται ως επί το πλείστον σε ρομποτικά έργα λόγω της ακρίβειας και του εύχρηστου χειρισμού τους.
Σε αυτό το σεμινάριο θα μάθουμε για το Servo Motor και τον τρόπο διασύνδεσης του Servo με το ARM7-LPC2148. Ένα ποτενσιόμετρο είναι επίσης διασυνδεδεμένο για να μεταβάλλει τη θέση του άξονα του σερβοκινητήρα, και μια οθόνη LCD για την εμφάνιση της τιμής γωνίας.
Βοηθητικό μοτέρ
Το Servo Motor είναι ένας συνδυασμός κινητήρα DC, συστήματος ελέγχου θέσης και γραναζιών. Η περιστροφή του σερβοκινητήρα ελέγχεται εφαρμόζοντας ένα σήμα PWM σε αυτό, το πλάτος του σήματος PWM αποφασίζει τη γωνία περιστροφής και την κατεύθυνση του κινητήρα. Εδώ θα χρησιμοποιήσουμε το SG90 Servo Motor σε αυτό το σεμινάριο, είναι ένα από τα δημοφιλή και φθηνότερα. Το SG90 είναι σερβο 180 μοιρών. Έτσι, με αυτό το σερβο μπορούμε να τοποθετήσουμε τον άξονα από 0-180 μοίρες:
- Τάση λειτουργίας: + 5V
- Τύπος εργαλείων: Πλαστικό
- Γωνία περιστροφής: 0 έως 180 βαθμούς
- Βάρος: 9gm
- Ροπή: 2,5kg / cm
Για να μπορέσουμε να ξεκινήσουμε τον προγραμματισμό για τον κινητήρα Servo πρέπει να γνωρίζουμε τι είδους σήμα πρέπει να σταλεί για τον έλεγχο του κινητήρα Servo. Πρέπει να προγραμματίσουμε το MCU για να στείλουμε σήματα PWM στο καλώδιο σήματος του κινητήρα Servo. Υπάρχει ένα κύκλωμα ελέγχου στο εσωτερικό του σερβοκινητήρα που διαβάζει τον κύκλο λειτουργίας του σήματος PWM και τοποθετεί τον άξονα σερβοκινητήρων στην αντίστοιχη θέση όπως φαίνεται στην παρακάτω εικόνα
Για κάθε 20 χιλιοστά του δευτερολέπτου, ο κινητήρας Servo ελέγχει τον παλμό. Έτσι, ρυθμίστε το πλάτος παλμού του σήματος για να περιστρέψετε τον άξονα του κινητήρα.
- Πλάτος παλμού 1 ms (1 χιλιοστά του δευτερολέπτου) για περιστροφή του σερβο σε 0 βαθμό
- Πλάτος παλμού 1,5ms για περιστροφή έως 90 μοίρες (ουδέτερη θέση)
- Πλάτος παλμού 2 ms για περιστροφή σερβο σε 180 μοίρες.
Πριν συνδέσετε το Servo στο ARM7-LPC2148, μπορείτε να δοκιμάσετε το servo σας με τη βοήθεια αυτού του Circuit Motor Tester Circuit. Ελέγξτε επίσης πώς μπορεί να συνδεθεί ένας σερβοκινητήρας με άλλους μικροελεγκτές:
- Servo Motor Control με χρήση του Arduino
- Servo Motor Interfacing με 8051 μικροελεγκτή
- Servo Motor Control χρησιμοποιώντας MATLAB
- Servo Motor Control με Raspberry Pi
- Διασύνδεση Servo Motor με MSP430G2
- Διασύνδεση σερβοκινητήρα με STM32F103C8
Έλεγχος Servo Motor με χρήση LPC2148 PWM & ADC
Ένας σερβοκινητήρας μπορεί να ελεγχθεί από το LPC2148 χρησιμοποιώντας PWM. Παρέχοντας σήμα PWM στον ακροδέκτη PWM του SERVO με περίοδο 20ms και συχνότητα 50Hz μπορούμε να τοποθετήσουμε τον άξονα του σερβοκινητήρα περίπου 180 μοίρες (-90 έως +90).
Ένα ποτενσιόμετρο χρησιμοποιείται για να μεταβάλει τον κύκλο λειτουργίας του σήματος PWM και να περιστρέψει τον άξονα του σερβοκινητήρα, αυτή η μέθοδος εφαρμόζεται με τη χρήση της μονάδας ADC στο LPC2148. Γι 'αυτό χρειαζόμαστε τόσο τις έννοιες PWM όσο και ADC για να εφαρμοστούν σε αυτό το σεμινάριο. Ανατρέξτε λοιπόν στα προηγούμενα μαθήματά μας για να μάθετε PWM και ADC στο ARM7-LPC2148.
- Πώς να χρησιμοποιήσετε το PWM στο ARM7-LPC2148
- Πώς να χρησιμοποιήσετε το ADC στο ARM-LPLC2148
Καρφίτσες PWM & ADC στο ARM7-LPC2148
Η παρακάτω εικόνα δείχνει τις ακίδες PWM και ADC στο LPC2148. Τα κίτρινα κουτιά υποδεικνύουν τους (6) ακροδέκτες PWM και το μαύρο κουτί δηλώνει τους (14) ακροδέκτες ADC.
Απαιτούμενα στοιχεία
Σκεύη, εξαρτήματα
- ARM7-LPC2148
- Ενότητα οθόνης LCD (16x2)
- Σερβο κινητήρας (SG-90)
- Ρυθμιστής τάσης 3.3V
- Ποτενσιόμετρο 10k (2 Nos)
- Ψωμί
- Σύνδεση καλωδίων
Λογισμικό
- Keil uVision5
- Flash Magic Tool
Διάγραμμα κυκλώματος και συνδέσεις
Ο παρακάτω πίνακας δείχνει τη σύνδεση μεταξύ Servo Motor & ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
ΚΟΚΚΙΝΟ (+ 5V) |
+ 5V |
ΚΑΦΕ (GND) |
GND |
ΠΟΡΤΟΚΑΛΙ (PWM) |
Σ0.1 |
Ο ακροδέκτης P0.1 είναι η έξοδος PWM του LPC2148.
Ο παρακάτω πίνακας δείχνει τις συνδέσεις κυκλώματος μεταξύ 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, Α |
Ο παρακάτω πίνακας δείχνει τις συνδέσεις μεταξύ 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
3. Ο πείρος P0.1 του LPC2148 παρέχει έξοδο PWM στον σερβοκινητήρα για τον έλεγχο της θέσης του κινητήρα.
4. Σύμφωνα με την τιμή αναλογικής εισόδου (ADC), η θέση του σερβοκινητήρα αλλάζει από (0 σε 180 μοίρες) μέσω του πείρου εξόδου PWM στο P0.1 του LPC2148.
Προγραμματισμός ARM7-LPC2148 για έλεγχο κινητήρα σερβο
Για να προγραμματίσουμε το 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.
Βήματα που εμπλέκονται στη διαμόρφωση LPC2148 για PWM & ADC για έλεγχο του Servo Motor
Βήμα 1: - Συμπεριλάβετε τα απαραίτητα αρχεία κεφαλίδας για την κωδικοποίηση LPC2148
#περιλαμβάνω
Βήμα 2: - Το επόμενο πράγμα είναι να διαμορφώσετε το 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; }
Βήμα 3: - Το επόμενο πράγμα που πρέπει να κάνετε είναι να επιλέξετε τις καρφίτσες PWM και τη λειτουργία PWM του LPC2148 χρησιμοποιώντας τον καταχωρητή PINSEL. Χρησιμοποιούμε το PINSEL0 καθώς χρησιμοποιούμε το P0.1 για έξοδο PWM του LPC2148.
PINSEL0 - = 0x00000008; // Ρύθμιση του πείρου P0.1 του LPC2148 ως PWM3
Βήμα 4: - Στη συνέχεια, πρέπει να επαναφέρετε τα χρονόμετρα χρησιμοποιώντας PWMTCR (Timer Control Register)
PWMTCR = 0x02; // Επαναφορά και απενεργοποίηση μετρητή για PWM
Στη συνέχεια, ορίστε στη συνέχεια την τιμή προεπιλογής που αποφασίζει την ανάλυση της PWM.
PWMPR = 0x1D; // Τιμή εγγραφής Prescale
Βήμα 5: - Στη συνέχεια, ρυθμίστε το PWMMCR (PWM match control register) καθώς ρυθμίζει τη λειτουργία όπως επαναφορά, διακόπτει τα PWMMR0 και PWMMR3
PWMMCR = 0x00000203; // Επαναφορά και διακοπή στον αγώνα MR0, διακοπή στον αγώνα MR3
Βήμα 6: - Η μέγιστη περίοδος του καναλιού PWM ορίζεται χρησιμοποιώντας PWMMR0 και ο τόνος του κύκλου λειτουργίας PWM ορίζεται αρχικά στα 0,65msec
PWMMR0 = 20000; // Χρονική περίοδος κύματος PWM, 20msec PWMMR3 = 650; // Τόνος κύματος PWM 0,65 msec
Βήμα 7: - Στη συνέχεια, πρέπει να ρυθμίσουμε το Latch Enable στους αντίστοιχους καταχωρητές αντιστοίχισης χρησιμοποιώντας PWMLER
PWMLER = 0x09; // Ενεργοποίηση Latch για PWM3 και PWM0
(Χρησιμοποιούμε PWMMR0 & PWMMR3) Επομένως, ενεργοποιήστε το αντίστοιχο bit ρυθμίζοντας 1 στο PWMLER
Βήμα 8: - Για να ενεργοποιήσετε την έξοδο PWM στον πείρο πρέπει να χρησιμοποιήσουμε το PWMTCR για να ενεργοποιήσουμε τους μετρητές PWM Timer και τις λειτουργίες PWM.
PWMPCR = 0x0800; // Ενεργοποίηση PWM3 και PWM 0, PWM ελεγχόμενης μίας άκρης PWMTCR = 0x09; // Ενεργοποίηση PWM και μετρητή
Βήμα 9: - Τώρα πρέπει να λάβουμε τις τιμές ποτενσιόμετρου για τον καθορισμό του κύκλου λειτουργίας του PWM από τον ακροδέκτη ADC P0.28. Έτσι, χρησιμοποιούμε τη μονάδα ADC στο LPC2148 για τη μετατροπή των αναλογικών εισόδων ποτενσιόμετρων (0 έως 3.3V) στις τιμές ADC (0 έως 1023).
Βήμα 10: - Για την επιλογή του pin ADC 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.1 του LPC2148. Εδώ μετατρέπουμε τις τιμές από 0-1023 σε 0-255 διαιρώντας τις με 4 καθώς το PWM του LPC2148 έχει ανάλυση 8-Bit (28).
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
Βήμα 11: - Στη συνέχεια, εμφανίζουμε αυτές τις τιμές στη μονάδα οθόνης 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", dutycycle); LCD_DISPLAY (displayadc). // Εμφάνιση τιμής ADC (0 έως 1023) = = adcvalue / 5,7); // Τύπος για τη μετατροπή της τιμής ADC σε γωνία (o έως 180 deg) LCD_SEND (0xC0). sprintf (anglevalue, "ANGLE =%. 2f deg", γωνία); LCD_DISPLAY (γωνία τιμής);
Ο πλήρης κώδικας και η περιγραφή βίντεο του σεμιναρίου δίνονται παρακάτω