Πίνακας περιεχομένων:

Σούπερ γρήγορες αναλογικές τάσεις από το Arduino: 10 βήματα (με εικόνες)
Σούπερ γρήγορες αναλογικές τάσεις από το Arduino: 10 βήματα (με εικόνες)

Βίντεο: Σούπερ γρήγορες αναλογικές τάσεις από το Arduino: 10 βήματα (με εικόνες)

Βίντεο: Σούπερ γρήγορες αναλογικές τάσεις από το Arduino: 10 βήματα (με εικόνες)
Βίντεο: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Ιούλιος
Anonim
Image
Image

Αυτό το Instructable δείχνει πώς να δημιουργήσετε εξαιρετικά γρήγορες αλλαγές αναλογικής τάσης από ένα Arduino και ένα απλό ζεύγος αντίστασης και πυκνωτή. Μια εφαρμογή όπου αυτό είναι χρήσιμο είναι η δημιουργία γραφικών σε έναν παλμογράφο. Υπάρχουν πολλά άλλα έργα που έχουν κάνει αυτό. Ο Johngineer δείχνει ένα απλό χριστουγεννιάτικο δέντρο χρησιμοποιώντας διαμόρφωση πλάτους παλμών (PWM). Άλλοι έχουν βελτιωθεί σε αυτό το έργο χρησιμοποιώντας μια σκάλα αντίστασης ή χρησιμοποιώντας ένα ειδικό τσιπ μετατροπέα ψηφιακού σε αναλογικό.

Η χρήση του PWM προκαλεί πολύ τρεμόπαιγμα, ενώ η χρήση μιας σκάλας αντίστασης ή ενός μετατροπέα ψηφιακού σε αναλογικό απαιτεί περισσότερους πείρους εξόδου και εξαρτήματα που ενδέχεται να μην είναι άμεσα διαθέσιμα. Το κύκλωμα που χρησιμοποιώ είναι το ίδιο νεκρό απλό ζεύγος αντίστασης και πυκνωτή όπως χρησιμοποιείται στο demo του χριστουγεννιάτικου δέντρου, αλλά λειτουργεί με σημαντικά λιγότερο τρεμόπαιγμα.

Αρχικά, θα σας καθοδηγήσω στη διαδικασία κατασκευής του κυκλώματος. Στη συνέχεια, θα σας διδάξω πώς να προσθέσετε τη δική σας εικόνα. Τέλος, θα εισαγάγω τη θεωρία σχετικά με το τι την κάνει πιο γρήγορη.

Αν σας άρεσε αυτό το Instructable, σκεφτείτε να το ψηφίσετε!:)

Βήμα 1: Δημιουργία κυκλώματος

Χτίζοντας το κύκλωμα
Χτίζοντας το κύκλωμα

Για να δημιουργήσετε το κύκλωμα, θα χρειαστείτε τα ακόλουθα:

α) Ένα Arduino βασισμένο στο Atmel 16MHz ATmega328P, όπως ένα Arduino Uno ή Arduino Nano.

β) Δύο αντιστάσεις αξίας R που είναι τουλάχιστον 150Ω.

γ) Δύο πυκνωτές αξίας C, ώστε C = 0,0015 / R, παραδείγματα:

  • R = 150Ω και C = 10μ
  • R = 1,5kΩ και C = 1μ
  • R = 15kΩ και C = 100nF
  • R = 150kΩ και C = 10nF

Οι λόγοι για την επιλογή αυτών των τιμών είναι διπλοί. Κυρίως, θέλουμε να διατηρήσουμε το ρεύμα στις ακίδες του Arduino κάτω από το μέγιστο ονομαστικό ρεύμα των 40mA. Η χρήση τιμής 150Ω περιορίζει το ρεύμα στα 30mA όταν χρησιμοποιείται με τάση τροφοδοσίας Arduino 5V. Μεγαλύτερες τιμές R θα μειώσουν το ρεύμα και επομένως είναι αποδεκτές.

Ο δεύτερος περιορισμός είναι ότι θέλουμε να διατηρήσουμε το χρόνο σταθερό, το οποίο είναι το προϊόν των R και C, ίσο με περίπου 1,5ms. Το λογισμικό έχει ρυθμιστεί ειδικά για αυτό το χρονικό σταθερό. Παρόλο που είναι δυνατή η προσαρμογή των τιμών R και C στο λογισμικό, υπάρχει ένα μικρό εύρος γύρω από το οποίο θα λειτουργήσει, οπότε επιλέξτε στοιχεία όσο το δυνατόν πιο κοντά στην προτεινόμενη αναλογία.

Μια πιο εμπεριστατωμένη εξήγηση για το γιατί η σταθερά RC είναι σημαντική θα δοθεί στο τμήμα θεωρίας, αφού σας δείξω πώς να συναρμολογήσετε το κύκλωμα επίδειξης.

Βήμα 2: Ρύθμιση του παλμογράφου

Ρύθμιση του παλμογράφου
Ρύθμιση του παλμογράφου

Η επίδειξη απαιτεί παλμογράφο ρυθμισμένο σε λειτουργία Χ/Υ. Τα καλώδια δοκιμής πρέπει να συνδεθούν όπως φαίνεται στα σχήματα. Το παλμογράφο σας θα διαφέρει από το δικό μου, αλλά θα ακολουθήσω τα απαραίτητα βήματα για να ρυθμίσετε τη λειτουργία X/Y στη μονάδα μου:

α) Ρυθμίστε την οριζόντια σάρωση να ελέγχεται από το κανάλι Β (ο άξονας Χ).

β) Ρυθμίστε τον παλμογράφο σε λειτουργία δύο καναλιών.

γ) Ρυθμίστε τα volts/div και στα δύο κανάλια έτσι ώστε να μπορεί να εμφανίσει τάσεις από 0V έως 5V. Έβαλα το δικό μου στα 0.5V/div.

δ) Ρυθμίστε τη λειτουργία ζεύξης σε DC και στα δύο κανάλια.

ε) Προσαρμόστε τη θέση των Χ και Υ έτσι ώστε η τελεία να βρίσκεται στην κάτω αριστερή γωνία της οθόνης όταν απενεργοποιείται το Arduino.

Βήμα 3: Λήψη και εκτέλεση του λογισμικού

Image
Image

Κατεβάστε το λογισμικό από το αποθετήριο Fast Vector Display For Arduino. Το λογισμικό έχει άδεια βάσει της GNU Affero Public License v3 και μπορεί να χρησιμοποιηθεί και να τροποποιηθεί ελεύθερα σύμφωνα με τους όρους αυτής της άδειας.

Ανοίξτε το αρχείο "fast-vector-display-arduino.ino" στο Arduino IDE και ανεβάστε το στο Arduino σας. Στιγμιαία, θα δείτε μια κινούμενη εικόνα "Καλή χρονιά" στην οθόνη του παλμογράφου σας.

Ανέπτυξα αυτό το έργο ως προσωπικό hackaton τις εβδομάδες πριν από τα Χριστούγεννα, οπότε υπάρχει ένα μήνυμα με θέμα τα Χριστούγεννα και την Πρωτοχρονιά που μπορείτε να δείτε τροποποιώντας τη μεταβλητή PATTERN στον κώδικα.

Βήμα 4: Δημιουργήστε το δικό σας προσαρμοσμένο σχέδιο

Κατανοήστε γιατί το PWM είναι τόσο αργό
Κατανοήστε γιατί το PWM είναι τόσο αργό

Εάν θέλετε να δημιουργήσετε το δικό σας σχέδιο, μπορείτε να επικολλήσετε συντεταγμένες σημείων στο σκίτσο του Arduino στη γραμμή που ορίζει το USER_PATTERN.

Διαπίστωσα ότι το Inkscape είναι ένα αρκετά καλό εργαλείο για την κατασκευή ενός προσαρμοσμένου σχεδίου:

  1. Δημιουργήστε κείμενο χρησιμοποιώντας μια μεγάλη, έντονη γραμματοσειρά όπως το Impact.
  2. Επιλέξτε το αντικείμενο κειμένου και επιλέξτε "Αντικείμενο σε διαδρομή" από το μενού "Διαδρομή".
  3. Επιλέξτε μεμονωμένα γράμματα και επικαλύψτε τα για να δημιουργήσετε ένα συνδεδεμένο σχήμα
  4. Επιλέξτε "Ένωση" από το μενού "Διαδρομή" για να τα συνδυάσετε σε μια μόνο καμπύλη.
  5. Εάν υπάρχουν τρύπες σε οποιοδήποτε γράμμα, κόψτε μια μικρή εγκοπή σχεδιάζοντας ένα ορθογώνιο με το εργαλείο ορθογωνίου και αφαιρέστε το από το περίγραμμα χρησιμοποιώντας το εργαλείο "Διαφορά".
  6. Κάντε διπλό κλικ στη διαδρομή για να εμφανίσετε τους κόμβους.
  7. Ορθογώνιο επιλέξτε όλους τους κόμβους και κάντε κλικ στο εργαλείο "Δημιουργία γωνίας επιλεγμένων κόμβων".
  8. Αποθηκεύστε το αρχείο SVG.

Το σημαντικό είναι ότι το σχέδιό σας πρέπει να έχει μία μόνο κλειστή διαδρομή και χωρίς τρύπες. Βεβαιωθείτε ότι το σχέδιό σας έχει λιγότερους από περίπου 130 πόντους.

Βήμα 5: Επικόλληση των συντεταγμένων από το αρχείο SVG στο Arduino IDE

  1. Ανοίξτε το αρχείο SVG και αντιγράψτε τις συντεταγμένες. Αυτά θα ενσωματωθούν στο στοιχείο "διαδρομή". Το πρώτο ζεύγος συντεταγμένων μπορεί να αγνοηθεί. αντικαταστήστε τα με 0, 0.
  2. Επικολλήστε τις συντεταγμένες στο σκίτσο Arduino μέσα στις αγκύλες αμέσως μετά το "#define USER_PATTERN".
  3. Αντικαταστήστε όλα τα κενά με κόμματα, διαφορετικά θα λάβετε σφάλμα μεταγλώττισης. Το εργαλείο "Αντικατάσταση & Εύρεση" μπορεί να είναι χρήσιμο.
  4. Μεταγλωττίστε και τρέξτε!
  5. Εάν αντιμετωπίζετε προβλήματα, παρακολουθήστε τη σειριακή κονσόλα για τυχόν σφάλματα. Συγκεκριμένα, θα δείτε μηνύματα εάν το μοτίβο σας έχει πάρα πολλά σημεία για το εσωτερικό buffer. Σε τέτοιες περιπτώσεις, η εικόνα θα εμφανίζει υπερβολικό τρεμόπαιγμα.

Βήμα 6: Κατανοήστε γιατί το PWM είναι τόσο αργό

Αρχικά, ας αναθεωρήσουμε τη συμπεριφορά ενός πυκνωτή καθώς φορτίζεται.

Ένας πυκνωτής που είναι συνδεδεμένος σε μια πηγή τάσης Vcc θα αυξήσει την τάση του σύμφωνα με μια εκθετική καμπύλη. Αυτή η καμπύλη είναι ασυμπτωτική, που σημαίνει ότι θα επιβραδυνθεί καθώς πλησιάζει την τάση -στόχο. Για όλους τους πρακτικούς σκοπούς, η τάση είναι "αρκετά κοντά" μετά από 5 δευτερόλεπτα RC. Το RC ονομάζεται "σταθερά χρόνου". Όπως είδαμε νωρίτερα, είναι το προϊόν των τιμών της αντίστασης και του πυκνωτή στο κύκλωμά σας. Το πρόβλημα είναι ότι το 5 RC είναι ένας αρκετά μεγάλος χρόνος για την ενημέρωση κάθε σημείου σε μια οθόνη γραφικών. Αυτό οδηγεί σε πολύ τρεμόπαιγμα!

Όταν χρησιμοποιούμε διαμόρφωση πλάτους παλμού (PWM) για να φορτίσουμε έναν πυκνωτή, δεν είμαστε καλύτερα. Με το PWM η τάση αλλάζει γρήγορα μεταξύ 0V και 5V. Στην πράξη, αυτό σημαίνει ότι εναλλάσσουμε γρήγορα μεταξύ της ώθησης της φόρτισης στον πυκνωτή και του τραβήγματος λίγο ξανά προς τα έξω - αυτό το σπρώξιμο είναι μάλλον σαν να προσπαθούμε να τρέξουμε έναν μαραθώνιο κάνοντας ένα μεγάλο βήμα προς τα εμπρός και στη συνέχεια ένα μικρό βήμα προς τα πίσω. ξανά και ξανά.

Όταν τα υπολογίζετε όλα κατά μέσο όρο, η συμπεριφορά φόρτισης ενός πυκνωτή χρησιμοποιώντας PWM είναι ακριβώς η ίδια με αυτήν που είχατε χρησιμοποιήσει μια σταθερή τάση Vpwm για να φορτίσετε τον πυκνωτή. Χρειάζονται περίπου 5 δευτερόλεπτα RC για να φτάσουμε «αρκετά κοντά» στην επιθυμητή τάση.

Βήμα 7: Πηγαίνετε από το Α στο Β, λίγο πιο γρήγορα

Πηγαίνετε από το Α στο Β, λίγο πιο γρήγορα
Πηγαίνετε από το Α στο Β, λίγο πιο γρήγορα

Ας υποθέσουμε ότι έχουμε έναν πυκνωτή που είναι ήδη φορτισμένος έως Va. Έστω ότι χρησιμοποιούμε το analogWrite () για να γράψουμε τη νέα τιμή του b. Ποιος είναι ο ελάχιστος χρόνος που πρέπει να περιμένετε για να επιτευχθεί η τάση Vb;

Αν μαντέψατε 5 δευτερόλεπτα RC, αυτό είναι υπέροχο! Περιμένοντας 5 RC δευτερόλεπτα, ο πυκνωτής θα φορτιστεί σε σχεδόν Vb. Αλλά αν θέλουμε, μπορούμε πραγματικά να περιμένουμε λίγο λιγότερο.

Κοιτάξτε την καμπύλη φόρτισης. Βλέπετε, ο πυκνωτής ήταν ήδη στο Va όταν ξεκινήσαμε. Αυτό σημαίνει ότι δεν χρειάζεται να περιμένουμε το χρόνο t_a. Θα έπρεπε μόνο αν φορτίζαμε τον πυκνωτή από το μηδέν.

Έτσι, χωρίς να περιμένουμε εκείνη την ώρα, βλέπουμε μια βελτίωση. Ο χρόνος t_ab είναι στην πραγματικότητα λίγο μικρότερος από 5 RC.

Υπομονή, μπορούμε πολύ καλύτερα! Κοιτάξτε όλο αυτόν τον χώρο πάνω από το v_b. Αυτή είναι η διαφορά μεταξύ του Vcc, της μέγιστης τάσης που έχουμε στη διάθεσή μας και του Vb που σκοπεύουμε να φτάσουμε. Μπορείτε να δείτε πώς αυτή η επιπλέον τάση μπορεί να μας βοηθήσει να φτάσουμε εκεί που θέλουμε να πάμε πολύ πιο γρήγορα;

Βήμα 8: Μεταβείτε από το ένα στο Β, με έναν φορτιστή Turbo

Πηγαίνετε από το Α στο Β, Με Φορτιστή Turbo!
Πηγαίνετε από το Α στο Β, Με Φορτιστή Turbo!

Σωστά. Αντί να χρησιμοποιούμε PWM στην τάση στόχου V_b, το κρατάμε σε σταθερό Vcc για πολύ, πολύ μικρότερο χρονικό διάστημα. Το ονομάζω μέθοδο Turbo Charger και μας οδηγεί εκεί που θέλουμε να πάμε πραγματικά, πολύ γρήγορα! Μετά τη χρονική καθυστέρηση (την οποία πρέπει να υπολογίσουμε), χτυπάμε φρένα μεταβαίνοντας στο PWM στο V_b. Αυτό εμποδίζει την τάση να υπερβεί το στόχο.

Με αυτήν τη μέθοδο, είναι δυνατόν να αλλάξετε την τάση στον πυκνωτή από V_a σε V_b σε ένα κλάσμα του χρόνου από ό, τι χρησιμοποιώντας μόνο PWM. Έτσι παίρνεις θέσεις, μωρό μου!

Βήμα 9: Κατανοήστε τον Κώδικα

Κατανοήστε τον Κώδικα
Κατανοήστε τον Κώδικα

Μια εικόνα αξίζει χίλιες λέξεις, οπότε το διάγραμμα δείχνει τα δεδομένα και τις πράξεις που εκτελούνται στον κώδικα. Από τα αριστερά στα δεξιά:

  • Τα δεδομένα γραφικών αποθηκεύονται στο PROGMEM (δηλαδή, μνήμη flash) ως λίστα σημείων.
  • Οποιοσδήποτε συνδυασμός λειτουργιών μετάφρασης, κλιμάκωσης και περιστροφής συνδυάζονται σε μια συστοιχία μετασχηματιστικού πίνακα. Αυτό γίνεται μία φορά στην αρχή κάθε πλαισίου κινούμενων σχεδίων.
  • Τα σημεία διαβάζονται ένα προς ένα από δεδομένα γραφικών και πολλαπλασιάζονται το καθένα με τον αποθηκευμένο πίνακα μετασχηματισμού.
  • Τα μετασχηματισμένα σημεία τροφοδοτούνται μέσω ενός αλγορίθμου ψαλιδιού που περικόπτει οποιαδήποτε σημεία έξω από την ορατή περιοχή.
  • Χρησιμοποιώντας έναν πίνακα αναζήτησης καθυστέρησης RC, τα σημεία μετατρέπονται σε τάσεις οδήγησης και χρονικές καθυστερήσεις. Ο πίνακας αναζήτησης καθυστέρησης RC αποθηκεύεται στο EEPROM και μπορεί να επαναχρησιμοποιηθεί για πολλαπλές εκτελέσεις του κώδικα. Κατά την εκκίνηση, ο πίνακας αναζήτησης RC ελέγχεται για ακρίβεια και ενημερώνονται τυχόν εσφαλμένες τιμές. Η χρήση του EEPROM εξοικονομεί πολύτιμη μνήμη RAM.
  • Οι τάσεις οδήγησης και οι καθυστερήσεις γράφονται στο ανενεργό πλαίσιο στο buffer πλαισίου. Το buffer πλαισίου περιέχει χώρο για ένα ενεργό πλαίσιο και ένα ανενεργό πλαίσιο. Μόλις γραφτεί ένα πλήρες πλαίσιο, το ανενεργό πλαίσιο ενεργοποιείται.
  • Μια ρουτίνα υπηρεσίας διακοπής επαναπροσδιορίζει συνεχώς την εικόνα διαβάζοντας τιμές τάσης και καθυστερήσεις από το ενεργό buffer καρέ. Με βάση αυτές τις τιμές, προσαρμόζει τους κύκλους λειτουργίας των ακίδων εξόδου. Ο χρονοδιακόπτης 1 χρησιμοποιείται για τη μέτρηση της χρονικής καθυστέρησης έως μερικά νανοδευτερόλεπτα ακριβείας, ενώ ο χρονοδιακόπτης 2 χρησιμοποιείται για τον έλεγχο του κύκλου λειτουργίας των ακίδων.
  • Ο πείρος με τη μεγαλύτερη αλλαγή τάσης είναι πάντα "turbo φορτισμένος" με κύκλο λειτουργίας μηδέν ή 100%, παρέχοντας τον ταχύτερο χρόνο φόρτισης ή εκφόρτισης. Ο πείρος με μικρότερη μεταβολή της τάσης κινείται με έναν κύκλο λειτουργίας που επιλέγεται για να ταιριάζει με τον χρόνο μετάβασης του πρώτου πείρου-αυτή η αντιστοίχιση χρόνου είναι σημαντική για να διασφαλιστεί ότι οι γραμμές σχεδιάζονται ευθεία στον παλμογράφο.

Βήμα 10: Με μεγάλη ταχύτητα, έρχεται μεγάλη ευθύνη

Αφού αυτή η μέθοδος είναι πολύ πιο γρήγορη από το PWM, γιατί δεν το χρησιμοποιεί το analogWrite; Λοιπόν, επειδή η χρήση μόνο του PWM είναι αρκετά καλή για τα περισσότερα προγράμματα και είναι πολύ πιο συγχωρητική. Η μέθοδος "Turbo Charger", ωστόσο, απαιτεί προσεκτική κωδικοποίηση και είναι κατάλληλη μόνο για συγκεκριμένες περιπτώσεις:

  1. Είναι εξαιρετικά ευαίσθητο στο timing. Μόλις φτάσουμε στο επίπεδο τάσης στόχου, ο πείρος οδήγησης πρέπει να μεταβεί αμέσως σε κανονική λειτουργία PWM, προκειμένου να αποφευχθεί η υπέρβαση της τάσης στόχου.
  2. Απαιτεί γνώση της σταθεράς RC, επομένως αυτές οι τιμές πρέπει να εισαχθούν εκ των προτέρων. Με λανθασμένες τιμές, ο χρονισμός θα είναι λάθος και οι τάσεις θα είναι λανθασμένες. Με το κανονικό PWM, υπάρχει εγγύηση ότι θα εγκατασταθείτε στη σωστή τάση μετά από κάποιο χρονικό διάστημα, ακόμη και αν η σταθερά RC δεν είναι γνωστή.
  3. Ο υπολογισμός του ακριβούς χρονικού διαστήματος για τη φόρτιση του πυκνωτή απαιτεί λογαριθμικές εξισώσεις που είναι πολύ αργές για υπολογισμό σε πραγματικό χρόνο στο Arduino. Αυτά πρέπει να υπολογιστούν εκ των προτέρων πριν από κάθε πλαίσιο κινούμενων σχεδίων και να αποθηκευτούν κάπου στη μνήμη.
  4. Τα προγράμματα που ασχολούνται με αυτήν τη μέθοδο πρέπει να αντιμετωπίζουν το γεγονός ότι οι καθυστερήσεις είναι πολύ μη γραμμικές (στην πραγματικότητα είναι εκθετικές). Οι τάσεις στόχου κοντά σε Vcc ή GND θα χρειαστούν περισσότερες τάξεις μεγέθους για να φτάσουν περισσότερο από τις τάσεις κοντά στο μεσαίο σημείο.

Για να ξεπεράσω αυτούς τους περιορισμούς, ο διανυσματικός κώδικας γραφικών μου κάνει τα εξής:

  1. Χρησιμοποιεί το χρονόμετρο 1 στα 16kHz και μια ρουτίνα υπηρεσίας διακοπής για ακριβή χειρισμό και χρονισμό εξόδου.
  2. Απαιτεί μια συγκεκριμένη τιμή της χρονικής σταθεράς RC για να χρησιμοποιηθεί, περιορίζοντας τις επιλογές των τιμών του πυκνωτή και της αντίστασης.
  3. Αποθηκεύει τις χρονικές καθυστερήσεις για όλα τα σημεία σε ένα πλαίσιο κινούμενων εικόνων σε ένα buffer μνήμης. Αυτό σημαίνει ότι η ρουτίνα που υπολογίζει τις χρονικές καθυστερήσεις τρέχει με πολύ πιο αργό ρυθμό από τη ρουτίνα υπηρεσίας διακοπής που ενημερώνει τις ακίδες εξόδου. Οποιοδήποτε πλαίσιο μπορεί να βαφτεί αρκετές δεκάδες φορές πριν είναι έτοιμο να χρησιμοποιηθεί ένα νέο σετ καθυστερήσεων για το επόμενο πλαίσιο.
  4. Η χρήση ενός buffer μνήμης θέτει έναν περιορισμό στον αριθμό των σημείων που μπορούν να σχεδιαστούν ανά καρέ. Χρησιμοποιώ μια αποτελεσματική κωδικοποίηση χώρου για να αξιοποιήσω στο έπακρο τη διαθέσιμη μνήμη RAM, αλλά εξακολουθεί να περιορίζεται σε περίπου 150 πόντους. Πέρα από εκατό περίπου σημεία, η οθόνη θα αρχίσει να τρεμοπαίζει ούτως ή άλλως, οπότε είναι ένα αμφιλεγόμενο σημείο!

Συνιστάται: