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

Μετρητής συχνότητας υψηλής ανάλυσης: 5 βήματα (με εικόνες)
Μετρητής συχνότητας υψηλής ανάλυσης: 5 βήματα (με εικόνες)

Βίντεο: Μετρητής συχνότητας υψηλής ανάλυσης: 5 βήματα (με εικόνες)

Βίντεο: Μετρητής συχνότητας υψηλής ανάλυσης: 5 βήματα (με εικόνες)
Βίντεο: Οι ιδανικές ρυθμίσεις κάμερας για iPhone με απλά λόγια | Tzeza Tech 2024, Δεκέμβριος
Anonim

Αυτό το οδηγό δείχνει έναν αμοιβαίο μετρητή συχνοτήτων ικανό να μετρήσει τις συχνότητες γρήγορα και με λογική ακρίβεια. Είναι φτιαγμένο με τυποποιημένα εξαρτήματα και μπορεί να γίνει μέσα στο Σαββατοκύριακο (μου πήρε λίγο περισσότερο:-))

EDIT: Ο κωδικός είναι τώρα διαθέσιμος στο GitLab:

gitlab.com/WilkoL/high-resolution-frequency-counter

Βήμα 1: Καταμέτρηση συχνότητας Old School

Καταμέτρηση συχνότητας Old School
Καταμέτρηση συχνότητας Old School
Καταμέτρηση συχνότητας Old School
Καταμέτρηση συχνότητας Old School

Ο παλιός τρόπος για τη μέτρηση της συχνότητας ενός σήματος είναι να χρησιμοποιήσετε μια λογική πύλη AND, να τροφοδοτήσετε το σήμα που θα μετρηθεί σε μία θύρα και ένα σήμα με υψηλό χρόνο ακριβώς 1 δευτερολέπτου στην άλλη θύρα και να μετρήσετε την έξοδο. Αυτό λειτουργεί αρκετά καλά για σήματα μερικών kHz καλά στο GHz. Τι γίνεται όμως αν θέλετε να μετρήσετε ένα σήμα χαμηλής συχνότητας με καλή ανάλυση; Πείτε ότι θέλετε να μετρήσετε τη συχνότητα του δικτύου (εδώ 50 Hz). Με την παλιά σχολική μέθοδο θα δείτε ένα σταθερό 50 στην οθόνη σας αν είστε τυχεροί, αλλά πιθανότατα θα δείτε την οθόνη να αλλάζει από 49 σε 50 ή 50 σε 51. Η ανάλυση είναι 1 Hz, και αυτό είναι όλο. Ποτέ δεν θα δείτε 50,002 Hz εκτός εάν είστε πρόθυμοι να αυξήσετε τον χρόνο της πύλης σε 1000 δευτερόλεπτα. Αυτό είναι περισσότερο από 16 λεπτά, για μία μόνο μέτρηση!

Ένας καλύτερος τρόπος μέτρησης σημάτων χαμηλής συχνότητας είναι η μέτρηση της περιόδου του. Λαμβάνοντας ξανά το δίκτυο ως παράδειγμα, έχει περίοδο 20 χιλιοστών του δευτερολέπτου. Πάρτε την ίδια λογική AND-gate, τροφοδοτήστε το με, ας πούμε 10 MHz (παλμούς 0,1 us) και το σήμα σας στην άλλη θύρα και έξω βγαίνει 200000 παλμούς, οπότε ο χρόνος περιόδου είναι 20000,0 uS και μεταφράζεται πίσω σε 50Hz. Όταν μετράτε μόνο τους παλμούς 199650, η συχνότητα είναι 50,087 Hz, αυτό είναι πολύ καλύτερο και είναι σε μόλις ένα δευτερόλεπτο χρόνο μέτρησης. Δυστυχώς αυτό δεν λειτουργεί καλά με υψηλότερες συχνότητες. Πάρτε για παράδειγμα, τώρα θέλουμε να μετρήσουμε 40 kHz. Με την ίδια συχνότητα εισόδου 10 MHz με την αναφορά μετράμε τώρα μόλις 250 παλμούς. Όταν μετράμε μόλις 249 παλμούς, ο υπολογισμός δίνει 40161 Hz και με 251 το αποτέλεσμα είναι 39840 Hz. Αυτό δεν είναι αποδεκτό ψήφισμα. Φυσικά, η αύξηση της συχνότητας αναφοράς βελτιώνει τα αποτελέσματα, αλλά υπάρχει ένα όριο στο τι μπορείτε να χρησιμοποιήσετε σε έναν μικροελεγκτή.

Βήμα 2: Ο αμοιβαίος τρόπος

Ο Αμοιβαίος Τρόπος
Ο Αμοιβαίος Τρόπος
Ο Αμοιβαίος Τρόπος
Ο Αμοιβαίος Τρόπος

Μια λύση που λειτουργεί τόσο για χαμηλές όσο και για υψηλότερες συχνότητες είναι ένας αμοιβαίος μετρητής συχνοτήτων. Θα προσπαθήσω να εξηγήσω την αρχή του. Ξεκινάτε με ένα χρόνο μέτρησης που είναι περίπου 1 δευτερόλεπτο, δεν χρειάζεται να είναι πολύ ακριβής, αλλά είναι ένας λογικός χρόνος για μια μέτρηση. Τροφοδοτήστε αυτό το σήμα 1 Hz σε ένα D-flipflop στην είσοδο D. Τίποτα δεν συμβαίνει ακόμα στην έξοδο (ες). Συνδέστε το σήμα που θέλετε να μετρήσετε στην είσοδο CLOCK του D-flipflop.

Μόλις το σήμα αυτό μεταβεί από το LOW στο HIGH, η έξοδος του D-flipflop μεταφέρει την κατάσταση της εισόδου D στην έξοδο (Q). Αυτό το σήμα RISING που χρησιμοποιείται χρησιμοποιείται για να αρχίσει να μετράει το σήμα εισόδου καθώς και ένα σήμα ρολογιού αναφοράς.

Μετράτε λοιπόν ΔΥΟ σήματα ακριβώς την ίδια στιγμή, το σήμα που θέλετε να μετρήσετε και ένα ρολόι αναφοράς. Αυτό το ρολόι αναφοράς πρέπει να έχει μια ακριβή τιμή και να είναι σταθερό, ένας κανονικός ταλαντωτής κρυστάλλων είναι εντάξει. Η τιμή δεν είναι πολύ σημαντική αρκεί να είναι υψηλής συχνότητας και η τιμή της είναι γνωστή.

Μετά από κάποιο χρονικό διάστημα, ας πούμε λίγα χιλιοστά του δευτερολέπτου, κάνετε την είσοδο D του D-flipflop ξανά χαμηλή. Στην επόμενη είσοδο ΡΟΛΟΟΥ η έξοδος Q ακολουθεί την κατάσταση της εισόδου, αλλά δεν συμβαίνει τίποτα άλλο επειδή ο μικροελεγκτής έχει ρυθμιστεί να αντιδρά μόνο σε σήμα RISING. Στη συνέχεια, αφού τελειώσει ο χρόνος μέτρησης (περίπου 1 δευτερόλεπτο) κάνετε την είσοδο D Υ HIGHΗΛΗ.

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

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

Ο δεύτερος αριθμός είναι ο αριθμός των παλμών από το σήμα εισόδου που μετράμε. Καθώς ξεκινήσαμε ακριβώς στις άκρες του σήματος αυτού, είμαστε πολύ σίγουροι για τον αριθμό των παλμών αυτού του σήματος εισόδου.

Τώρα είναι απλώς ένας υπολογισμός για τον προσδιορισμό της συχνότητας του σήματος εισόδου.

Ένα παράδειγμα, ας πούμε ότι έχουμε αυτά τα σήματα και θέλουμε να μετρήσουμε την είσοδο f. Η αναφορά είναι 10 MHz, που παράγεται από έναν ταλαντωτή κρυστάλλου χαλαζία. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), ο χρόνος μέτρησης είναι περίπου. 1 δευτερόλεπτο

Σε αυτό το διάστημα μετρήσαμε 32 παλμούς. Τώρα, μια περίοδος αυτού του σήματος διαρκεί 1 / 31.416 = 31830,9 uS. Έτσι 32 περίοδοι μας πήραν 1.0185892 δευτερόλεπτα, που είναι λίγο περισσότερο από 1 δευτερόλεπτο.

Σε αυτό το 1.0186 δευτερόλεπτο επίσης θα έχουμε μετρήσει 10185892 παλμούς του σήματος αναφοράς.

Αυτό μας δίνει τις ακόλουθες πληροφορίες: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Ο τύπος για τον υπολογισμό της προκύπτουσας συχνότητας είναι ο εξής: freq = (input_count * f_reference) / ref_count

Στο παράδειγμά μας είναι: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

Και αυτό λειτουργεί καλά για χαμηλές συχνότητες καθώς και υψηλές συχνότητες, μόνο όταν το σήμα εισόδου πλησιάσει (ή και υψηλότερα από) στη συχνότητα αναφοράς, είναι προτιμότερο να χρησιμοποιήσετε τον τυπικό τρόπο "μέτρησης". Αλλά τότε θα μπορούσαμε επίσης απλά να προσθέσουμε ένα διαχωριστή συχνότητας στο σήμα εισόδου καθώς αυτή η αμοιβαία μέθοδος έχει την ίδια ανάλυση για οποιαδήποτε συχνότητα (μέχρι την αναφορά ξανά). Έτσι, είτε μετράτε 100 kHz απευθείας διαιρούμενο με εξωτερικό διαιρέτη 1000x, η ανάλυση είναι η ίδια.

Βήμα 3: Το υλικό και το σχηματικό του

Το υλικό και το σχηματικό του
Το υλικό και το σχηματικό του
Το υλικό και το σχηματικό του
Το υλικό και το σχηματικό του

Έχω κάνει μερικούς από αυτούς τους τύπους μετρητών συχνοτήτων. Πριν από πολύ καιρό έφτιαξα ένα με ένα ATMEGA328 (το ίδιο χειριστήριο όπως υπάρχει σε ένα Arduino), αργότερα με μικροελεγκτές ARM από την ST. Το τελευταίο έγινε με STM32F407 χρονισμένο στα 168 MHz. Τώρα όμως αναρωτήθηκα τι θα κάνω αν κάνω το ίδιο με ένα * πολύ * μικρότερο. Επέλεξα ένα ATTINY2313, που έχει μόλις 2kbyte μνήμης FLASH και 128 byte μνήμης RAM. Η οθόνη που έχω είναι MAX7219 με 8 οθόνες επτά τμημάτων, αυτές οι οθόνες είναι διαθέσιμες στο Ebay για μόλις 2 Ευρώ. Ένα ATTINY2313 μπορεί να αγοραστεί για περίπου 1,5 Ευρώ, τα υπόλοιπα μέρη που χρησιμοποίησα κοστίζουν μόλις σεντς το τεμάχιο. Το πιο ακριβό ήταν πιθανώς το πλαστικό κουτί του έργου. Αργότερα αποφάσισα να το κάνω να λειτουργεί με μπαταρία ιόντων λιθίου, οπότε χρειάστηκε να προσθέσω έναν (LDO) σταθεροποιητή τάσης 3,3V μια μονάδα φόρτισης μπαταρίας και την ίδια την μπαταρία. Αυτό αυξάνει κάπως την τιμή, αλλά υποθέτω ότι μπορεί να κατασκευαστεί για λιγότερο από 20 Ευρώ.

Βήμα 4: Ο κώδικας

Ο κώδικας
Ο κώδικας
Ο κώδικας
Ο κώδικας

Ο κωδικός γράφτηκε σε C με το Atmel (Microchip) Studio 7 και προγραμματίστηκε στο ATTINY2313 χρησιμοποιώντας OLIMEX AVR_ISP (κλώνος;). Ανοίξτε το (main.c) στο παρακάτω αρχείο zip εάν θέλετε να ακολουθήσετε την περιγραφή εδώ.

ΑΡΧΙΚΟΠΟΙΗΣΗ

Πρώτα ο ATTINY2313 ορίστηκε να χρησιμοποιεί έναν εξωτερικό κρύσταλλο καθώς ο εσωτερικός ταλαντωτής RC είναι άχρηστος για τη μέτρηση οτιδήποτε. Χρησιμοποιώ έναν κρύσταλλο 10 MHz που ρυθμίζω στη σωστή συχνότητα 10 000 000 Hz με έναν μικρό μεταβλητό πυκνωτή. Η προετοιμασία φροντίζει για τη ρύθμιση των θυρών σε εισόδους και εξόδους, τη ρύθμιση των χρονομετρητών και την ενεργοποίηση διακοπών και προετοιμασίας του MAX7219. Το TIMER0 έχει ρυθμιστεί για να μετρά ένα εξωτερικό ρολόι, το TIMER1 το εσωτερικό ρολόι και επίσης για να καταγράφει την τιμή του μετρητή στην ανερχόμενη άκρη του ICP, που προέρχεται από το D-flipflop.

Θα συζητήσω το κύριο πρόγραμμα τελευταίο, οπότε ακολουθούν οι ρουτίνες διακοπής.

TIMER0_OVF

Καθώς το TIMER0 μετράει έως και 255 (8 bit) και στη συνέχεια κυλά στο 0, χρειαζόμαστε μια διακοπή για να μετρήσουμε τον αριθμό των υπερχειλίσεων. Αυτό είναι το μόνο που κάνει το TIMER0_OVF, απλά μετρήστε τον αριθμό υπερχείλισης. Αργότερα αυτός ο αριθμός συνδυάζεται με την τιμή του ίδιου του μετρητή.

TIMER1_OVF

Το TIMER1 μπορεί να μετρήσει έως και 65536 (16 bit), οπότε η διακοπή TIMER1_OVF μετρά επίσης τον αριθμό των υπερχειλίσεων. Κάνει όμως περισσότερα. Μειώνεται επίσης από 152 σε 0 που διαρκεί περίπου 1 δευτερόλεπτο και στη συνέχεια ορίζει έναν πείρο εξόδου, πηγαίνοντας στην είσοδο D του flipflop. Και το τελευταίο πράγμα που γίνεται σε αυτή τη ρουτίνα διακοπής είναι η μείωση του μετρητή χρονικού ορίου, πηγαίνοντας από 765 σε 0, που διαρκεί περίπου 5 δευτερόλεπτα.

TIMER1_CAPT

Αυτή είναι η διακοπή TIMER1_CAPT που ενεργοποιείται κάθε φορά που το D-flipflop του στέλνει ένα σήμα, στην ανερχόμενη άκρη του σήματος εισόδου (όπως εξηγήθηκε παραπάνω). Η λογική σύλληψης φροντίζει για την αποθήκευση της τιμής του μετρητή TIMER1 τη στιγμή της λήψης, αποθηκεύεται καθώς και του μετρητή υπερχείλισης. Δυστυχώς, το TIMER0 δεν διαθέτει λειτουργία λήψης εισόδου, οπότε εδώ διαβάζεται η τρέχουσα τιμή του και η τρέχουσα τιμή του μετρητή υπερχείλισης. Μια μεταβλητή μηνύματος έχει οριστεί σε μία για το κύριο πρόγραμμα να της πει ότι πρόκειται για νέα δεδομένα.

Ακολουθούν δύο λειτουργίες για τον έλεγχο του MAX7219

SPI

Ενώ υπάρχει ένα Universal Serial Interface (USI) διαθέσιμο στο τσιπ επέλεξα να μην το χρησιμοποιήσω. Η οθόνη MAX7219 πρέπει να ελέγχεται μέσω SPI και αυτό είναι δυνατό με το USI. Αλλά το bitbanging SPI είναι τόσο απλό που δεν πήρα χρόνο να το κάνω με το USI.

MAX7219

Το πρωτόκολλο για τη ρύθμιση του MAX7219 είναι επίσης πολύ απλό μόλις διαβάσετε το εγχειρίδιο του. Χρειάζεται μια τιμή 16 bit για κάθε ψηφίο που αποτελείται από 8 bit για τον ψηφιακό αριθμό (1 έως 8) και ακολουθείται από 8 bits για τον αριθμό που πρέπει να εμφανιστεί.

ΚΥΡΙΟ-ΠΡΟΓ

Το τελευταίο πράγμα είναι να εξηγήσετε το κύριο πρόγραμμα. Τρέχει σε έναν άπειρο βρόχο (ενώ (1)) αλλά στην πραγματικότητα κάνει κάτι όταν υπάρχει ένα μήνυμα (1) από τη ρουτίνα διακοπής ή όταν ο μετρητής χρονικού ορίου έχει μειωθεί στο μηδέν (χωρίς σήμα εισόδου).

Το πρώτο πράγμα που πρέπει να κάνετε όταν το μεταβλητό μήνυμα έχει οριστεί σε ένα, είναι να επαναφέρετε τον μετρητή χρονικού ορίου, αφού ξέρουμε ότι υπάρχει σήμα. Το D-flipflop επαναφέρεται για να είναι έτοιμο για την επόμενη σκανδάλη που θα έρθει μετά το χρόνο μέτρησης (αναμονή-δευτερόλεπτο).

Οι αριθμοί που είναι εγγεγραμμένοι στη διακοπή λήψης προστίθενται για να δώσουν τον αριθμό αναφοράς και τον αριθμό συχνοτήτων εισόδου. (πρέπει να διασφαλίσουμε ότι η αναφορά δεν μπορεί ποτέ να είναι μηδενική καθώς θα τη διαιρέσουμε αργότερα)

Ακολουθεί ο υπολογισμός της πραγματικής συχνότητας. Σίγουρα δεν θέλω να χρησιμοποιήσω κυμαινόμενους αριθμούς σε έναν μικροελεγκτή με μόλις 2kbytes φλας και μόνο 128 byte ram χρησιμοποιώ ακέραιους αριθμούς. Αλλά οι συχνότητες μπορεί να είναι σαν 314,159 Hz, με πολλά δεκαδικά ψηφία. Ως εκ τούτου, πολλαπλασιάζω τη συχνότητα εισόδου όχι μόνο με τη συχνότητα αναφοράς, αλλά και με έναν πολλαπλασιαστή και στη συνέχεια προσθέτω έναν αριθμό στο σημείο που πρέπει να πάει το δεκαδικό. Αυτοί οι αριθμοί θα γίνουν πολύ μεγάλοι όταν το κάνετε. Π.χ. με είσοδο 500 kHz, αναφορά 10 MHz και πολλαπλασιαστή 100, αυτό δίνει 5 x 10^14, αυτό είναι πραγματικά τεράστιο! Δεν θα χωρέσουν καθόλου σε έναν αριθμό 32 bit, οπότε χρησιμοποιώ αριθμούς 64 bit που θα φτάσουν μέχρι το 1,8 x 10^19 (λειτουργεί καλά σε ATTINY2313)

Και το τελευταίο πράγμα που πρέπει να κάνετε είναι να στείλετε το αποτέλεσμα στην οθόνη MAX7219.

Ο κώδικας συγκεντρώνεται σε περίπου 1600 byte, επομένως ταιριάζει στο φλας των 2048 byte που διατίθεται στο ATTINY2313.

Τα μητρώα ασφαλειών πρέπει να έχουν την εξής μορφή:

ΕΠΕΚΤΑΣΕΤΑΙ 0xFF

Υ HIGHΗΛΟ 0xDF

ΧΑΜΗΛΟ 0xBF

Βήμα 5: Ακρίβεια και ακρίβεια

Ακρίβεια και Ακρίβεια
Ακρίβεια και Ακρίβεια
Ακρίβεια και Ακρίβεια
Ακρίβεια και Ακρίβεια
Ακρίβεια και Ακρίβεια
Ακρίβεια και Ακρίβεια

Η ακρίβεια και η ακρίβεια είναι δύο ξεχωριστά θηρία. Η ακρίβεια εδώ είναι επτά ψηφία, η πραγματική ακρίβεια εξαρτάται από το υλικό και τη βαθμονόμηση. Βαθμονόμησα τα 10 MHz (5 MHz στο σημείο δοκιμής) με έναν άλλο μετρητή συχνοτήτων που διαθέτει πειθαρχημένο ταλαντωτή GPS.

Και λειτουργεί αρκετά καλά, η χαμηλότερη συχνότητα που δοκίμασα είναι 0,2 Hz, η υψηλότερη 2 MHz. Είναι επί τόπου. Πάνω από 2 MHz ο ελεγκτής αρχίζει να χάνει διακοπές, δεν προκαλεί έκπληξη όταν γνωρίζετε ότι στα σήματα εισόδου 2 MHz το TIMER0 δημιουργεί πάνω από 7800 διακοπές ανά δευτερόλεπτο. Και το ATTINY2313 πρέπει να κάνει και άλλα πράγματα, τις διακοπές από το TIMER1, με άλλες 150 διακοπές ανά δευτερόλεπτο και φυσικά να κάνει τους υπολογισμούς, ελέγχοντας την οθόνη και το D-flipflop. Όταν κοιτάξετε την πραγματική συσκευή, θα δείτε ότι χρησιμοποιώ μόνο επτά από τα οκτώ ψηφία της οθόνης. Το κάνω για διάφορους λόγους.

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

Οι πυκνωτές που το ρυθμίζουν στα σωστά 10 MHz είναι κεραμικοί, πολύ ευαίσθητοι στις αλλαγές θερμοκρασίας. Στη συνέχεια, υπάρχει το γεγονός ότι το TIMER0 δεν έχει ενσωματωμένη λογική καταγραφής και όλες οι λειτουργίες διακοπής χρειάζονται λίγο χρόνο για να κάνουν τη δουλειά τους. Νομίζω ότι ούτως ή άλλως τα επτά ψηφία είναι αρκετά καλά.

Συνιστάται: