- Τι είναι το σήμα PWM;
- PWM χρησιμοποιώντας PIC16F877A:
- Προγραμματισμός PIC για τη δημιουργία σημάτων PWM:
- Σχηματικά και δοκιμαστικά:
- Εργασία σε υλικό:
Αυτό είναι το 10ο σεμινάριό μας για την εκμάθηση μικροελεγκτών PIC χρησιμοποιώντας MPLAB και XC8. Μέχρι τώρα, έχουμε καλύψει πολλά βασικά σεμινάρια όπως LED που αναβοσβήνει με PIC, Timers in PIC, interfacing LCD, interfacing 7-segment, ADC using PIC κ.λπ. Εάν είστε απόλυτος αρχάριος, τότε επισκεφθείτε την πλήρη λίστα των PIC tutorials εδώ και αρχίστε να μαθαίνετε.
Σε αυτό το σεμινάριο, θα μάθουμε πώς να δημιουργούμε σήματα PWM χρησιμοποιώντας το PIC PIC16F877A. Το PIC MCU μας διαθέτει μια ειδική μονάδα που ονομάζεται Συγκέντρωση συλλογής (CCP) η οποία μπορεί να χρησιμοποιηθεί για τη δημιουργία σημάτων PWM. Εδώ, θα δημιουργήσουμε PWM 5 kHz με μεταβλητό κύκλο λειτουργίας από 0% έως 100%. Για να διαφοροποιήσουμε τον κύκλο λειτουργίας χρησιμοποιούμε ένα ποτενσιόμετρο, επομένως συνιστάται να μάθετε ADC tutorial πριν ξεκινήσετε με το PWM. Η μονάδα PWM χρησιμοποιεί επίσης χρονοδιακόπτες για να ορίσει τη συχνότητά της και ως εκ τούτου μάθετε πώς να χρησιμοποιείτε χρονόμετρα εκ των προτέρων εδώ. Επιπλέον, σε αυτό το σεμινάριο θα χρησιμοποιήσουμε ένα κύκλωμα RC και ένα LED για να μετατρέψουμε τις τιμές PWM σε αναλογική τάση και θα το χρησιμοποιήσουμε για τη μείωση του φωτός LED.
Τι είναι το σήμα PWM;
Το Pulse Width Modulation (PWM) είναι ένα ψηφιακό σήμα που χρησιμοποιείται συχνότερα στα κυκλώματα ελέγχου. Αυτό το σήμα ρυθμίζεται υψηλό (5v) και χαμηλό (0v) σε προκαθορισμένο χρόνο και ταχύτητα. Ο χρόνος κατά τον οποίο το σήμα παραμένει υψηλό ονομάζεται "on time" και ο χρόνος κατά τον οποίο το σήμα παραμένει χαμηλό ονομάζεται "off time". Υπάρχουν δύο σημαντικές παράμετροι για ένα PWM όπως συζητείται παρακάτω:
Κύκλος λειτουργίας του PWM:
Το ποσοστό χρόνου στο οποίο το σήμα PWM παραμένει ΥΨΗΛΟ (στην ώρα) ονομάζεται κύκλος λειτουργίας. Εάν το σήμα είναι πάντα ΕΝΕΡΓΟ, βρίσκεται σε κύκλο λειτουργίας 100% και εάν είναι πάντα σβηστό, είναι κύκλος λειτουργίας 0%.
Κύκλος λειτουργίας = Χρόνος ενεργοποίησης / (Χρόνος ενεργοποίησης + χρόνος απενεργοποίησης)
Συχνότητα ενός PWM:
Η συχνότητα ενός σήματος PWM καθορίζει πόσο γρήγορα ένα PWM ολοκληρώνει μια περίοδο. Μια περίοδος είναι πλήρης ON και OFF ενός σήματος PWM όπως φαίνεται στο παραπάνω σχήμα. Στο σεμινάριό μας θα ορίσουμε μια συχνότητα 5KHz.
PWM χρησιμοποιώντας PIC16F877A:
Τα σήματα PWM μπορούν να δημιουργηθούν στον μικροελεγκτή PIC χρησιμοποιώντας τη μονάδα CCP (Σύγκριση Capture PWM). Η ανάλυση του σήματος PWM μας είναι 10-bit, δηλαδή για τιμή 0 θα υπάρχει κύκλος λειτουργίας 0% και για τιμή 1024 (2 ^ 10) θα υπάρχει κύκλος λειτουργίας 100%. Υπάρχουν δύο μονάδες CCP στο PIC MCU μας (CCP1 και CCP2), αυτό σημαίνει ότι μπορούμε να δημιουργήσουμε δύο σήματα PWM σε δύο διαφορετικές ακίδες (pin 17 και 16) ταυτόχρονα, στο σεμινάριό μας χρησιμοποιούμε CCP1 για να δημιουργήσουμε σήματα PWM στον ακροδέκτη 17.
Οι παρακάτω καταχωρητές χρησιμοποιούνται για τη δημιουργία σημάτων PWM χρησιμοποιώντας το PIC MCU μας:
- CCP1CON (Μητρώο ελέγχου CCP1)
- T2CON (Μητρώο ελέγχου χρονοδιακόπτη 2)
- PR2 (Timer 2 modules Period Register)
- CCPR1L (Μητρώο CCP 1 Χαμηλό)
Προγραμματισμός PIC για τη δημιουργία σημάτων PWM:
Στο πρόγραμμά μας θα διαβάσουμε μια αναλογική τάση 0-5v από ένα ποτενσιόμετρο και θα την αντιστοιχίσουμε στο 0-1024 χρησιμοποιώντας τη μονάδα ADC. Στη συνέχεια παράγουμε σήμα PWM με συχνότητα 5000Hz και μεταβάλλουμε τον κύκλο λειτουργίας του με βάση την αναλογική τάση εισόδου. Δηλαδή 0-1024 θα μετατραπεί σε 0% -100% Duty cycle. Αυτό το σεμινάριο προϋποθέτει ότι έχετε ήδη μάθει να χρησιμοποιείτε το ADC σε PIC εάν όχι, διαβάστε το από εδώ, γιατί θα παραλείψουμε λεπτομέρειες σχετικά με αυτό σε αυτό το σεμινάριο.
Έτσι, μόλις οριστούν τα bit διαμόρφωσης και το πρόγραμμα έχει γραφτεί για να διαβάσει μια αναλογική τιμή, μπορούμε να προχωρήσουμε με το PWM.
Τα ακόλουθα βήματα πρέπει να λαμβάνονται κατά τη διαμόρφωση της μονάδας CCP για τη λειτουργία PWM:
- Ορίστε την περίοδο PWM γράφοντας στον καταχωρητή PR2.
- Ορίστε τον κύκλο λειτουργίας PWM γράφοντας στον καταχωρητή CCPR1L και στα ψηφία CCP1CON <5: 4>.
- Κάντε την καρφίτσα CCP1 έξοδο διαγράφοντας το TRISC <2> bit.
- Ορίστε την τιμή presrale TMR2 και ενεργοποιήστε το Timer2 γράφοντας στο T2CON.
- Διαμορφώστε τη μονάδα CCP1 για τη λειτουργία PWM.
Υπάρχουν δύο σημαντικές λειτουργίες σε αυτό το πρόγραμμα για τη δημιουργία σημάτων PWM. Το ένα είναι η συνάρτηση PWM_Initialize () η οποία θα προετοιμάσει τους καταχωρητές που απαιτούνται για τη ρύθμιση της μονάδας PWM και στη συνέχεια θα ορίσει τη συχνότητα με την οποία πρέπει να λειτουργεί το PWM, η άλλη συνάρτηση είναι η συνάρτηση PWM_Duty () που θα ρυθμίσει τον κύκλο λειτουργίας του σήματος PWM τα απαιτούμενα μητρώα.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Ρύθμιση των τύπων PR2 χρησιμοποιώντας φύλλο δεδομένων // Κάνει το PWM να λειτουργεί σε 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Διαμόρφωση της μονάδας CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Διαμόρφωση της μονάδας χρονοδιακόπτη TRISC2 = 0; // ορίστε το pin pin στο C ως έξοδο}
Η παραπάνω συνάρτηση είναι η συνάρτηση αρχικοποίησης PWM, σε αυτή τη λειτουργία Η μονάδα CCP1 έχει ρυθμιστεί να χρησιμοποιεί PWM κάνοντας το bit CCP1M3 και το CCP1M2 ως υψηλό.
Το prescaler της μονάδας χρονοδιακόπτη ρυθμίζεται κάνοντας το bit T2CKPS0 τόσο υψηλό και το T2CKPS1 όσο χαμηλότερο το bit TMR2ON έχει ρυθμιστεί για να ξεκινήσει ο χρονοδιακόπτης.
Τώρα, πρέπει να ρυθμίσουμε τη συχνότητα του σήματος PWM. Η τιμή της συχνότητας πρέπει να γραφτεί στον καταχωρητή PR2. Η επιθυμητή συχνότητα μπορεί να ρυθμιστεί χρησιμοποιώντας τους παρακάτω τύπους
Περίοδος PWM = * 4 * TOSC * (Τιμή προεπιλογής TMR2)
Η αναδιάταξη αυτών των τύπων για τη λήψη PR2 θα δώσει
PR2 = (Περίοδος / (4 * Tosc * TMR2 Prescale)) - 1
Γνωρίζουμε ότι Περίοδος = (1 / PWM_freq) και Tosc = (1 / _XTAL_FREQ). Επομένως…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Μόλις οριστεί η συχνότητα, αυτή η λειτουργία δεν χρειάζεται να καλείται ξανά εκτός και αν χρειαστεί να αλλάξουμε ξανά τη συχνότητα. Στο σεμινάριό μας έχω εκχωρήσει PWM_freq = 5000; έτσι ώστε να μπορούμε να έχουμε συχνότητα λειτουργίας 5 KHz για το σήμα PWM.
Τώρα ας ρυθμίσουμε τον κύκλο λειτουργίας του PWM χρησιμοποιώντας την παρακάτω συνάρτηση
PWM_Duty (χωρίς υπογραφή int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Κατά τη μείωση // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = καθήκον & 1; // Αποθηκεύστε το 1ο bit CCP1Y = duty & 2; // Αποθηκεύστε το 0th bit CCPR1L = duty >> 2; // Αποθηκεύστε το remining 8 bit}}
Το σήμα PWM μας έχει ανάλυση 10 bit, επομένως αυτή η τιμή δεν μπορεί να αποθηκευτεί σε έναν μόνο καταχωρητή, καθώς το PIC μας έχει μόνο γραμμές δεδομένων 8 bit. Έχουμε λοιπόν χρήση σε άλλα δύο bit του CCP1CON <5: 4> (CCP1X και CCP1Y) για να αποθηκεύσουμε τα δύο τελευταία LSB και στη συνέχεια να αποθηκεύσουμε τα υπόλοιπα 8 bits στο CCPR1L Register.
Ο χρόνος κύκλου λειτουργίας PWM μπορεί να υπολογιστεί χρησιμοποιώντας τους παρακάτω τύπους:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Τιμή προεπιλογής TMR2)
Η αναδιάταξη αυτών των τύπων για να λάβετε τιμή CCPR1L και CCP1CON θα δώσει:
CCPRIL: CCP1Con <5: 4> = Κύκλος DWM Duty / (Tosc * TMR2 Prescale Value)
Η τιμή του ADC μας θα είναι 0-1024, πρέπει να είναι στο 0% -100%, επομένως, PWM Duty Cycle = duty / 1023. Περαιτέρω για να μετατρέψουμε αυτόν τον κύκλο λειτουργίας σε χρονική περίοδο πρέπει να τον πολλαπλασιάσουμε με την περίοδο (1 / PWM_freq)
Γνωρίζουμε επίσης ότι Tosc = (1 / PWM_freq), επομένως..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Η επίλυση της παραπάνω εξίσωσης θα μας δώσει:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Μπορείτε να δείτε το πλήρες πρόγραμμα στην ενότητα Κώδικας παρακάτω μαζί με το λεπτομερές βίντεο.
Σχηματικά και δοκιμαστικά:
Ως συνήθως, ας επαληθεύσουμε την έξοδο χρησιμοποιώντας την προσομοίωση Proteus. Το διάγραμμα κυκλώματος φαίνεται παρακάτω.
Συνδέστε ένα ποτενσιόμετρο στον 7 ο πείρο για τροφοδοσία σε τάση 0-5. Η μονάδα CCP1 είναι με τον ακροδέκτη 17 (RC2), εδώ θα δημιουργηθεί το PWM το οποίο μπορεί να επαληθευτεί χρησιμοποιώντας το Ψηφιακό παλμογράφο. Περαιτέρω για να το μετατρέψουμε σε μεταβλητή τάση χρησιμοποιήσαμε ένα φίλτρο RC και ένα LED για να επαληθεύσουμε την έξοδο χωρίς πεδίο.
Τι είναι το φίλτρο RC;
Ένα φίλτρο RC ή ένα φίλτρο χαμηλής διέλευσης είναι ένα απλό κύκλωμα με δύο παθητικά στοιχεία, δηλαδή την αντίσταση και τον πυκνωτή. Αυτά τα δύο στοιχεία χρησιμοποιούνται για να φιλτράρουν τη συχνότητα του σήματος PWM και να το μετατρέψουν σε μεταβλητή τάση DC.
Εάν εξετάσουμε το κύκλωμα, όταν εφαρμόζεται μεταβλητή τάση στην είσοδο του R, ο πυκνωτής C θα αρχίσει να φορτίζει. Με βάση την τιμή του πυκνωτή, ο πυκνωτής θα πάρει λίγο χρόνο για να φορτιστεί πλήρως, αφού φορτιστεί θα μπλοκάρει το ρεύμα DC (Θυμηθείτε ότι οι πυκνωτές μπλοκάρουν DC αλλά επιτρέπει το AC), επομένως η τάση εισόδου DC θα εμφανιστεί σε όλη την έξοδο. Η υψηλή συχνότητα PWM (σήμα AC) θα γειωθεί μέσω του πυκνωτή. Έτσι λαμβάνεται ένα καθαρό DC κατά μήκος του πυκνωτή. Μια τιμή 1000Ohm και 1uf βρέθηκε κατάλληλη για αυτό το έργο. Ο υπολογισμός των τιμών των R και C περιλαμβάνει ανάλυση κυκλώματος χρησιμοποιώντας τη λειτουργία μεταφοράς, η οποία είναι εκτός πεδίου αυτού του σεμιναρίου.
Η έξοδος του προγράμματος μπορεί να επαληθευτεί χρησιμοποιώντας το Ψηφιακό παλμογράφο όπως φαίνεται παρακάτω, αλλάξτε το Ποτενσιόμετρο και ο κύκλος λειτουργίας του PWM θα πρέπει να αλλάξει. Μπορούμε επίσης να παρατηρήσουμε την τάση εξόδου του κυκλώματος RC χρησιμοποιώντας το βολτόμετρο. Εάν όλα λειτουργούν όπως αναμένεται, μπορούμε να προχωρήσουμε με το υλικό μας. Περαιτέρω ελέγξτε το βίντεο στο τέλος για πλήρη διαδικασία.
Εργασία σε υλικό:
Η εγκατάσταση υλικού του έργου είναι πολύ απλή, απλώς πρόκειται να επαναχρησιμοποιήσουμε τον πίνακα PIC Perf που φαίνεται παρακάτω.
Χρειαζόμαστε επίσης ποτενσιόμετρο για τροφοδοσία στην αναλογική τάση, έχω συνδέσει μερικά θηλυκά ακραία καλώδια στην κατσαρόλα μου (φαίνεται παρακάτω), ώστε να μπορούμε να τα συνδέσουμε απευθείας στην πλακέτα PIC Perf.
Τέλος, για να επαληθεύσουμε την έξοδο χρειαζόμαστε ένα κύκλωμα RC και ένα LED για να δούμε πώς λειτουργεί το σήμα PWM, απλά χρησιμοποίησα μια μικρή πλακέτα perf και συγκολλήσαμε το κύκλωμα RC και το LED (για να ελέγξω τη φωτεινότητα) σε αυτό όπως φαίνεται παρακάτω
Μπορούμε να χρησιμοποιήσουμε απλά καλώδια σύνδεσης από θηλυκό σε θηλυκό και να τα συνδέσουμε σύμφωνα με τα σχήματα που εμφανίζονται παραπάνω. Μόλις ολοκληρωθεί η σύνδεση, ανεβάστε το πρόγραμμα στο PIC χρησιμοποιώντας το pickit3 μας και θα πρέπει να μπορείτε να λάβετε μια μεταβλητή τάση με βάση την είσοδο του ποτενσιόμετρου σας. Η μεταβλητή έξοδος χρησιμοποιείται για τον έλεγχο της φωτεινότητας του LED εδώ.
Χρησιμοποίησα το πολύμετρο μου για να μετρήσω τις μεταβλητές εξόδους, μπορούμε επίσης να παρατηρήσουμε ότι η φωτεινότητα του LED αλλάζει για διαφορετικά επίπεδα τάσης.
Αυτό έχουμε προγραμματίσει να διαβάσουμε την αναλογική τάση από το POT και να μετατρέψουμε σε σήματα PWM τα οποία με τη σειρά τους έχουν μετατραπεί σε μεταβλητή τάση χρησιμοποιώντας φίλτρο RC και το αποτέλεσμα επαληθεύεται χρησιμοποιώντας το υλικό μας. Εάν έχετε κάποια αμφιβολία ή κολλήσετε κάπου, παρακαλούμε χρησιμοποιήστε την παρακάτω ενότητα σχολίων, θα χαρούμε να σας βοηθήσουμε. Το πλήρες έργο λειτουργεί στο βίντεο.
Ελέγξτε επίσης τα άλλα μας PWM Tutorials σε άλλους μικροελεγκτές:
- Εκμάθηση Raspberry Pi PWM
- PWM με Arduino Due
- Arduino LED Dimmer με χρήση PWM
- Power LED Dimmer με χρήση μικροελεγκτή ATmega32