In der Dokumentation zu micros () wird darauf hingewiesen, dass der Rückgabewert immer ein Vielfaches von 4 ist.
Gibt es eine Möglichkeit, einen Mikrosekundenklick mit höherer Auflösung zu erzielen, vorzugsweise bis auf 1 Mikrosekunde?
Das Herunterfallen auf den AVR-Wert ist akzeptabel.
Antworten:
Ja, abhängig von der Grundtaktrate Ihres Arduino. Hier sind zum Beispiel die Eingangsfrequenzen und Perioden des Zählertimers nach der Vorskalierung für den Zählertimer 2 eines ATMega2560 und eine Grundtaktrate von 16 MHz. Der Timer verfügt über integrierte "Prescaler" -Wertoptionen, die die Frequenz / Periode bestimmen (siehe Tabelle):
Für eine bessere Timing-Auflösung verwenden Sie einen Wert namens TCNT2. Es gibt einen eingebauten Zähler, der von 0 bis 255 reicht, da der Timer 8 Bit ist. Wenn der Zähler den von TCNT2 zugewiesenen Wert erreicht, löst er einen Interrupt aus. Dieser Interrupt heißt TIMER2_OVF_vect.
Angesichts dieser Informationen wäre die resultierende Interrupt-Rate: 16 MHz / (Vorteiler * (255 - TCNT2))
Sie könnten den Timer mit den vollen 16 MHz (62,5 nSec) laufen lassen, obwohl dies viel schneller ist als nötig. 2 MHz mit einer Anfangszählung von (255-2) ergeben eine Interruptrate von 1 MHz. Teilen Sie das in Ihrem ISR durch 2:
Das Datenblatt für Ihre MCU ist die grundlegende Ressource. Dieser Artikel gibt Ihnen (und gab mir!) einen guten Vorsprung.
quelle
Mark, ich habe beschlossen, einen neuen Satz von Funktionen zu schreiben, der auf dem Arduino Atmega328 Timer2 basiert und Überlauf-Interrupts verwendet, um eine Genauigkeit von 0,5 us zu erreichen. Mein Code kann hier heruntergeladen und verwendet werden:
http://electricrcaircraftguy.blogspot.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html
Hier ist eine kurze Beschreibung: "Ich habe eine" Bibliothek "geschrieben, um eine Genauigkeit von 0,5 us für eine" micros () "- Ersatzfunktion zu erhalten, damit ich wiederholbare Ergebnisse beim Lesen eines PWM- oder PPM-Signals innerhalb von 1us erhalten kann. Ich habe überall in der Welt gesucht Internet und konnte nichts Vergleichbares finden (oder das war einfach zu bedienen und behielt die Fähigkeit des Arduino bei, PWM-Signale über die Servo Libary zu schreiben), daher denke ich, dass dies mein erster wichtiger Beitrag zur Welt von Arduino und Radio Control ist. "
quelle
Wenn es akzeptabel ist, auf den AVR-Pegel zu fallen (wie Sie in Ihrer Frage erwähnt haben), können Sie einen Timer einrichten und sogar die Ticks der AVR-Uhr abrufen.
Sie müssen sich auf das Datenblatt Ihres AVR beziehen, da es sich innerhalb der verschiedenen ATMegas und ATTinys unterscheidet. Das Verfahren ist jedoch immer das gleiche. Was Sie tun müssen, ist:
TCCR
Auf diese Weise können die genauen Ticks aus dem Timer-Register abgerufen werden. Sie müssen die Überläufe jedoch manuell zählen. Dies ist technisch so präzise wie möglich.
Hier ist ein Beispielcode für den veralteten AT90S2313, der Ihnen jedoch gute Hinweise gibt, was Sie grundsätzlich tun sollten:
quelle
TIMSK
,TOIE0
etc (Kopieren Timer - Setup aus dem ATmega328P Datenblatt). Es sieht so aus, als könnten Sie das Makro ISR () nicht verwenden, sondern stattdessen arduino.cc/en/Reference/AttachInterrupt .