- Τι είναι το TIMER στα ενσωματωμένα ηλεκτρονικά;
- Μητρώα χρονοδιακόπτη Arduino
- Διακοπές χρονοδιακόπτη Arduino
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος
- Προγραμματισμός χρονοδιακόπτη Arduino UNO
Η πλατφόρμα ανάπτυξης Arduino αναπτύχθηκε αρχικά το 2005 ως μια εύχρηστη προγραμματιζόμενη συσκευή για έργα τέχνης. Σκοπός του ήταν να βοηθήσει μη μηχανικούς να δουλέψουν με βασικά ηλεκτρονικά και μικροελεγκτές χωρίς πολλές γνώσεις προγραμματισμού. Αλλά τότε, λόγω της εύχρηστης φύσης του, προσαρμόστηκε σύντομα από αρχάριους και χομπίστες ηλεκτρονικών ειδών σε όλο τον κόσμο και σήμερα προτιμάται ακόμη και για ανάπτυξη πρωτοτύπων και εξελίξεων POC.
Ενώ είναι εντάξει να ξεκινήσετε με το Arduino, είναι σημαντικό να μετακινηθείτε αργά στους βασικούς μικροελεγκτές όπως AVR, ARM, PIC, STM κ.λπ. και να τον προγραμματίσετε χρησιμοποιώντας τις εγγενείς εφαρμογές τους. Αυτό οφείλεται στο γεγονός ότι η γλώσσα προγραμματισμού Arduino είναι πολύ κατανοητή, καθώς το μεγαλύτερο μέρος της εργασίας γίνεται από προεγκατεστημένες λειτουργίες όπως digitalWrite (), AnalogWrite (), Delay () κ.λπ. ενώ η γλώσσα μηχανής χαμηλού επιπέδου κρύβεται πίσω από αυτές. Τα προγράμματα Arduino δεν είναι παρόμοια με άλλα ενσωματωμένα C κωδικοποίηση όπου ασχολούμαστε με τα bit εγγραφής και τα κάνουμε υψηλά ή χαμηλά με βάση τη λογική του προγράμματος μας.
Χρονόμετρα Arduino χωρίς καθυστέρηση:
Ως εκ τούτου, για να κατανοήσουμε τι συμβαίνει μέσα στις προ-ενσωματωμένες συναρτήσεις πρέπει να σκάψουμε πίσω από αυτούς τους όρους. Για παράδειγμα, όταν χρησιμοποιείται μια συνάρτηση καθυστέρησης (), ορίζει πραγματικά τα bit Timer και Counter Register του μικροελεγκτή ATmega.
Σε αυτό το σεμινάριο χρονοδιακόπτη arduino πρόκειται να αποφύγουμε τη χρήση αυτής της λειτουργίας καθυστέρησης () και αντίθετα να ασχοληθούμε με τους ίδιους τους Μητρώους. Το καλό είναι ότι μπορείτε να χρησιμοποιήσετε το ίδιο Arduino IDE για αυτό. Θα ρυθμίσουμε τα bit του Timer register και θα χρησιμοποιήσουμε το Timer Overflow Interrupt για εναλλαγή ενός LED κάθε φορά που συμβαίνει η διακοπή. Η τιμή προ-φόρτωσης του bit Timer μπορεί επίσης να ρυθμιστεί χρησιμοποιώντας κουμπιά για τον έλεγχο της διάρκειας στην οποία πραγματοποιείται η διακοπή.
Τι είναι το TIMER στα ενσωματωμένα ηλεκτρονικά;
Ο χρονοδιακόπτης είναι είδος διακοπής. Είναι σαν ένα απλό ρολόι που μπορεί να μετρήσει το χρονικό διάστημα ενός συμβάντος. Κάθε μικροελεγκτής έχει ένα ρολόι (ταλαντωτής), ας πούμε στο Arduino Uno ότι είναι 16Mhz. Αυτό είναι υπεύθυνο για την ταχύτητα. Όσο υψηλότερη είναι η συχνότητα του ρολογιού, θα είναι η ταχύτητα επεξεργασίας. Ένας χρονοδιακόπτης χρησιμοποιεί μετρητή ο οποίος μετρά με συγκεκριμένη ταχύτητα ανάλογα με τη συχνότητα του ρολογιού. Στο Arduino Uno χρειάζονται 1/16000000 δευτερόλεπτα ή 62nano δευτερόλεπτα για να γίνει μια μέτρηση. Αυτό σημαίνει ότι ο Arduino μετακινείται από μία οδηγία σε άλλη εντολή για κάθε 62 νανο δευτερόλεπτο.
Χρονοδιακόπτες σε Arduino UNO:
Στο Arduino UNO υπάρχουν τρία χρονόμετρα που χρησιμοποιούνται για διαφορετικές λειτουργίες.
Χρονόμετρο0:
Είναι χρονοδιακόπτης 8-bit και χρησιμοποιείται σε λειτουργία χρονοδιακόπτη όπως καθυστέρηση (), millis ().
Χρονόμετρο1:
Είναι χρονοδιακόπτης 16-bit και χρησιμοποιείται στη σερβο βιβλιοθήκη.
Χρονοδιακόπτης2:
Είναι χρονοδιακόπτης 8-bit και χρησιμοποιείται σε λειτουργία τόνου ().
Μητρώα χρονοδιακόπτη Arduino
Για να αλλάξετε τη διαμόρφωση των χρονομέτρων, χρησιμοποιούνται καταχωρητές χρονοδιακόπτη.
1. Μητρώα χρονοδιακόπτη / μετρητή ελέγχου (TCCRnA / B):
Αυτός ο καταχωρητής κρατά τα κύρια bits ελέγχου του χρονοδιακόπτη και χρησιμοποιείται για τον έλεγχο των prescalers του χρονοδιακόπτη. Επιτρέπει επίσης τον έλεγχο της λειτουργίας του χρονοδιακόπτη χρησιμοποιώντας τα bit WGM.
Μορφή καρέ:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
Τα bits CS12, CS11, CS10 στο TCCR1B ορίζουν την τιμή prescaler. Χρησιμοποιείται ένα prescaler για τη ρύθμιση της ταχύτητας ρολογιού του χρονοδιακόπτη. Το Arduino Uno έχει προεπιλογές 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | ΧΡΗΣΗ |
0 | 0 | 0 | Χωρίς χρονοδιακόπτη STOP |
0 | 0 | 1 | CLCK i / o / 1 Χωρίς Προκατασκευή |
0 | 1 | 0 | CLK i / o / 8 (Από το Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (Από το Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (Από Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (Από Prescaler) |
1 | 1 | 0 | Πηγή εξωτερικού ρολογιού στο T1 Pin. Ρολόι στην άκρη |
1 | 1 | 1 | Πηγή εξωτερικού ρολογιού στον ακροδέκτη T1. Ρολόι σε άνοδο. |
2. Μητρώο χρονοδιακόπτη / μετρητή (TCNTn)
Αυτό το Μητρώο χρησιμοποιείται για τον έλεγχο της τιμής μετρητή και για τον ορισμό μιας τιμής προφόρτισης.
Τύπος για την τιμή προφόρτωσης για τον απαιτούμενο χρόνο σε δευτερόλεπτο:
TCNTn = 65535 - (16x10 10 x Χρόνος σε δευτερόλεπτο / Τιμή Prescaler)
Για τον υπολογισμό της τιμής προφόρτισης για το χρονόμετρο1 για χρόνο 2 δευτερολέπτων
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Διακοπές χρονοδιακόπτη Arduino
Στο παρελθόν μάθαμε για τις Διακοπές του Arduino και έχουμε δει ότι οι διακοπές του χρονοδιακόπτη είναι είδος διακοπής λογισμικού. Υπάρχουν διάφορες διακοπές χρονοδιακόπτη στο Arduino που εξηγούνται παρακάτω.Διακοπή υπερχείλισης χρονοδιακόπτη:
Κάθε φορά που ο χρονοδιακόπτης φτάνει στη μέγιστη τιμή του, για παράδειγμα (16 Bit-65535) εμφανίζεται η διακοπή υπερχείλισης χρονοδιακόπτη . Επομένως, καλείται μια ρουτίνα υπηρεσίας διακοπής ISR όταν το bit Timer Overflow Interrupt ενεργοποιείται στο TOIEx που υπάρχει στον καταχωρητή μάσκας διακοπής χρονοδιακόπτη TIMSKx.
Μορφή ISR:
ISR (TIMERx_OVF_vect) { }
Μητρώο σύγκρισης εξόδου (OCRnA / B):
Εδώ όταν εμφανιστεί η έξοδος σύγκρισης αντιστοίχισης εξόδου τότε καλείται η υπηρεσία διακοπής ISR (TIMERx_COMPy_vect) και επίσης το bit σημαίας OCFxy θα οριστεί στον καταχωρητή TIFRx. Αυτό το ISR ενεργοποιείται ρυθμίζοντας bit ενεργοποίησης στο OCIExy που υπάρχει στο μητρώο TIMSKx. Όπου TIMSKx είναι Timer Interrupt Mask Register.
Λήψη εισόδου χρονοδιακόπτη:
Στη συνέχεια, όταν εμφανιστεί το χρονόμετρο Input Capture Interrupt, τότε καλείται η υπηρεσία διακοπής ISR (TIMERx_CAPT_vect) και επίσης το bit σημαίας ICFx θα ρυθμιστεί στο TIFRx (Timer Interrupt Flag Register). Αυτό το ISR ενεργοποιείται ρυθμίζοντας το bit ενεργοποίησης στο ICIEx που υπάρχει στον καταχωρητή TIMSKx.
Απαιτούμενα στοιχεία
- Arduino UNO
- Κουμπιά (2)
- LED (οποιοδήποτε χρώμα)
- 10k Αντίσταση (2), 2.2k (1)
- Οθόνη LCD 16x2
Διάγραμμα κυκλώματος
Συνδέσεις κυκλώματος μεταξύ του Arduino UNO και της οθόνης LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Στο κεντρικό πείρο ποτενσιόμετρου για έλεγχο αντίθεσης LCD |
RS |
8 |
RW |
GND |
μι |
9 |
Δ4 |
10 |
Δ5 |
11 |
Δ6 |
12 |
Δ7 |
13 |
ΕΝΑ |
+ 5V |
κ |
GND |
Δύο κουμπιά Push με αντίσταση προς τα κάτω 10K συνδέονται με τους ακροδέκτες Arduino 2 & 4 και ένα LED συνδέεται στο PIN 7 του Arduino μέσω αντίστασης 2.2K.
Η ρύθμιση θα μοιάζει με την παρακάτω εικόνα.
Προγραμματισμός χρονοδιακόπτη Arduino UNO
Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε το TIMER OVERFLOW INTERRUPT και θα το χρησιμοποιήσουμε για να αναβοσβήνει η λυχνία ON και OFF για ορισμένη διάρκεια, ρυθμίζοντας την τιμή προφόρτισης (TCNT1) χρησιμοποιώντας κουμπιά. Ο πλήρης κωδικός για το Arduino Timer δίνεται στο τέλος. Εδώ εξηγούμε τον κωδικό γραμμή προς γραμμή:
Δεδομένου ότι η οθόνη LCD 16x2 χρησιμοποιείται στο έργο για την εμφάνιση της τιμής προφόρτισης, έτσι χρησιμοποιείται βιβλιοθήκη υγρών κρυστάλλων.
#περιλαμβάνω
Ο πείρος ανόδου LED που συνδέεται με τον πείρο Arduino 7 ορίζεται ως ledPin .
# καθορισμός ledPin 7
Στη συνέχεια, το αντικείμενο πρόσβασης στην κατηγορία Liquid Crystal δηλώνεται με τους ακροδέκτες LCD (RS, E, D4, D5, D6, D7) που συνδέονται με το Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Στη συνέχεια, ορίστε την τιμή προ-φόρτωσης 3035 για 4 δευτερόλεπτα. Ελέγξτε τον παραπάνω τύπο για να υπολογίσετε την τιμή προφόρτισης.
τιμή float = 3035;
Στη συνέχεια, στην κενή ρύθμιση (), ρυθμίστε πρώτα την οθόνη LCD σε λειτουργία 16x2 και εμφανίστε ένα μήνυμα καλωσορίσματος για λίγα δευτερόλεπτα.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); καθυστέρηση (2000); lcd.clear ();
Στη συνέχεια, ορίστε τον πείρο LED ως πείρο OUTPUT και τα κουμπιά Push ορίζονται ως ακίδες INPUT
pinMode (ledPin, OUTPUT); pinMode (2, ΕΙΣΟΔΟΣ); pinMode (4, ΕΙΣΟΔΟΣ);
Στη συνέχεια απενεργοποιήστε όλες τις διακοπές:
noInterrupts ();
Στη συνέχεια αρχίζει το Timer1.
TCCR1A = 0; TCCR1B = 0;
Η τιμή του χρονοδιακόπτη προ-φόρτωσης έχει οριστεί (Αρχικά ως 3035).
TCNT1 = τιμή;
Στη συνέχεια, η τιμή Pre scaler 1024 ορίζεται στον καταχωρητή TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
Το Timer overflow interrupt είναι ενεργοποιημένο στον καταχωρητή Timer Interrupt Mask έτσι ώστε να μπορεί να χρησιμοποιηθεί το ISR.
TIMSK1 - = (1 << TOIE1);
Επιτέλους όλες οι διακοπές είναι ενεργοποιημένες.
διακόπτει ();
Τώρα γράψτε το ISR για Timer Overflow Interrupt, το οποίο είναι υπεύθυνο για την ενεργοποίηση και απενεργοποίηση των LED χρησιμοποιώντας το digitalWrite . Η κατάσταση αλλάζει κάθε φορά που προκύπτει διακοπή υπερχείλισης χρονοδιακόπτη.
ISR (TIMER1_OVF_vect) { TCNT1 = τιμή; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Στον κενό κύκλο () η τιμή του προφόρτισης αυξάνεται ή μειώνεται χρησιμοποιώντας τις εισόδους του κουμπιού και επίσης η τιμή εμφανίζεται σε οθόνη LCD 16x2.
if (digitalRead (2) == ΥΨΗΛΟΣ) { value = value + 10; // Incement preload value } if (digitalRead (4) == ΥΨΗΛΟΣ) { value = value-10; // Μείωση τιμής προφόρτωσης } lcd.setCursor (0,0); lcd.print (τιμή); }
Έτσι λοιπόν μπορεί να χρησιμοποιηθεί ένας χρονοδιακόπτης για την καθυστέρηση του προγράμματος Arduino. Ελέγξτε το παρακάτω βίντεο όπου έχουμε δείξει την αλλαγή καθυστέρησης αυξάνοντας και μειώνοντας την τιμή προφόρτισης χρησιμοποιώντας τα κουμπιά.