Sí, dependiendo de la velocidad de reloj básica de tu Arduino. Por ejemplo, aquí están las frecuencias de entrada del contador / temporizador y los períodos posteriores a la escala previa, para el contador / temporizador 2 de ATMega2560, y una velocidad de reloj básica de 16MHz. El temporizador ha incorporado opciones de valor "preescalador" que determinan la frecuencia / período, que se muestra en esta tabla:
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
Para una mejor resolución de temporización, utiliza un valor llamado TCNT2. Hay un contador integrado que va de 0 a 255 porque el temporizador es de 8 bits. Cuando el contador alcanza el valor asignado por TCNT2, se dispara una interrupción. Esta interrupción se llama TIMER2_OVF_vect.
dada esta información, la tasa de interrupción resultante sería:
16 MHz / (prescaler * (255 - TCNT2))
Podría hacer que el temporizador se ejecute a 16MHz completos (62.5nSec), aunque es mucho más rápido de lo que necesita; 2 MHz con un recuento inicial de (255-2) le daría una tasa de interrupción de 1 MHz. Divide eso por 2 en tu 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 hoja de datos de su MCU es el recurso básico; este artículo le dará (¡y me dio!) una buen comienzo.