Sì, a seconda della frequenza di clock di base del tuo Arduino. Ad esempio, ecco le frequenze di ingresso e i periodi del contatore del timer dopo il pre-ridimensionamento, per il contatore del timer 2 di un ATMega2560 e una frequenza di clock di base di 16 MHz. Il timer ha incorporato opzioni di valore "prescaler" che determinano la frequenza / periodo, mostrato in questa tabella:
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
Per una migliore risoluzione di temporizzazione, si utilizza un valore chiamato TCNT2. C'è un contatore incorporato che va da 0 a 255 perché il timer è di 8 bit. Quando il contatore raggiunge il valore assegnato da TCNT2 innesca un interrupt. Questo interrupt si chiama TIMER2_OVF_vect.
date queste informazioni, la frequenza di interruzione risultante sarebbe: 16MHz / (prescaler * (255 - TCNT2))
È possibile far funzionare il timer alla piena 16MHz (62.5nSec) anche se è molto più veloce del necessario; 2MHz con un conteggio iniziale di (255-2) darebbe una frequenza di interruzione di 1MHz. Dividilo per 2 nel tuo 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
};
La scheda tecnica per il tuo MCU è la risorsa di base; questo articolo ti darà (e mi ha dato!) un buon vantaggio.