PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Εφαρμογές με μικροεπεξεργαστές, ανάπτυξη προγραμμάτων, ιδέες και τεχνικά σημειώματα.
Απάντηση
Άβαταρ μέλους
GeorgeVita
Διαχειριστής
Δημοσιεύσεις: 624
Εγγραφή: 04 Σεπ 2013, 21:51
Ονομα: Γιώργος
Επικοινωνία:

PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Δημοσίευση από GeorgeVita »

PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Καπηλεύομαι το όνομα του γνωστότερου ολοκληρωμένου κυκλώματος (LM555) για να ονομάσω έτσι μια "γεννήτρια σημάτων PWM χαμηλής συχνότητας" υλοποιημένη με ένα μικροεπεξεργαστή PIC των 8 ποδιών που θα ρυθμίζεται από 3x ποτενσιόμετρα των 5ΚΩ...

Βασικό θεωρητικό κύκλωμα:

Εικόνα

Επιλογή μικροεπεξεργαστή
Μπορούμε να χρησιμοποιήσουμε τον "βασικό" PIC12F675 και να παράγουμε ψηφιακούς παλμούς σε συχνότητες από 0Hz έως λίγες δεκάδες KHz με καλή ανάλυση στη ρύθμιση του ποσοστού PWM ή να "ανέβουμε" σε συχνότητα και ανάλυση με τον νεώτερο PIC12F1840 που έχει εσωτερικό PWM.

Χαρακτηριστικά λειτουργίας
Στην αρχική μου ιδέα όλες οι ρυθμίσεις γίνονται από τα ποτενσιόμετρα:
α. επιλογή κλίμακας συχνότητας ανάλογα με τη "χονδρική" θέση του ποτενσιομέτρου (10-100-1Κ-10Κ-100Κ)
β. ρύθμιση συχνότητας (0-100)
γ. ρύθμιση duty cycle (0-100%)

Στις δύο εξόδους έχουμε συμμετρικό παλμό.

Το μπουτόν "MODE" μπορεί να λειτουργεί ως "START/STOP", για προγραμματισμό ορίων, ενεργοποίηση "dead time", κλπ.

Πρόγραμμα
Η ανάπτυξη του προγράμματος για τον PIC είναι μια καλή εκπαιδευτική άσκηση για όποιον ξεκινά με τους μικροεπεξεργαστές.
Για την υλοποίηση με τον "βασικό" PIC οι παλμοί θα παράγονται από απλές εντολές "SET/RESET BIT" και ενδιάμεση χρονική καθυστέρηση ελέγχοντας την τιμή εσωτερικού χρονιστή (TIMER) ή με απλούς βρόχους εντολών (delays). Οι χρόνοι Ton/Toff θα ρυθμίζονται από την τιμή που δίνουν οι μετατροπείς A/D λόγω τάσης στο δρομέα των ποτενσιομέτρων.

Γενικά το πρόγραμμα εκτελεί τις παρακάτω ενέργειες:

- αρχικοποίηση εισόδων/εξόδων
- αρχικοποίηση αναλογικών μετατροπέων
- αρχικοποίηση μνήμης και μετρητών
-------
αρχή κεντρικού βρόχου (εκτελείται διαρκώς)
..... έλεγχος κατάστασης μπουτόν
..... ρύθμιση παραμέτρων λειτουργίας (λόγω μπουτόν)
..... μέτρηση αναλογικών εισόδων
..... υπολογισμός παραμέτρων χρονισμού
..... έξοδος "Q=H"
..... βρόχος καθυστέρησης παλμού "H"
..... έξοδος "Q=L"
..... βρόχος καθυστέρησης παλμού "L"
τέλος κεντρικού βρόχου

Αν το μπουτόν λειτουργεί ως φυσικό "RESET" δεν χρειαζόμαστε τους σχετικούς ελέγχους στον κεντρικό βρόχο αλλά στην αρχή του προγράμματος θα ελέγξουμε αν το RESET προήλθε από POWER ON ή από το pin MCLR και θα ρυθμίσουμε ανάλογα τις παραμέτρους μας.

Υπολογισμοί, προβληματισμοί
Η μέγιστη συχνότητα και το ελάχιστο βήμα στη ρύθμιση του παλμού εξόδου καθορίζεται από τον απαιτούμενο χρόνο εκτέλεσης ενός κύκλου προγράμματος που διαφέρει αρκετά ανάλογα με τη μέθοδο συγχρονισμού που θα επιλέξουμε. Για παράδειγμα, αν μπορούσαμε να έχουμε βρόχο 10 εντολών με εσωτερικό ταλαντωτή 4MHz θα μπορούσαμε να αλλάζουμε την έξοδο κάθε 10μSec που θα έδινε μέγιστη παραγόμενη συχνότητα 1/(10+10μSec)=50KHz (10μSec για "H" και 10μSec για "L"), ενώ με απλή χρήση TIMER αυτοί οι χρόνοι θα ήταν πολλαπλάσιοι.

Αναφέρω τις εναλλακτικές μεθόδους χρονισμού:

1. TIMER και INTERRUPTS
Απλό στη χρήση με ελάχιστο χρόνο μεταξύ interrupts 256 κύκλους μηχανής (cycle times). Για εσωτερικό ταλαντωτή 4MHz έχουμε 1ct=1μSec που δίνει χρήσιμο συγχρονισμό κάθε 256μSec (3.9KHz).

2. Διαρκή επαναρύθμιση του TIMER με INTERRUPTS
Μετρώντας τις εντολές που εκτελούνται για τη ρύθμιση του παλμού, μπορούμε να "φορτώνουμε" τον TIMER με νέα τιμή για να ελαττώσουμε τον χρόνο μεταξύ δυο interrups. Εδω πρέπει να υπολογίσουμε και την εκτέλεση των απαιτούμενων εντολών CALL/RETURN του interrupt όπως και το χρόνο εκτέλεσης των εντολών αποθήκευσης βασικών καταχωρητών.

3. Διαρκής έλεγχος της τιμής του TIMER χωρίς interrupts
Αντί να ρυθμίζουμε τον TIMER, ελέγχουμε την τρέχουσα τιμή του πλήρως ή σε επίπεδο bit. Ο χρονισμός μπορεί να γίνει σε βραχύτερα διαστήματα με μικρή επιβάρυνση λόγω εντολών σύγκρισης/ελέγχου τιμής.

4. Απλοί συγχρονισμένοι και επαναλαμβανόμενοι βρόχοι
Γράφουμε και ρυθμίζουμε τον κώδικα για συγχρονισμένη εκτέλεση. Αν χρειαστεί προσθέτουμε εντολές NOP για τον συγχρονισμό και επαναλαμβάνουμε πολλές φορές τμήμα του κώδικα αντί να χρησιμοποιήσουμε επιπλέον βρόχους (loops).



Συνεχίζεται ...
SeAfasia
Δημοσιεύσεις: 160
Εγγραφή: 27 Ιούλ 2015, 22:13
Ονομα: Ντίνος

Re: PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Δημοσίευση από SeAfasia »

Γιώργο,μια χαρά περιμένω τη συνέχεια...μια ερώτηση:
ο C4 των 100nf είναι αναγκαίος;
Άβαταρ μέλους
GeorgeVita
Διαχειριστής
Δημοσιεύσεις: 624
Εγγραφή: 04 Σεπ 2013, 21:51
Ονομα: Γιώργος
Επικοινωνία:

Re: PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Δημοσίευση από GeorgeVita »

Γειά σου Κώστα,
σχεδιαστικά δείχνω τον C4 ως πυκνωτή απόζευξης του μC. Αν παρέλειπα κάποιον θα ήταν ο C2 που βρίσκεται κοντά στον σταθεροποιητή.
Επίσης στην έξοδο δείχνω μόνο 2 αντιστάσεις για οδήγηση εξωτερικού κυκλώματος όπου ανάλογα με το "τι θα οδηγείται" πρέπει να προσεχθεί η καθυστέρηση στα μέτωπα H>L>H.
SeAfasia
Δημοσιεύσεις: 160
Εγγραφή: 27 Ιούλ 2015, 22:13
Ονομα: Ντίνος

Re: PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Δημοσίευση από SeAfasia »

σωστά,
άστον δεν υπάρχει λόγος να βγεί....περιμένω τη συνέχεια με ενδιαφέρων..
Άβαταρ μέλους
GeorgeVita
Διαχειριστής
Δημοσιεύσεις: 624
Εγγραφή: 04 Σεπ 2013, 21:51
Ονομα: Γιώργος
Επικοινωνία:

Re: PIC555, γεννήτρια PWM (ιδέα εκπαιδευτικής εφαρμογής)

Δημοσίευση από GeorgeVita »

Γενικός ταλαντωτής συστήματος
Τελικά, μετά από λίγες δοκιμές, συμπέρανα ότι και ο μικροεπεξεργαστής θέλει τον "αναλογικό" ταλαντωτή του! Εδώ, με τον όρο "αναλογικό" αναφέρομαι στη γραμμική ρύθμιση συχνότητας που είναι αδύνατο να πραγματοποιηθεί μέσω προγράμματος μετρώντας απλά την αναλογική τάση στο ποτενσιόμετρο P5. Τα 10 bits του A/D μαζί με τις ελάχιστες εντολές για την επεξεργασία τους θα έδιναν ρύθμιση συχνότητας σε μεγάλα βήματα.

Αντίθετα, αν χρησιμοποιήσουμε τον ταλαντωτή RC του μικροεπεξεργαστή, μπορούμε άνετα να "συντονιστούμε γραμμικά" σε μια κλίμακα 1-10. Με τις τιμές υλικών του παρακάτω κυκλώματος, περιστρέφοντας το ποτενσιόμετρο P5 ο PIC12F675 ταλαντώνει σε συχνότητες 400KHz-4MHz. Εδώ υπάρχουν κάποια σχεδιαστικά προβλήματα λόγω υψηλής συχνότητας στο ποτενσιόμετρο, οι αποστάσεις των συνδέσεων, ο τύπος των εξαρτημάτων και η μορφή της τελικής πλακέτας θα αλλοιώσουν το εύρος και τα όρια της ταλάντωσης κάτι που μπορεί να διορθωθεί αλλάζοντας τιμή στον C5 ή/και την R5. Σημειώνω πάλι ότι αναφερόμαστε σε "ιδέα εκπαιδευτικής εφαρμογής".

Εικόνα


Κλίμακα 100KHz-1MHz
Η έξοδος Qmax είναι στην ουσία η έξοδος CLKOUT με συχνότητα αυτή του εσωτερικού ταλαντωτή διαιρεμένη διά 4. Στο PIC12F675 το CLOCKOUT ενεργοποιείται κατά τον προγραμματισμό και λειτουργεί πάντα ανεξάρτητα από το πρόγραμμα χωρίς δυνατότητα άλλης χρήσης. Αυτή θα είναι
η "έξοδος 100KHz-1MHz με σταθερό dutycycle=50%". Για τις υπόλοιπες κλίμακες θα χρησιμοποιηθεί η έξοδος "Qout" από το pin5.


Επιλογή κλίμακας στρέφοντας το ποτενσιόμετρο P3
Ο δρομέας του P3 έχει τάση 0-5V ανάλογα με τη θέση περιστροφής του. Αυτή την τάση τη μετράμε με τον εσωτερικό μετατροπέα A/D (pin7 AN0) με ανάλυση 10bits. Ο PIC12F675 δίνει τη δυνατότητα να επεξεργαστούμε αυτά τα 10 bits τοποθετημένα σε 2 bytes και στοιχισμένα αριστερά (LSET) ή δεξιά (RSET) στους καταχωρητές ADRESH και ADRESL. Επειδή μέσω του ποτενσιομέτρου θα επιλέξουμε μόνο 6 σημεία/κλίμακες δεν ενδιαφερόμαστε για μεγάλη ακρίβεια θα διαβάζουμε με LSET τα 8 πιο σημαντικά ψηφία από τον καταχωρητή ADRESH (τιμές 00h-FFh). Οι δυο ακραίες θέσεις (00h και FFh) καθορίζουν τις ακραίες κλίμακες και οι υπόλοιπες τιμές σε βήματα των 63-64bits θα καθορίσουν τις 4 ενδιάμεσες.

Ο κώδικας επιλογής κλίμακας από τη θέση του ποτενσιομέτρου χρησιμοποιεί την μέτρηση που αποθηκεύσαμε στον καταχωρητή "range":

Κώδικας: Επιλογή όλων

; Επιλογή κλίμακας με βάση τη θέση του ποτενσιομέτρου P3
; δρομολόγηση προγράμματος ανάλογα με την τιμή του "range"
      movfw     range
      addlw     0x01
      skpnc
      goto      RANGE_100K	; 10K-100K 0xFF
      addlw     0x3F
      skpnc
      goto      RANGE_10K	; 1K-10K 0xFE-0xC0
      addlw     0x40
      skpnc
      goto      RANGE_1K	; 100-1K 0xBF-0x80
      addlw     0x40
      skpnc
      goto      RANGE_100	; 10-100 0x7F-0x40
      addlw     0x3F
      skpnc
      goto      RANGE_10	; 1-10 0x3F-0x01
      goto      RANGE_1		; 0.1-1 0x00
Κλίμακα 10-100KHz
Στην υλοποίηση της επόμενης κλίμακας των 10-100KHz αρχίζουν τα δύσκολα για το πρόγραμμα! Με τον γραμμικά μεταβαλλόμενο ταλαντωτή RC, η παραγωγή των παλμών εξόδου μπορεί να γίνει μόνο με διαίρεση συχνότητας (απαρίθμηση εντολών). Σε αυτή την κλίμακα η συχνότητα εξόδου θα είναι το 1/10 του CLKOUT οπότε έχουμε στη διάθεσή μας μόνο 10 κύκλους εντολών για μια περίοδο! Σίγουρα θα έχουμε πάλι σταθερό dutycycle=50% και στο ενδιάμεσο θα ελέγχουμε το ποτενσιόμετρο αλλαγής κλίμακας (range) για νέες τιμές. Στις χαμηλότερες κλίμακες κάθε περίοδος θα διαρκεί όσο 100, 1000, 10000 κύκλοι εντολών οπότε θα κάνουμε και κάποιες ρυθμίσεις...

Λοιπόν, σε 10 εντολές πρέπει να ελέγξουμε την έξοδο Qout (H/L), να μετρήσουμε την τάση στο ποτενσιόμετρο P3 και να αλλάξουμε κλίμακα αν χρειαστεί (δεν φαίνονται οι εντολές αρχικοποίησης ούτε οι επόμενες κλίμακες):

Κώδικας: Επιλογή όλων

RANGE_100K                     ; κύκλοι εντολών, σχολιασμός
      bsf       Qout           ; 0/10 Qout=H
      incfsz    rangenow,W     ; 1    έλεγχος αν το P3 ήταν στη μέγιστη θέση
      goto      Main           ; 2    αλλαγή ροής προγράμματος λόγω νέας κλίμακας
      movfw     ADRESH         ; 3    διαβάζουμε τη νέα μέτρηση του P3
      movwf     rangenow       ; 4    και την αποθηκεύουμε
      bcf       Qout           ; 5    Qout=L
      bsf       ADCON0,GO	   ; 6    εκκίνηση επόμενης μέτρησης
      nop                      ; 7    τελικά περίσσεψε μια εντολή
      goto      RANGE_100K     ; 8,9  πάλι από την αρχή!
Απάντηση

Επιστροφή στο “Μικροεπεξεργαστές”