- Τι είναι μια γεννήτρια λειτουργιών DDS;
- Κατανοήστε τη λειτουργία του AD9833 Function Generator IC
- Απαιτούνται στοιχεία για τη δημιουργία της γεννήτριας λειτουργίας με βάση το AD9833
- Γεννήτρια λειτουργιών βάσει9898 - Σχηματικό διάγραμμα
- Γεννήτρια λειτουργιών βάσει του AD9833 - Κωδικός Arduino
- Δοκιμή της γεννήτριας λειτουργίας με βάση το AD9833
- Περαιτέρω βελτιώσεις
Αν είστε λάτρεις των ηλεκτρονικών συστημάτων όπως εγώ που θέλει να αλλάξει με διαφορετικά ηλεκτρονικά κυκλώματα, η ύπαρξη μιας αξιοπρεπούς γεννήτριας λειτουργίας είναι μερικές φορές υποχρεωτική. Όμως, η κατοχή ενός είναι πρόβλημα, επειδή αυτός ο βασικός εξοπλισμός μπορεί να κοστίσει μια περιουσία. Η κατασκευή του δικού σας εξοπλισμού δοκιμών δεν είναι μόνο φθηνότερη αλλά και ένας πολύ καλός τρόπος για να βελτιώσετε τις γνώσεις σας.
Έτσι, σε αυτό το άρθρο, πρόκειται να οικοδομήσουμε μια απλή Γεννήτρια Σήματος με Arduino και AD9833 DDS Function Generator Module που μπορεί να παράγει κύματα ημιτονοειδούς, τετραγώνου και τριγώνου με μέγιστη συχνότητα 12 MHz στην έξοδο. Και τέλος, θα δοκιμάσουμε τη συχνότητα εξόδου με τη βοήθεια του παλμογράφου μας.
Έχουμε δημιουργήσει προηγουμένως μια γεννήτρια Simple Sine Wave, μια γεννήτρια τετραγωνικών κυμάτων και μια γεννήτρια τριγώνων κυμάτων με τη βοήθεια βασικών αναλογικών κυκλωμάτων. Μπορείτε να τα ελέγξετε αν ψάχνετε για ορισμένα βασικά κυκλώματα γεννήτριας κυματομορφής. Επίσης, εάν θέλετε να δημιουργήσετε μια φθηνότερη γεννήτρια λειτουργιών Arduino χωρίς να χρησιμοποιήσετε τη μονάδα AD9833, μπορείτε να δείτε το έργο DIY Arduino Waveform Generator.
Τι είναι μια γεννήτρια λειτουργιών DDS;
Όπως υποδηλώνει το όνομα, μια γεννήτρια λειτουργιών είναι μια συσκευή που μπορεί να εξάγει μια συγκεκριμένη κυματομορφή με συγκεκριμένη συχνότητα κατά τη ρύθμιση. Για παράδειγμα, θεωρήστε ότι έχετε ένα φίλτρο LC για το οποίο θέλετε να ελέγξετε την απόκριση συχνότητας εξόδου, μπορείτε εύκολα να το κάνετε με τη βοήθεια μιας γεννήτριας λειτουργίας. Το μόνο που χρειάζεται να κάνετε είναι να ορίσετε την επιθυμητή συχνότητα εξόδου και κυματομορφή και, στη συνέχεια, μπορείτε να τη στρέψετε προς τα κάτω ή προς τα πάνω για να ελέγξετε την απόκριση. Αυτό ήταν μόνο ένα παράδειγμα, μπορείτε να κάνετε περισσότερα πράγματα μαζί του καθώς η λίστα συνεχίζεται.
Το DDS σημαίνει Direct Digital Synthesis. Είναι ένας τύπος γεννήτριας κυματομορφής που χρησιμοποιεί μετατροπείς ψηφιακού σε αναλογικό (DAC) για τη δημιουργία σήματος από την αρχή προς τα πάνω. Αυτή η μέθοδος χρησιμοποιείται ειδικά για τη δημιουργία ημιτονοειδούς κύματος. Αλλά το IC που χρησιμοποιούμε μπορεί να παράγει σήματα τετραγώνων ή τριγωνικών κυμάτων. Οι λειτουργίες που έγιναν μέσα σε ένα τσιπ DDS είναι ψηφιακές, ώστε να αλλάζει τη συχνότητα πολύ γρήγορα ή μπορεί να αλλάζει από το ένα σήμα στο άλλο πολύ γρήγορα. Αυτή η συσκευή έχει ανάλυση υψηλής συχνότητας με ευρύ φάσμα συχνοτήτων.
Κατανοήστε τη λειτουργία του AD9833 Function Generator IC
Στην καρδιά του έργου μας βρίσκεται το AD9833 Programmable Waveform Generator IC που έχει σχεδιαστεί και αναπτυχθεί από αναλογικές συσκευές. Είναι μια γεννήτρια χαμηλής ισχύος, προγραμματιζόμενη κυματομορφή ικανή να παράγει ημιτονοειδές, τριγωνικό και τετραγωνικό κύμα με μέγιστη συχνότητα 12 MHz. Είναι ένα πολύ μοναδικό IC που μπορεί να αλλάξει τη συχνότητα και τη φάση εξόδου μόνο με ένα πρόγραμμα λογισμικού. Διαθέτει διεπαφή SPI 3 καλωδίων, γι 'αυτό η επικοινωνία με αυτό το IC γίνεται πολύ απλή και εύκολη. Το λειτουργικό διάγραμμα μπλοκ αυτού του IC φαίνεται παρακάτω.
Η λειτουργία αυτού του IC είναι πολύ απλή. Εάν ρίξουμε μια ματιά στο λειτουργικό διάγραμμα μπλοκ παραπάνω, θα παρατηρήσουμε ότι έχουμε ένα Phase Accumulator του οποίου δουλειά είναι να αποθηκεύουμε όλες τις πιθανές ψηφιακές τιμές ενός ημιτονοειδούς κύματος, ξεκινώντας από 0 έως 2π. Στη συνέχεια, έχουμε το SIN ROM του οποίου η δουλειά είναι να μετατρέψει τις πληροφορίες φάσης που μπορούν αργότερα να χαρτογραφηθούν άμεσα σε πλάτος. Το SIN ROM χρησιμοποιεί τις πληροφορίες ψηφιακής φάσης ως διεύθυνση σε έναν πίνακα αναζήτησης και μετατρέπει τις πληροφορίες φάσης σε πλάτος. Και τέλος, έχουμε έναν μετατροπέα ψηφιακού σε αναλογικό 10-bit του οποίου δουλειά είναι να λαμβάνουμε τα ψηφιακά δεδομένα από το SIN ROM και να τα μετατρέψουμε στις αντίστοιχες αναλογικές τάσεις, δηλαδή αυτό που λαμβάνουμε από την έξοδο. Στην έξοδο, έχουμε επίσης έναν διακόπτη που μπορούμε να ενεργοποιήσουμε ή να απενεργοποιήσουμε με λίγο κώδικα λογισμικού. Θα το συζητήσουμε αργότερα στο άρθρο.Οι λεπτομέρειες που βλέπετε παραπάνω είναι μια πολύ απογυμνωμένη έκδοση του τι συμβαίνει μέσα στο IC και οι περισσότερες από τις λεπτομέρειες που βλέπετε προέρχονται από το φύλλο δεδομένων AD9833, μπορείτε επίσης να το ελέγξετε για περισσότερες πληροφορίες.
Απαιτούνται στοιχεία για τη δημιουργία της γεννήτριας λειτουργίας με βάση το AD9833
Τα στοιχεία που απαιτούνται για την κατασκευή της γεννήτριας λειτουργίας με βάση το AD9833 παρατίθενται παρακάτω, σχεδιάσαμε αυτό το κύκλωμα με πολύ γενικά εξαρτήματα, γεγονός που καθιστά τη διαδικασία αναπαραγωγής πολύ εύκολη.
- Arduino Nano - 1
- AD9833 DDS Λειτουργία γεννήτρια - 1
- Οθόνη OLED 128 X 64 - 1
- Γενικός περιστροφικός κωδικοποιητής - 1
- Jack Barrel DC - 1
- Ρυθμιστής τάσης LM7809 - 1
- Πυκνωτής 470uF - 1
- Πυκνωτής 220uF - 1
- Πυκνωτής 104pF - 1
- Αντίσταση 10K - 6
- Διακόπτες αφής - 4
- Ακροδέκτης βίδας 5.04mm - 1
- Γυναικεία κεφαλίδα - 1
- Πηγή ισχύος 12V - 1
Γεννήτρια λειτουργιών βάσει9898 - Σχηματικό διάγραμμα
Το πλήρες διάγραμμα κυκλώματος για το AD9833 και το Arduino Based Function Generator φαίνεται παρακάτω.
Θα χρησιμοποιήσουμε το AD9833 με το Arduino για να δημιουργήσουμε την επιθυμητή συχνότητα. Και σε αυτήν την ενότητα, θα εξηγήσουμε όλες τις λεπτομέρειες με τη βοήθεια του σχήματος. επιτρέψτε μου να σας δώσω μια σύντομη επισκόπηση του τι συμβαίνει με το κύκλωμα. Ας ξεκινήσουμε με την ενότητα AD9833. Η μονάδα AD9833 είναι η λειτουργική μονάδα γεννήτριας και συνδέεται με το Arduino σύμφωνα με το σχήμα. Για να τροφοδοτήσουμε το κύκλωμα, χρησιμοποιούμε έναν ρυθμιστή τάσης LM7809, με έναν αξιοπρεπή πυκνωτή αποσύνδεσης, αυτό είναι απαραίτητο επειδή ο θόρυβος τροφοδοσίας μπορεί να επηρεάσει το σήμα εξόδου με αποτέλεσμα ανεπιθύμητη έξοδο. Όπως πάντα, το Arduino λειτουργεί ως εγκέφαλος για αυτό το έργο. Για να εμφανίσουμε τη ρυθμισμένη συχνότητα και άλλες πολύτιμες πληροφορίες, έχουμε συνδέσει μια μονάδα οθόνης OLED 128 X 64. Για να αλλάξουμε το εύρος συχνοτήτων, χρησιμοποιούμε τρεις διακόπτες. Το πρώτο ρυθμίζει τη συχνότητα σε Hz, το δεύτερο ρυθμίζει τη συχνότητα εξόδου σε KHz και το τρίτο ρυθμίζει τη συχνότητα σε MHz, έχουμε επίσης ένα άλλο κουμπί που μπορεί να χρησιμοποιηθεί για να ενεργοποιήσει ή να απενεργοποιήσει την έξοδο. Τέλος, έχουμε τον περιστροφικό κωδικοποιητή,και πρέπει να επισυνάψουμε κάποια αντίσταση pull-up με αυτήν, διαφορετικά αυτοί οι διακόπτες δεν θα λειτουργήσουν επειδή ελέγχουμε το συμβάν πατήματος κουμπιού στη μέθοδο συγκέντρωσης. Ο περιστροφικός κωδικοποιητής χρησιμοποιείται για να αλλάξει τη συχνότητα και ο διακόπτης αφής μέσα στον περιστροφικό κωδικοποιητή χρησιμοποιείται για την επιλογή της καθορισμένης κυματομορφής.
Γεννήτρια λειτουργιών βάσει του AD9833 - Κωδικός Arduino
Ο πλήρης κωδικός που χρησιμοποιείται σε αυτό το έργο βρίσκεται στο κάτω μέρος αυτής της σελίδας. Αφού προσθέσετε τα απαιτούμενα αρχεία κεφαλίδας και αρχεία προέλευσης, θα πρέπει να μπορείτε να μεταγλωττίσετε απευθείας το αρχείο Arduino. Μπορείτε να κατεβάσετε τη βιβλιοθήκη ad9833 Arduino και άλλες βιβλιοθήκες από τον παρακάτω σύνδεσμο ή αλλιώς μπορείτε να χρησιμοποιήσετε τη μέθοδο διαχειριστή πλακέτας για να εγκαταστήσετε τη βιβλιοθήκη.
- Κατεβάστε τη βιβλιοθήκη AD9833 από τον Bill Williams
- Λήψη SSD1306 OLED Library από το Adafruit
- Κατεβάστε τη βιβλιοθήκη Adafruit GFX
Η εξήγηση του κώδικα στο ino. Το αρχείο έχει ως εξής. Αρχικά, ξεκινάμε συμπεριλαμβάνοντας όλες τις απαιτούμενες βιβλιοθήκες. Η βιβλιοθήκη για την ενότητα AD9833 DDS ακολουθείται πρώτα από τη βιβλιοθήκη για OLED και η βιβλιοθήκη μαθηματικών απαιτείται για ορισμένους από τους υπολογισμούς μας.
#include // LIbrary για AD9833 Module #include
Στη συνέχεια, ορίζουμε όλες τις απαραίτητες καρφίτσες εισόδου και εξόδου για τα κουμπιά, το διακόπτη, τον περιστροφικό κωδικοποιητή και τα OLED.
#define SCREEN_WIDATA_PINH 128 // OLED οθόνη Πλάτος σε pixel #define SCREEN_HEIGHT 64 // OLED ύψος οθόνης, σε pixel #define SET_FREQUENCY_HZ A2 // Πλήκτρο για ρύθμιση της συχνότητας σε Hz # καθορισμός SET_FREQUENCY_KHZ AFFF_FRFFF_FRFF_FR A6 // Πλήκτρο για ρύθμιση της συχνότητας σε Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Πλήκτρο για ενεργοποίηση / απενεργοποίηση της εξόδου #define FNC_PIN 4 // Fsync Απαιτείται από την ενότητα AD9833 #define CLK_PIN 8 // Ρολόι του κωδικοποιητή / Καρφίτσα δεδομένων του κωδικοποιητή #define BTN_PIN 9 // Εσωτερικό κουμπί ώθησης στον κωδικοποιητή
Στη συνέχεια, ορίζουμε όλες τις απαραίτητες μεταβλητές που απαιτούνται σε αυτόν τον κώδικα. Αρχικά, ορίζουμε έναν ακέραιο μετρητή μεταβλητής που θα αποθηκεύει την τιμή του περιστροφικού κωδικοποιητή. Οι επόμενες δύο μεταβλητές clockPin και clockPinState αποθηκεύουν το άγαλμα του πινέλου που απαιτείται για την κατανόηση της κατεύθυνσης του κωδικοποιητή. Έχουμε μια μεταβλητή χρόνου που κρατά τις τρέχουσες τιμές χρονομετρητή, αυτή η μεταβλητή χρησιμοποιείται για την αποτροπή των κουμπιών. Στη συνέχεια, έχουμε μια μη υπογεγραμμένη μεγάλη μεταβλητή ενότηταFrequency που κρατά την υπολογιζόμενη συχνότητα που πρόκειται να εφαρμοστεί. Έπειτα, έχουμε την καθυστέρηση απόρριψης. Αυτή η καθυστέρηση μπορεί να ρυθμιστεί όπως απαιτείται. Στη συνέχεια, έχουμε τρεις boolean μεταβλητές set_frequency_hz,set_frequency_Khz, και set_frequency_Mhz αυτές οι τρεις μεταβλητές χρησιμοποιούνται για τον προσδιορισμό της τρέχουσας ρύθμισης της λειτουργικής μονάδας. Θα το συζητήσουμε λεπτομερέστερα αργότερα στο άρθρο. Στη συνέχεια, έχουμε τη μεταβλητή που αποθηκεύει την κατάσταση της κυματομορφής εξόδου, η προεπιλεγμένη κυματομορφή εξόδου είναι ημιτονοειδές κύμα. Και τέλος, έχουμε τη μεταβλητή encoder_btn_count που κρατά τον αριθμό των κουμπιών κωδικοποιητή που χρησιμοποιείται για τον καθορισμό της κυματομορφής εξόδου.
int μετρητής = 1; // Αυτή η τιμή μετρητή θα αυξηθεί ή θα μειωθεί εάν όταν ο περιστροφικός κωδικοποιητής γυρίσει int clockPin; // Placeholder για την κατάσταση pin που χρησιμοποιείται από τον περιστροφικό κωδικοποιητή int clockPinState; // Placeholder για την κατάσταση pin που χρησιμοποιείται από τον περιστροφικό κωδικοποιητή χωρίς υπογραφή για μεγάλο χρονικό διάστημα = 0; // Χρησιμοποιείται για την αποκήρυξη της μη υπογεγραμμένης μεγάλης ενότητας Συχνότητα. // χρησιμοποιείται για τον καθορισμό της συχνότητας εξόδου μακράς κατάρρευσης = 220; // Απαγόρευση καθυστέρησης bool btn_state; // χρησιμοποιείται για να ενεργοποιήσετε την απενεργοποίηση της εξόδου του AD98333 Module bool set_frequency_hz = 1; // Συχνότητα αποτυχίας του AD9833 Module bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Κυματομορφή εκκίνησης της ενότητας int encoder_btn_count = 0; // χρησιμοποιείται για τον έλεγχο του κουμπιού κωδικοποιητή Πατήστε Επόμενο, έχουμε τα δύο αντικείμενα μας ένα είναι για την οθόνη OLED και ένα άλλο για τη μονάδα AD9833Οθόνη Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Στη συνέχεια, έχουμε τη λειτουργία setup (), σε αυτή τη λειτουργία setup, ξεκινάμε με την ενεργοποίηση του Serial για εντοπισμό σφαλμάτων. Αρχικοποιούμε τη μονάδα AD9833 με τη βοήθεια της μεθόδου start (). Στη συνέχεια, ορίζουμε όλους τους αντιστοιχισμένους ακροδέκτες περιστροφικού κωδικοποιητή ως είσοδο. Και αποθηκεύουμε την τιμή του πείρου ρολογιού στη μεταβλητή clockPinState, αυτό είναι ένα απαραίτητο βήμα για τον περιστροφικό κωδικοποιητή.
Στη συνέχεια, ορίζουμε όλες τις καρφίτσες κουμπιών ως είσοδο και ενεργοποιούμε την οθόνη OLED με τη βοήθεια της μεθόδου display.begin () , και επίσης ελέγχουμε για τυχόν σφάλματα με δήλωση if . Όταν ολοκληρωθεί, καθαρίζουμε την οθόνη και εκτυπώνουμε μια οθόνη εκκίνησης εκκίνησης, προσθέτουμε καθυστέρηση 2 δευτερολέπτων, η οποία είναι επίσης η καθυστέρηση για την οθόνη εκκίνησης και τέλος, καλούμε τη συνάρτηση update_display () που διαγράφει την οθόνη και ενημερώνει εμφανιστεί ξανά. Οι λεπτομέρειες της μεθόδου update_display () θα συζητηθούν αργότερα στο άρθρο.
άκυρη ρύθμιση () {Serial.begin (9600); // Ενεργοποίηση Serial @ 9600 baud gen. Ξεκινήστε (); // ΠΡΕΠΕΙ να είναι η πρώτη εντολή μετά τη δήλωση του αντικειμένου AD9833 pinMode (CLK_PIN, INPUT). // Ρύθμιση καρφιτσών ως είσοδος pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Ρύθμιση ακίδων ως είσοδος pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); εάν (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Διεύθυνση 0x3D για 128x64 Serial.println (F ("Η εκχώρηση SSD1306 απέτυχε")); Για (;;); } display.clearDisplay (); // Εκκαθάριση της οθόνης display.setTextSize (2); // Ορισμός μεγέθους κειμένου display.setTextColor (ΛΕΥΚΟ); // σετ LCD Color display.setCursor (30, 0); // Ορισμός θέσης δρομέα display.println ("AD9833"); // Εκτυπώστε την οθόνη αυτού του κειμένου.setCursor (17, 20); // Ορισμός θέσης δρομέα display.println ("Function"); // Εκτυπώστε αυτό το κείμενο display.setCursor (13, 40). // Ορισμός θέσης δρομέα display.println ("Generator"); // Εκτυπώστε αυτό το κείμενο display.display (); // Ενημέρωση καθυστέρησης εμφάνισης (2000). // Καθυστέρηση 2 SEC update_display (); // Λειτουργία κλήσης update_display}
Στη συνέχεια, έχουμε τη λειτουργία loop (), όλες οι βασικές λειτουργίες γράφονται στην ενότητα loop.
Αρχικά, διαβάζουμε τον πείρο ρολογιού του Rotary encoder και τον αποθηκεύουμε στη μεταβλητή clockPin που έχουμε δηλώσει νωρίτερα. Στη συνέχεια, στη δήλωση if , ελέγξουμε εάν η προηγούμενη τιμή του pin και η τρέχουσα τιμή του pin είναι παρόμοια ή όχι και ελέγξουμε επίσης την τρέχουσα τιμή του pin. Αν όλα είναι αλήθεια, ελέγξουμε τον ακροδέκτη δεδομένων, εάν είναι αληθές ότι σημαίνει ότι ο κωδικοποιητής περιστρέφεται αριστερόστροφα και μειώνουμε την τιμή του μετρητή με τη βοήθεια της αντίθετης εντολής Διαφορετικά, αυξάνουμε την τιμή μετρητή με την εντολή μετρητή ++. Τέλος, βάζουμε μια άλλη δήλωση if για να ορίσουμε την ελάχιστη τιμή σε 1. Στη συνέχεια, ενημερώνουμε το clockPinState με το τρέχον clockPinαξία για μελλοντική χρήση.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {μετρητής -; } αλλιώς {μετρητής ++; // Ο κωδικοποιητής περιστρέφει το CW έτσι ώστε να αυξάνεται} εάν (μετρητής <1) μετρητής = 1; Serial.println (μετρητής); update_display (); }
Στη συνέχεια, έχουμε τον κωδικό μας για να εντοπίσουμε το πάτημα ενός κουμπιού. Σε αυτήν την ενότητα, εντοπίσαμε το κουμπί μέσα στον κωδικοποιητή με τη βοήθεια ορισμένων ένθετων εάν δηλώσεων, εάν (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), σε αυτήν τη δήλωση, ελέγξουμε πρώτα αν το κουμπί η ακίδα είναι χαμηλή ή όχι, εάν είναι χαμηλή, τότε πιέζεται. Και πάλι ελέγξουμε την τιμή του χρονοδιακόπτη με την καθυστέρηση απόρριψης, εάν και οι δύο δηλώσεις είναι αληθείς, τότε το δηλώνουμε ως επιτυχημένη ενέργεια πατήματος κουμπιού εάν ναι, αυξάνουμε την τιμή encoder_btn_count. Στη συνέχεια, δηλώνουμε μια άλλη αν δήλωση για να ορίσετε τη μέγιστη τιμή μετρητή σε 2, τη χρειαζόμαστε γιατί τη χρησιμοποιούμε για να ορίσουμε την κυματομορφή εξόδουΟι διαδοχικές τρεις αν δηλώσεις το κάνουν αυτό, εάν η τιμή είναι μηδέν, επιλέγεται ημιτονοειδής μορφή, εάν είναι μία, είναι τετράγωνο κύμα και αν η τιμή είναι 2, είναι τριγωνικό κύμα. Και στις τρεις από αυτές τις δηλώσεις, ενημερώνουμε την οθόνη με τη συνάρτηση update_display () . Και τέλος, ενημερώνουμε τη μεταβλητή χρόνου με την τρέχουσα τιμή μετρητή χρονοδιακόπτη.
// Αν εντοπίσουμε σήμα LOW, το κουμπί πατάται εάν (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Αυξήστε τις τιμές εάν (encoder_btn_count> 2) // εάν η τιμή είναι μεγαλύτερη από 2 επαναφέρετέ την σε 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// εάν η τιμή είναι 0 ημιτονοειδές κύμα επιλέγεται waveSelect = "SIN"; // ενημέρωση της μεταβλητής συμβολοσειράς με τιμή sin_display (); // ενημερώστε την οθόνη} if (encoder_btn_count == 1) {// εάν η τιμή είναι 1 τετραγωνικό κύμα επιλέγεται waveSelect = "SQR"; // ενημερώστε τη μεταβλητή συμβολοσειράς με την τιμή SQR update_display (); // ενημερώστε την οθόνη} if (encoder_btn_count == 2) {// εάν η τιμή είναι 1 Τριγωνικό κύμα επιλέγεται waveSelect = "TRI"; // ενημερώστε τη μεταβλητή συμβολοσειράς με τιμή TRI update_display ();// ενημέρωση της οθόνης} time = millis (); // ενημέρωση της χρονικής μεταβλητής}
Στη συνέχεια, ορίζουμε όλο τον απαραίτητο κώδικα που απαιτείται για τη ρύθμιση όλων των κουμπιών με καθυστέρηση απόρριψης. Καθώς τα κουμπιά είναι συνδεδεμένα με τις αναλογικές ακίδες του Arduino, χρησιμοποιούμε την αναλογική εντολή ανάγνωσης για να προσδιορίσουμε το πάτημα ενός κουμπιού εάν η αναλογική τιμή ανάγνωσης φτάσει κάτω από 30, τότε ανιχνεύσουμε μια επιτυχημένη πίεση του κουμπιού και περιμένουμε 200 ms έως ελέγξτε αν πρόκειται για πραγματικό πάτημα κουμπιού ή μόνο για θόρυβο. Εάν αυτή η δήλωση είναι αληθινή, εκχωρούμε τις δυαδικές μεταβλητές με τιμές που χρησιμοποιούνται για τον καθορισμό των τιμών Hz, Khz και Mhz της γεννήτριας συνάρτησης. Στη συνέχεια, ενημερώνουμε την οθόνη και ενημερώνουμε τη μεταβλητή χρόνου. Το κάνουμε αυτό και για τα τέσσερα κουμπιά που συνδέονται με το Arduino.
εάν (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // ενημέρωση δυαδικών τιμών set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // ενημέρωση του χρόνου εμφάνισης = millis (); // ενημέρωση της μεταβλητής ώρας} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // ενημέρωση δυαδικών τιμών set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = μετρητής * 1000; update_display (); // ενημέρωση του χρόνου εμφάνισης = millis (); // ενημέρωση της χρονικής μεταβλητής} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// ελέγξτε την αναλογική καρφίτσα με καθυστέρηση απόρριψης set_frequency_hz = 0; // ενημέρωση δυαδικών τιμών set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = μετρητής * 1000000; update_display ();// ενημέρωση του χρόνου εμφάνισης = millis (); // ενημέρωση της χρονικής μεταβλητής} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// ελέγξτε την αναλογική καρφίτσα με καθυστέρηση απόρριψης btn_state =! btn_state; // Αντιστρέψτε την κατάσταση του κουμπιού gen.EnableOutput (btn_state); // Ενεργοποίηση / Απενεργοποίηση της παραγωγής της γεννήτριας λειτουργίας ανάλογα με την κατάσταση του κουμπιού update_display (); // ενημέρωση του χρόνου εμφάνισης = millis (); // ενημέρωση της μεταβλητής χρόνου}}// ενημέρωση της μεταβλητής χρόνου}}// ενημέρωση της χρονικής μεταβλητής}}
Τέλος, έχουμε τη συνάρτηση update_display (). Σε αυτήν τη λειτουργία, κάναμε πολλά περισσότερα από την απλή ενημέρωση αυτής της οθόνης, επειδή ένα συγκεκριμένο τμήμα της οθόνης δεν μπορεί να ενημερωθεί σε ένα OLED. Για να το ενημερώσετε, πρέπει να το βάψετε ξανά με νέες τιμές. Αυτό καθιστά τη διαδικασία κωδικοποίησης πολύ πιο δύσκολη.
Μέσα σε αυτήν τη λειτουργία, ξεκινάμε με την εκκαθάριση της οθόνης. Στη συνέχεια, ορίζουμε το απαιτούμενο μέγεθος κειμένου. Στη συνέχεια, ρυθμίζουμε τον κέρσορα και την τυπωμένη λειτουργία Generator με το display.println ("Function Function"). εντολή. Ρυθμίζουμε ξανά το μέγεθος κειμένου σε 2 και ο δρομέας σε (0,20) με τη βοήθεια της λειτουργίας display.setCursor (0, 20).
Εδώ εκτυπώνουμε τις πληροφορίες για το τι είναι το κύμα.
display.clearDisplay (); // Πρώτα καθαρίστε την οθόνη display.setTextSize (1); // ορίστε κείμενο Μέγεθος display.setCursor (10, 0); // Ορισμός θέσης δρομέα display.println ("Function Generator"); // εκτύπωση του κειμένου display.setTextSize (2); // ορισμός κειμένου Size display.setCursor (0, 20); // Ορισμός θέσης δρομέα
Στη συνέχεια, ελέγχουμε τις δυαδικές μεταβλητές για λεπτομέρειες συχνότητας και ενημερώνουμε την τιμή στη μεταβλητή moduleFrequency. Το κάνουμε αυτό για τις τιμές Hz, kHz και MHz. Στη συνέχεια, ελέγχουμε τη μεταβλητή waveSelect και προσδιορίζουμε ποιο κύμα επιλέγεται. Τώρα, έχουμε τις τιμές για να ορίσουμε τον τύπο και τη συχνότητα των κυμάτων.
εάν (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// ελέγξτε εάν πιέζεται το κουμπί για τη ρύθμιση της συχνότητας σε Hz moduleFrequency = counter; // ενημέρωση της μονάδας Μεταβλητή συχνότητας με τρέχουσα τιμή μετρητή} εάν (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// ελέγξτε εάν πιέζεται το κουμπί για τη ρύθμιση της συχνότητας σε KHzFrequency = μετρητής * 1000; // ενημερώστε τη μεταβλητή moduleFrequency με την τρέχουσα τιμή μετρητή, αλλά πολλαπλασιάζουμε το 1000 για να το ρυθμίσουμε στο KHZ} εάν (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// ελέγξτε εάν πιέζεται το κουμπί για τη ρύθμιση της συχνότητας σε MHz = μετρητής * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// μην αφήσετε τη συχνότητα να τρίψει ότι ο μετρητής 12Mhz = 12; }} if (waveSelect == "SIN") {// Το Sine wave επιλέγεται display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Το Sqr wave είναι επιλεγμένο display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave επιλέγεται display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // ενημερώστε την ενότητα AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Το Sqr wave είναι επιλεγμένο display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave επιλέγεται display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // ενημερώστε την ενότητα AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Το Sqr wave είναι επιλεγμένο display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave επιλέγεται display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // ενημερώστε την ενότητα AD9833. Serial.println (moduleFrequency); }
Ρυθμίζουμε ξανά τον κέρσορα και ενημερώνουμε τις τιμές μετρητή. Πάλι ελέγχουμε το boolean για να ενημερώσουμε το εύρος συχνοτήτων στην οθόνη, πρέπει να το κάνουμε αυτό γιατί η αρχή λειτουργίας του OLED είναι πολύ περίεργη.
display.setCursor (45, 20); display.println (μετρητής); // εκτυπώστε τις πληροφορίες μετρητή στην οθόνη. εάν (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // εκτύπωση Hz στην οθόνη display.display (); // όταν όλα τα σετ ενημερώσουν την οθόνη} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // όταν όλα τα σετ ενημερώσουν την οθόνη} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // όταν όλα τα σετ ενημερώσουν την οθόνη}
Στη συνέχεια, ελέγχουμε τη μεταβλητή πατήματος κουμπιού για να εκτυπώσουμε την έξοδο / έξοδο στο OLED. Και πάλι αυτό πρέπει να γίνει λόγω της μονάδας OLED.
εάν (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // έξοδος εκτύπωσης στην οθόνη display.display (); display.setTextSize (2); } αλλιώς {display.setTextSize (1); display.setCursor (65, 45); display.print ("Έξοδος εξόδου"); // εκτύπωση εκτύπωσης απενεργοποιημένη στην οθόνη display.display (); display.setTextSize (2); }
Αυτό σηματοδοτεί το τέλος της διαδικασίας κωδικοποίησης. Εάν είστε μπερδεμένοι σε αυτό το σημείο, μπορείτε να ελέγξετε τα σχόλια στον κώδικα για περαιτέρω κατανόηση.
Δοκιμή της γεννήτριας λειτουργίας με βάση το AD9833
Για να ελέγξετε το κύκλωμα, χρησιμοποιείται η παραπάνω ρύθμιση Όπως μπορείτε να δείτε, συνδέσαμε έναν προσαρμογέα ρεύματος 12V DC στην υποδοχή βαρελιού DC και συνδέσαμε τον παλμογράφο Hantek στην έξοδο του κυκλώματος. Έχουμε επίσης συνδέσει το παλμογράφο με το φορητό υπολογιστή για να οπτικοποιήσουμε και να μετρήσουμε τη συχνότητα εξόδου.
Μόλις γίνει αυτό, ορίζουμε τη συχνότητα εξόδου στα 5Khz με τη βοήθεια του περιστροφικού κωδικοποιητή και δοκιμάζουμε το ημιτονοειδές κύμα εξόδου και είναι αρκετά σίγουρο ότι είναι ημιτονοειδές κύμα 5Khz στην έξοδο.
Στη συνέχεια, αλλάξαμε την κυματομορφή εξόδου σε τριγωνικό κύμα αλλά η συχνότητα παρέμεινε η ίδια, η κυματομορφή εξόδου φαίνεται παρακάτω.
Στη συνέχεια, αλλάξαμε την έξοδο σε τετραγωνικό κύμα και παρατηρήσαμε την έξοδο, και ήταν ένα τέλειο τετραγωνικό κύμα.
Αλλάξαμε επίσης τα εύρη συχνοτήτων και δοκιμάσαμε την έξοδο και λειτούργησε καλά.
Περαιτέρω βελτιώσεις
Αυτό το κύκλωμα είναι μόνο μια απόδειξη της ιδέας και χρειάζεται περαιτέρω βελτιώσεις. Πρώτον, χρειαζόμαστε PCB καλής ποιότητας και κάποια καλής ποιότητας σύνδεση BNC για την έξοδο, διαφορετικά δεν μπορούμε να αποκτήσουμε υψηλότερη συχνότητα. Το πλάτος της μονάδας είναι πολύ χαμηλό, οπότε για να το βελτιώσουμε, χρειαζόμαστε μερικά κυκλώματα op-amp για να ενισχύσουμε την τάση εξόδου. Ένα ποτενσιόμετρο μπορεί να συνδεθεί για να μεταβληθεί το εύρος εξόδου. Μπορεί να συνδεθεί ένας διακόπτης για την αντιστάθμιση του σήματος. αυτό είναι επίσης απαραίτητο χαρακτηριστικό. Και επιπλέον, ο κώδικας χρειάζεται πολλή βελτίωση καθώς είναι λίγο αμαξάκι. Τέλος, οι οθόνες OLED πρέπει να αλλάξουν αλλιώς είναι αδύνατο να γράψετε εύκολα κατανοητό κώδικα.
Αυτό σηματοδοτεί το τέλος αυτού του σεμιναρίου, ελπίζω να σας άρεσε το άρθρο και να μάθετε κάτι νέο. Εάν έχετε οποιεσδήποτε ερωτήσεις σχετικά με το άρθρο, μπορείτε να τις αφήσετε στην ενότητα σχολίων παρακάτω ή μπορείτε να χρησιμοποιήσετε το Φόρουμ Ηλεκτρονικών.