Εισαγωγή στο Προγραμματισμό με τη PASCAL & τη Matlab Εξαμηνιαία Εργασία 2014 Μετατρέποντας AC σε DC Τάση Μέρος Β : Πορεία Εργασίας. Συναρτήσεις στη PASCAL Σκοπός Προσομοίωση ενός Συστήματος / Κυκλώματος, μέσα από ένα Πρόγραμμα Μηχανές Καταστάσεων (State Machines) Δομές προγραμματισμού: Οι δομές Ε- πιλογής & Επανάληψης. Το Κύκλωμα Ανόρθωσης Τάσης & η Προσομοίωση & Ανάλυσή του, μέσα από ένα Πρόγραμμα 1
ΤΑ ΒΗΜΑΤΑ ΣΤΗΝ ΕΚΤΕΛΕΣΗ ΤΗΣ ΕΞΑΜΗΝΙΑΙΑΣ Στο Α μέρος της εργασίας, διατυπώσαμε το πρόβλημα τη μετατροπή εναλλασσόμενης σε συνεχή τάση, αναλύσαμε τη λειτουργία του κυκλώματος ανόρθωσης και αναπτύξαμε πως θα μπορούσαμε να προσομοιώσουμε το κύκλωμα, μέσα από ένα πρόγραμμα. Σ αυτό το μέρος, περιγράφονται ένα ένα, τα βήματα που χρειάζεται να ακολουθήσουμε, για να γράψουμε το πρόγραμμα που προσομοιώνει τη λειτουργία του κυκλώματος ανόρθωσης τάσης. Αν ακόμα, δεν έχετε εγκαταστήσει τη PASCAL, στον υπολογιστή σας, τότε ξεκινήστε, εγκαθιστώντας στον υπολογιστή σας, οποιοδήποτε από τα δύο περιβάλλοντα ανάπτυξης προγραμμάτων στη PASCAL που έχουμε χρησιμοποιήσει στο εργαστήριο, δηλαδή είτε τη Lazarus PASCAL ή τη Dev-Pascal. Το Lazarus είναι πολύ καλύτερο και πιο σύγχρονο περιβάλλον από τη Dev-Pascal, όμως η εργασία μπορεί να γίνει και στη Dev-Pascal. H Dev-Pascal είναι στη σελίδα του εργαστηρίου, στο eclass, στο κατάλογο Έγγραφα Pascal Compiler Downloads. Μπορείτε να τη κατεβάσετε από εκεί και πολύ εύκολα να την εγκαταστήσετε στον υπολογιστή σας. Η Lazarus Pascal δεν είναι στο eclass, όμως το ίδιο εύκολα μπορείτε να τη κατεβάσετε από το διαδίκτυο, από την ιστοσελίδα της Lazarus Pascal και να την εγκαταστήσετε στον υπολογιστή σας, ακολουθώντας τις απλές οδηγίες που είναι στο eclass, στο κατάλογο Έγγραφα Lazarus Pascal. [2 Μονάδες] Εφόσον έχετε εγκαταστήσει στον υπολογιστή σας, είτε τη Lazarus Pascal ή τη Dev-Pascal, ανοίξτε όποιο από τα δύο αυτά περιβάλλοντα. Στη Lazarus Pascal, δημιουργήστε ένα καινούργιο πρόγραμμα, χρησιμοποιώντας την εντολή File New Στο πλαίσιο διαλόγου που ανοίγει, πατήστε στην επιλογή Program (Εικόνα 1). Αν έχετε τη Dev-Pascal, επιλέξετε την εντολή File New Project, για να δημιουργήσετε ένα καινούργιο πρόγραμμα, στο περιβάλλον της Dev-Pascal. Στο πλαίσιο διαλόγου που ανοίγει τότε, πατήστε στην επιλογή Console Application, πληκτρολογήστε ένα όνομα, έστω το όνομα AC_to_DC, για το πρόγραμμα που θα δημιουργήσετε και επιλέξτε το φάκελο, όπου θα αποθηκεύσετε αυτό το πρόγραμμα, στο σύστημα αρχείων, στον υπολογιστή σας. Στο παράθυρο του προγράμματος που ανοίγει με την εντολή File New Program (στη Lazarus Pascal) ή την εντολή File New project Console Application (Dev-Pascal), απλά, κάνετε αντιγραφή επικόλληση του προγράμματος που προσομοιώνει τη λειτουργία της διόδου, σ ένα κύκλωμα και είναι στο ΠΑΡΑΡ- ΤΗΜΑ Α, στο τέλος αυτών των σημειώσεων (σελ. 15 16 ) (Εικόνα 2). Μπορείτε να κατεβάσετε αυτό το πρόγραμμα και από το eclass. Είναι στο φάκελο της εξαμηνιαίας εργασίας, στο eclass. Αν το κατεβάσετε από το eclass, μπορείτε μετά, να το ανοίξετε απευθείας στο Lazarus ή στη Dev-Pascal. 2
Εικόνα 1: Για το πρόγραμμα της εξαμηνιαίας εργασίας, αλλά και γενικά, κάθε φορά που θέλουμε να δημιουργήσουμε ένα καινούργιο πρόγραμμα στη Pascal, πρώτα, ανοίγουμε ένα καινούργιο αρχείο παράθυρο στο Lazarus, εκτελώντας την εντολή File New Program. Στη Dev-Pascal, δημιουργούμε ένα καινούργιο πρόγραμμα, ακολουθώντας μία ανάλογη διαδικασία. 3
Εικόνα 2: Στο παράθυρο ενός καινούργιου προγράμματος στο Lazarus ή στη Dev-Pascal, κάνουμε αντιγραφή επικόλληση του προγράμματος στο ΠΑΡΑΡΤΗΜΑ Α του θεωρητικού μέρους της εργασίας που προσομοιώνει το απλό κύκλωμα ανόρθωσης, από μία δίοδο. 4
Εικόνα 3α: Κατά την εκτέλεση του προγράμματος. χρειάζεται να πληκτρολογήσουμε το χρόνο προσομοίωσης, δηλαδή τη συνολική χρονική διάρκεια της AC τάσης στο κύκλωμα, το πλάτος (V 0 ) και τη συχνότητα (f) αυτής της τάσης, για να μετατρέψει το πρόγραμμα αυτή τη τάση, σε συνεχή. 5
Εικόνα 3β: Αποτελέσματα, από την εκτέλεση του προγράμματος. Στη βάση των τιμών που πληκτρολογούμε, για το χρόνο προσομοίωσης, το πλάτος (V 0 ) και τη συχνότητα (f) της AC τάσης στο κύκλωμα, το πρόγραμμα υπολογίζει την AC τάση (Vin) και τη τάση εξόδου (Vout), στο απλό κύκλωμα της διόδου, όπως καθορίζεται από τις εντολές του προγράμματος. ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ ΝΑ ΞΑΝΑΓΡΑΨΕΤΕ ΑΥΤΟ ΤΟ ΠΡΟΓΡΑΜΜΑ. Απλά, κάνετε αντιγραφή επικόλληση του προγράμματος από το ΠΑΡΑΡΤΗΜΑ Α, όπου υπάρχει ολόκληρο το πρόγραμμα, σ ένα καινούργιο πρόγραμμα που δημιουργείτε στo Lazarus ή στη Dev-Pascal (Εικόνα 2). Αφού κάνετε αντιγραφή επικόλληση του προγράμματος στο Lazarus ή στη Dev- Pascal, κάνετε compile (μεταγλώττιση) αυτό το πρόγραμμα, για να βρείτε και να διορθώσετε συντακτικά λάθη, αν υπάρχουν και μετά, εκτελέστε (Εντολή Run) το πρόγραμμα με τα παρακάτω δεδομένα: Χρόνος προσομοίωσης σε sec: 0.1 Amplitude (Πλάτος V 0 της AC τάσης σε Volts): 5 Frequency (Συχνότητα της AC τάσης σε Hz): 50 Δώστε / πληκτρολογήστε αυτά τα δεδομένα, κατά την εκτέλεση του προγράμματος, όπως παριστάνεται στην Εικόνα 3α. Χρησιμοποιείστε την εντολή Print Screen (PrtSc), στον υπολογιστή σας, για να αντιγράψτε την οθόνη των αποτελεσμάτων που δίνει το πρόγραμμα (Εικόνα 3β). Ανοίξτε ένα καινούργιο αρχείο Word και κάνετε επικόλληση των αποτελεσμάτων του προγράμματος, σ αυτό το αρχείο. Σχολιάστε, σε δύο-τρείς γραμμές τα αποτελέσματα. Πως αυτά συγκρίνονται με τα αποτελέσματα τη τάση που θα παίρναμε στην έξοδο, αν δημιουργούσαμε το πραγματικό κύκλωμα της διόδου? 6
Εικόνα 4: Αν παραστήσουμε γραφικά τα αποτελέσματα του προγράμματος, δηλαδή τις τιμές t, V in και V out που υπολογίζει το πρόγραμμα, τότε θα πάρουμε τα παραπάνω γραφήματα που αναπαριστάνουν ακριβώς τη λειτουργία της διόδου, σ ένα κύκλωμα ε- ναλλασσόμενου ρεύματος. Παρατήρηση. Το πρόγραμμα υπολογίζει τη τάση εισόδου V in και τη τάση εξόδου V out, σε διακριτές χρονικές στιγμές t = 0, Δt, 2 Δt, 3 Δt, 4 Δt,, στο απλό κύκλωμα ανόρθωσης που αποτελείται από μία δίοδο, Αν παραστήσουμε γραφικά τις τιμές V in και V out που παίρνουμε από το πρόγραμμα, τότε θα πάρουμε τα γραφήματα στην Εικόνα 4. Η γραφική παράσταση των αποτελεσμάτων από το πρόγραμμα,, στην Εικόνα 4, δείχνει πως το πρόγραμμα προσομοιώνει / αναπαριστάνει τη λειτουργία της διόδου, σ ένα πραγματικό AC κύκλωμα, αναπαράγοντας στην έξοδο τα θετικά τμήματα της V in και αποκόπτοντας τα αρνητικά τμήματα, δημιουργώντας τάση στην έ- ξοδο V out = 0, όταν η εναλλασσόμενη τάση στην είσοδο, είναι αρνητική (V in 0). [2 Μονάδες] Τροποποιείστε το πρόγραμμα που εκτελέσατε στο Βήμα 2, γράφοντας μία συνάρτηση στη PASCAL που να υπολογίζει τη τάση εξόδου V out από τη τάση εισόδου V in. Αυτή η συνάρτηση θα καλείται από το κυρίως πρόγραμμα με μία παράμετρο, τη μεταβλητή V in και θα υπολογίζει και θα επιστρέφει στο κυρίως πρόγραμμα, τη τιμή της τάσης 7
Εικόνα 5: Οι αλλαγές που χρειάζεται να κάνουμε στο πρόγραμμα του απλού κυκλώματος ανόρθωσης, για να υπολογίζουμε τη τάση εξόδου Vout, από τη τάση εισόδου Vin, χρησιμοποιώντας μία συνάρτηση, τη Voutput.. 8
εξόδου V ou (Εικόνα 5). Ο ορισμός / η επικεφαλίδα της συνάρτησης μπορεί να είναι όπως παρακάτω: function Voutput (Vin : real) : real; Γράψτε τις εντολές / το κώδικα αυτής της συνάρτησης, ώστε να υπολογίζει τη V out από τη V in. Χρησιμοποιείστε αυτή τη συνάρτηση στο πρόγραμμα του Βήματος 2, για να υπολογίσετε τη V out, αντί των εντολών που χρησιμοποιήσαμε στο πρόγραμμα του Βήματος 2, για αυτή τη λειτουργία (Εικόνα 5). [2 Μονάδες] Τροποποιείστε το πρόγραμμα του Βήματος 3, γράφοντας / χρησιμοποιώντας δύο συναρτήσεις, αντί για μία. Η πρώτη από τις δύο αυτές συνάρτηση θα υπολογίζει και θα επιστρέφει στο κυρίως πρόγραμμα τη τιμή της V out, όταν η V in είναι θετική, ενώ η δεύτερη συνάρτηση θα υπολογίζει τη τάση εξόδου V out, όταν η V in είναι αρνητική ή μηδέν (Εικόνα 6). Οι δύο αυτές συναρτήσεις μπορεί να ορίζονται ως εξής: function Positive_Vin (V0, omega, t, dt : real) : real; function Negative_Vin (V0, omega, t, dt : real) : real; Καθεμία από τις δύο αυτές συναρτήσεις θα έχει τέσσερεις παραμέτρους: το πλάτος V 0, τη γωνιακή ταχύτητα ω της εναλλασσόμενης τάσης, το χρόνο t και το διάστημα dt ανάμεσα σε διαδοχικές τιμές της AC τάσης V in.. Το κυρίως πρόγραμμα θα καλεί τη πρώτη συνάρτηση, τη Positive_Vin, τη χρονική στιγμή t που η τάση εισόδου V in γίνεται θετική, για να υπολογίζει τη V out, όσο η V in είναι θετική και θα επιστρέφει στο κυρίως πρόγραμμα τη τιμή του χρόνου t που η V in, από θετική, γίνεται αρνητική. Η δεύτερη συνάρτηση, η Negative_Vin, θα χρησιμοποιείται από το κυρίως πρόγραμμα, όταν η τάση εισόδου V in, από θετική γίνεται αρνητική, για να υπολογίζει τη V out, όσο η V in παίρνει αρνητικές τιμές. Η Negative_Vin θα υπολογίζει και θα εκτυπώνει τη τάση εξόδου V out, όσο η V in παίρνει αρνητικές τιμές και θα επιστρέφει στο κυρίως πρόγραμμα τη τιμή του χρόνου t, όταν η V in γίνεται και πάλι θετική. Το κυρίως πρόγραμμα θα καλεί εναλλακτικά τις Positive_Vin και Negative_Vin, για να υπολογίζουν τη V out, για τα θετικά και τα αρνητικά διαστήματα της V in, αντίστοιχα, σε διακριτές χρονικές στιγμές t = 0, Δt, 2 Δt, 3 Δt, 4 Δt,, μέχρι τη χρονική στιγμή t = n Δt που θα είναι ίση ή μεγαλύτερη του χρόνου προσομοίωσης του κυκλώματος (Εικόνα 6). [4 Μονάδες] Τροποποιείστε το πρόγραμμα του Βήματος 4, ώστε να υπολογίζει την τάση εξόδου, στο κύκλωμα ανόρθωσης τάσης της Εικόνας 7 που εκτός από τη δίοδο, περιλαμβάνει και ένα πυκνωτή. 9
Εικόνα 6: To πρόγραμμα του απλού κυκλώματος ανόρθωσης, χρησιμοποιώντας τις συναρτήσεις Positive_Vin() και Negative_Vin().. 10
Εικόνα 7: Το κύκλωμα ανόρθωσης τάσης.η δίοδος επιτρέπει το ρεύμα I, από τη πηγή, όταν αυτό έχει θετική φορά (α) και το διακόπτει, όταν έχει αρνητική φορά (β). Στη μία κατάσταση (α), η τάση V out στην έξοδο του κυκλώματος είναι απλά ίση με την τάση V in, στην είσοδο. Στην άλλη κατάσταση (β), η τάση V out στην έξοδο του κυκλώματος, είναι η τάση εκφόρτισης V εκφόρτισης του πυκνωτή. Στο θεωρητικό μέρος της εργασίας, αναλύσαμε τη λειτουργία / τη συμπεριφορά του κυκλώματος ανόρθωσης τάσης που παριστάνεται στην Εικόνα 7. Σ αυτή την ανάλυση, είδαμε πως καθώς το ρεύμα I από τη πηγή, αλλάζει φορά, από θετική σε αρνητική ή αρνητική σε θετική, η δίοδος διακόπτει και επιτρέπει, αντίστοιχα, αυτό το ρεύμα στο κύκλωμα. Έτσι, το κύκλωμα εναλλάσσεται ανάμεσα σε δύο καταστάσεις. Στη μία κατάσταση, το ρεύμα Ι της πηγής έχει θετική φορά και η δίοδος επιτρέπει αυτό το ρεύμα, στο κύκλωμα. Τότε, η τάση V out στην έξοδο του κυκλώματος είναι ίση με τη τάση V in της πηγής (V out = V in ). Όταν το ρεύμα Ι της πηγής γίνεται αρνητικό, όταν δηλαδή: I = I C + I R 0 όπου, I R + I C 0 I R I C I R = V 0 cos(ω t) / R και I C = ω C V 0 cos(ω t + 90 ) τότε, η δίοδος διακόπτει τη ροή αυτού του ρεύματος στο κύκλωμα. Το κύκλωμα μεταπηδάει στη δεύτερη κατάσταση, όπου ο πυκνωτής που έχει φορτιστεί έχει αποθηκεύσει ηλεκτρική ενέργεια στους οπλισμούς του, όσο κυκλοφορούσε ρεύμα από τη πηγή, στο κύκλωμα, αποδίδει πίσω στο κύκλωμα αυτή την ενέργεια, δημιουργώντας ένα ρεύμα και μία τάση στην έξοδο που είναι: 11
Vout = V εκφόρτισης = V 0 cos(ω t A ) e (t ta) / RC όπου t A είναι η χρονική στιγμή που το ρεύμα I R γίνεται ίσο με την αρνητική τιμή του ρεύματος I C της πηγής, μέσα από το πυκνωτή (I R = I C ). Σ αυτή τη κατάσταση, το κύκλωμα θα μείνει, μέχρις ότου η τάση V in από τη πηγή γίνει μεγαλύτερη ή ίση της τάσης αποφόρτισης του πυκνωτή, δηλαδή μέχρι: V in V C V 0 cos(ω t) V 0 cos(ω t A ) e (t ta) / RC οπότε το κύκλωμα θα επανέλθει στη πρώτη κατάσταση, όπου η δίοδος επιτρέπει πάλι το ρεύμα από τη πηγή και V out = V in. Η εναλλαγή του κυκλώματος ανάμεσα στις δύο καταστάσεις περιγράφεται μαθηματικά από την εξίσωση: Ένα πρόγραμμα, για να προσομοιώνει τη λειτουργία του κυκλώματος ανόρθωσης, στην Εικόνα 7, πολύ απλά, χρειάζεται να υπολογίζει τη τάση εξόδου V out, στη βάση της παραπάνω εξίσωσης Η μορφή και η λειτουργία του προγράμματος είναι πολύ παρόμοια με αυτή του προγράμματος που γράψαμε και χρησιμοποιήσαμε στα προηγούμενα βήματα, για να προσομοιώσουμε το απλό κύκλωμα της διόδου. Χρειάζεται μόνον να τροποποιήσουμε / να αντικαταστήσουμε τις συναρτήσεις Positive_Vin() και Negative_Vin() που γράψαμε στο Βήμα 4, με δύο νέες, αντίστοιχες συναρτήσεις: fumction Positive_Iin (V0, omega, t, dt, R, C : real) : real; function Negative_Iin(V0, omega, t, dt, R, C : real) : real; Οι δύο αυτές συναρτήσεις αντιστοιχούν στις δύο καταστάσεις του κυκλώματος ανόρθωσης. H Positive_Iin() υπολογίζει τη τάση εξόδου V out στη κατάσταση που η δίοδος επιτρέπει το ρεύμα από τη πηγή, στο κύκλωμα και η τάση στην έξοδο είναι απλά η τάση εισόδου (V out = V in ). Η δεύτερη συνάρτηση, η Negative_Iin() υπολογίζει τη τάση εξόδου V out στη κατάσταση που η δίοδος διακόπτει το ρεύμα από τη πηγή και η τάση στην έξοδο καθορίζεται / υπολογίζεται από τη τάση εκφόρτισης του πυκνωτή (V out = V εκφόρτισης ). Όπως το πραγματικό κύκλωμα ανόρθωσης της Εικόνας 7 που διαρκώς εναλλάσσεται ανάμεσα σε δύο καταστάσεις (Εικόνα 7), έτσι και το πρόγραμμα αυτού του βήματος, προσομοιώνει τη λειτουργία, αλλά και την εναλλαγή του πραγματικού 12
Εικόνα 8: Το πρόγραμμα που προσομοιώνει τη λειτουργία του κυκλώματος ανόρθωσης. Η γενική μορφή του προγράμματος είναι ή ίδια με αυτή του προγράμματος, στα προηγούμενα βήματα που προσομοιώνει το απλό κύκλωμα της διόδου. Αλλάζουν μόνον οι συναρτήσεις Positive_Iin() και Negative_Iin() που χρησιμοποιούμε, για να υπολογίζουμε τη V out, στις δύο καταστάσεις του κυκλώματος. 13
κυκλώματος ανόρθωσης, ανάμεσα σε δύο καταστάσεις, καλώντας δύο συναρτήσεις, τη Positive_Iin(), για να υπολογίζει την έξοδο, όταν η δίοδος επιτρέπει το ρεύμα από τη πηγή, στο κύκλωμα και τη Negative_Iin(), για να υπολογίζει τη τάση στην έξοδο, όταν η δίοδος διακόπτει αυτό το ρεύμα (Εικόνα 8). Για κάθε συνάρτηση τη Positive_Iin() και τη Negative_Iin() εκτός από το τύπο που θα χρησιμοποιήσετε σ αυτή, για να υπολογίζει τη V out, χρειάζεται να προσδιορίσετε και να προγραμματίσετε τη συνθήκη που καθορίζει πότε αυτή η συνάρτηση θα τερματίζεται και το πρόγραμμα θα καλεί την άλλη συνάρτηση (Εικόνα 8), προσομοιώνοντας με τη μετάβαση από τη μία συνάρτηση στην άλλη, τη μετάβαση του πραγματικού κυκλώματος από τη μία κατάσταση στην άλλη. 14
ΠΑΡΑΡΤΗΜΑ Α ΤΟ ΠΡΟΓΡΑΜΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΤΟΥ ΑΠΛΟΥ ΚΥΚΛΩΜΑΤΟΣ ΔΙΟΔΟΥ program AC_to_DC; const pi = 3.14; var Simulation_time, V0, f, t : real; omega, Period, dt : real; Vin, Vout : real; begin write('dwse to xrono Prosomoiwshs [sec]:'); readln(simulation_time); write('dwse to platos (V0) ths AC tashs [Volts]:'); readln(v0); write('dwse th syxnothta (f) ths AC tashs [Hz]:'); readln(f); Period := 1 / f; omega := 2 * pi * f; dt := Period / 20.; (* Διάστημα ανάμεσα στο οποίο υπολογίζουμε διαδοχικές τιμές της τάσης Vin της πηγής *) t := 0; writeln(' t ', 'Vin ', 'Vout '); writeln(); while ( t <= Simulation_time ) do begin (* Αρχή της επανάληψης και της προσομοίωσης *) Vin := V0 * cos (omega*t); if ( Vin > 0 ) then Vout := Vin 15
else Vout := 0; writeln(t:6:3, ' ', Vin:5:2, ' ', Vout:5:2); t := t + dt end; (* Τέλος της επανάληψης και της προσομοίωσης *) readln() end. 16