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):
TCCR2B bits 2-0 Prescaler Freq [KHz], Period [usec] after prescale
0x0 (TC stopped) -- --
0x1 1 16000. 0.0625
0x2 8 2000. 0.500
0x3 32 500. 2.000
0x4 64 250. 4.000
0x5 128 125. 8.000
0x6 256 62.5 16.000
0x7 1024 15.625 64.000
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:
extern uint32_t MicroSecClock = 0;
ISR(TIMER2_OVF_vect) {// this is a built in function that gets called when the timer gets to the overflow counter number
static uint_8 count; // interrupt counter
if( (++count & 0x01) == 0 ) // bump the interrupt counter
++MicroSecClock; // & count uSec every other time.
digitalWrite(53,toggle);// pin 53 is arbitrary
TCNT2 = 253; // this tells the timer when to trigger the interrupt. when the counter gets to 253 out of 255(because the timer is 8 bit) the timmer will trigger an interrupt
TIFR2 = 0x00; // clear timer overflow flag
};
Das Datenblatt für Ihre MCU ist die grundlegende Ressource. Dieser Artikel gibt Ihnen (und gab mir!) einen guten Vorsprung.