Arduino Timer: Spielen Sie mit dem Timing in Ihren Projekten

Timer Arduino UNO

Vor einiger Zeit haben wir weitere Informationen über die veröffentlicht millis()-Funktion de ArduinoJetzt werden wir tiefer in die eintauchen Arduino-Timer, um mit dieser Funktion für die Funktion zu beginnen, verstehen Sie, wie dieses Board die Zeit mit der MCU verwaltet, sowie andere Funktionen über millis() hinaus.

Was ist der Arduino-Timer?

Arduino-Timer

El Arduino-Timer oder Timer, ist eine durch Hardware implementierte Funktion (im Mikrocontroller mit Hilfe des Quarzkristalls, der die Taktimpulse erzeugt und den „Rhythmus“ vorgibt, ohne dass externe Hardware oder ICs 555 erforderlich sind), die es ermöglicht, temporäre Ereignisse dank Uhren zu steuern intern. Beispielsweise eine Aufgabe in Intervallen ausführen, genaue Zeitmessungen vornehmen usw., unabhängig vom Sketch-Code.

Como Arduino UNO Es hat einen MCU-Chip, der mit 16 MHz arbeitet, 16.000.000 könnten jede Sekunde ausgeführt werden. Die Befehle benötigen zur Ausführung X Zyklen, nicht alle werden in denselben Taktzyklen ausgeführt, zum Beispiel benötigen die 16-Bit-Befehle mehr Zyklen in dieser AVR-Architektur.

Stellen Sie sich vor, Sie verwenden die delay()-Funktion, blockiert dies die Ausführung auf der Arduino MCU, bis die angegebene Zeit abgelaufen ist, und fährt dann mit dem Programm fort, aber der Timer wird nicht blockiert. Es wird zeitgesteuert, während die MCU weiterhin andere Befehle gleichzeitig ausführt. Das ist der große Vorteil.

Der Timer hängt mit zusammen Unterbrechungen von Arduino, da sie durch sie ausgeführt werden, um eine bestimmte Aufgabe zu erfüllen. Mit anderen Worten, der Arduino Timer ist eine Funktion, die zu einem bestimmten Zeitpunkt ausgelöst wird und eine Interrupt-Funktion ausführt. Deshalb ist es auch wichtig, über diese Unterbrechungen Bescheid zu wissen.

Modi

Der Arduino Timer hat 2 Betriebsarten, in der Lage sein, es zu verwenden in:

  • PWM-Signal: Sie können die steuern Arduino-Stifte (~).
  • CTC (Timer bei Vergleichsspiel löschen): zählt die Zeit innerhalb eines Zählers und wenn sie den in einem Register der Timer angegebenen Wert erreicht, wird die Unterbrechung ausgeführt.

Wie viele Timer hat es? Arten von Timern

Arduino UNO Millis-Funktionen

Da 3 Timer auf den Tellern Arduino UNO, obwohl es auf anderen Deckplatten möglicherweise mehr gibt:

  • Zeitschaltuhr 0: 8-Bit, kann von 0 bis 255 zählen (256 mögliche Werte). Wird von Funktionen wie delay(), millis() und micros() verwendet. Seine Änderung wird nicht empfohlen, um die Programme nicht zu verändern.
  • Zeitschaltuhr 1: gleich Timer 0. Wird von der Servo-Bibliothek in UNO verwendet (Timer 5 für MEGA).
  • Zeitschaltuhr 2: 16-Bit und kann von 0 bis 65.525 (65.536 mögliche Werte) reichen. Wird für die Funktion Tone () verwendet, wenn sie nicht verwendet wird, kann sie für Ihre Anwendung frei verwendet werden.
  • Timer 3, 4, 5 (nur bei Arduino MEGA): alle 16-Bit.

Wie funktioniert der Arduino-Timer?

Timer, Timer

Um Arbeite mit einem Arduino Timer, ist es wichtig zu wissen, wie das alles elektronisch in der MCU dieses Entwicklungsboards funktioniert:

  • Taktfrequenz: ist die Anzahl der Zyklen pro Sekunde, die es entwickeln kann, im Fall von Arduino sind es 16 MHz, oder was dasselbe ist, das Taktsignal oszilliert 16.000.000 Mal in einer Sekunde (Zyklen).
  • Zeitraum: wird durch T dargestellt und wird in Sekunden gemessen und ist die Umkehrung der Zyklen. Zum Beispiel T=1/C, was 1/16000000 = 0.0000000625 ergeben würde, die Zeit, die jeder Zyklus zum Abschließen benötigen würde. Und die Frequenz ist das Inverse der Periode, also f = 1/T.
  • Zyklus: ist jeweils eine der Wiederholungen des Signals, die pro Zeiteinheit auftreten. Auf Arduino wären es 16 Millionen in einer Sekunde. Oder was dasselbe ist, in diesem Fall, wenn 16 Millionen Zyklen vergangen sind, ist eine Sekunde vergangen. Daher kann gesagt werden, dass ein Zyklus 625 ns dauert.
  • Flanke eines Signals: Taktsignale sind quadratisch und die Flanken können steigend oder fallend sein. Eine Flanke ist die gerade Linie des Signals, wenn es sich ändert von:
    • 0 (niedrig) bis 1 (hoch): steigende Flanke.
    • 1 (hoch) bis 0 (niedrig): fallende Flanke.

Flanken sind wichtig, weil Arduino-Timer Zyklen von Signalflanken messen. A) Ja der Kontador es erhöht sich mit jedem Zyklus und wenn es den Registerwert erreicht, wird der Interrupt ausgeführt.

Daher, sobald Sie dies wissen, wenn Sie es haben 16 MHz auf der Arduino MCU, und ein 8-Bit-Timer verwendet wird, kann gesagt werden, dass Interrupts alle 16 μs (256/16000000) oder 4 ms für 16-Bit (65536/16000000) auftreten. Wenn Sie also das 16-Bit-Zählerregister mit dem Wert 65535 auf das Maximum setzen, wird der Interrupt bei 4 ms ausgeführt, um die jeweilige Aufgabe auszuführen.

Wenn der Zähler den maximal möglichen Wert erreicht, es geht wieder auf 0 zurück. Das heißt, es tritt ein Überlauf auf und es wird von Anfang an zurückgezählt.

Um die Anstiegsrate des Timers zu steuern, können Sie auch verwenden ein Prescaler, das die Werte 1, 8, 64, 256 und 1024 annimmt und das Timing wie folgt ändert:

Timer-Geschwindigkeit (Hz) = Taktfrequenz von Arduino / Prescaler

Wenn es 1 ist, erhöht der Prescaler der Controller auf 16 MHz, wenn es 8 auf 2 MHz ist, wenn es 64 auf 250 kHz ist, und so weiter. Denken Sie daran, dass es einen Timer-Zähler-Zustandskomparator geben wird, um den Wert des Zählers und des Vorteilers zu vergleichen, bis sie gleich sind, und dann eine Aktion auszuführen. Damit, Unterbrechungsfrequenz ergibt sich aus der Formel:

+1 liegt daran, dass das Zählerregister auf 0 indiziert ist, d.h. es beginnt nicht bei 1 zu zählen, sondern bei 0.

Interrupt-Geschwindigkeit (Hz) = Arduino / Prescaler-Taktfrequenz (Vergleichsregisterwert + 1)

Zum Glück müssen wir das nicht Datensätze ändern der Arduino-Timer, da dies von den Bibliotheken erledigt wird, die wir im Code verwenden. Aber wenn sie nicht verwendet werden, sollten sie konfiguriert werden.

Beispiele in der Arduino IDE

Arduino IDE, Datentypen, Programmierung

Um das alles etwas besser zu verstehen, zeige ich hier zwei Sketch-Codes für die Arduino IDE, mit denen man die Verwendung von Timern erleben kann. Der erste ist ein Code, der jede Sekunde eine LED blinkt, die mit Arduino Pin 8 verbunden ist:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

Programmieren Sie das Blinken oder Blinken der LED wie im vorherigen Fall im Sekundentakt, diesmal jedoch mit CTC d.h. Vergleich:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

Mehr über die Arduino-Programmierung

einen Teller kaufen Arduino UNO Rev. 3

Schreiben Sie den ersten Kommentar

Hinterlasse einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert mit *

*

*

  1. Verantwortlich für die Daten: Miguel Ángel Gatón
  2. Zweck der Daten: Kontrolle von SPAM, Kommentarverwaltung.
  3. Legitimation: Ihre Zustimmung
  4. Übermittlung der Daten: Die Daten werden nur durch gesetzliche Verpflichtung an Dritte weitergegeben.
  5. Datenspeicherung: Von Occentus Networks (EU) gehostete Datenbank
  6. Rechte: Sie können Ihre Informationen jederzeit einschränken, wiederherstellen und löschen.