Tak, w zależności od podstawowej częstotliwości zegara Twojego Arduino. Na przykład tutaj są częstotliwości wejściowe licznika czasu i okresy po wstępnym skalowaniu, licznik 2 licznika ATMega2560 oraz podstawowa częstotliwość 16 MHz. Timer ma wbudowane opcje wartości „prescaler”, które określają częstotliwość / okres, pokazane w tej tabeli:
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
Aby uzyskać lepszą rozdzielczość czasową, użyj wartości o nazwie TCNT2. Istnieje wbudowany licznik, który zmienia się od 0 do 255, ponieważ zegar ma 8 bitów. Kiedy licznik osiągnie wartość przypisaną przez TCNT2, wyzwala przerwanie. To przerwanie nosi nazwę TIMER2_OVF_vect.
biorąc pod uwagę te informacje, wynikowa częstotliwość przerwań wyniesie: 16 MHz / (prescaler * (255 - TCNT2))
Możesz sprawić, aby zegar działał z pełną częstotliwością 16 MHz (62,5 nSek), ale jest to o wiele szybsze niż potrzebujesz; 2 MHz z początkową liczbą (255-2) dałoby Ci częstotliwość przerwań 1 MHz. Podziel to przez 2 w swoim ISR:
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
};
Arkusz danych MCU jest podstawowym zasobem; ten artykuł da ci (i dał mi!) dobry początek.