Sim, dependendo da taxa de clock básica do seu Arduino. Por exemplo, aqui estão as frequências de entrada do contador e os períodos após a pré-escala, para um contador 2 do ATMega2560 e uma taxa básica de clock de 16 MHz. O timer incorporou opções de valor "prescaler" que determinam a frequência / período, mostradas nesta tabela:
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 uma melhor resolução de temporização, use um valor chamado TCNT2. Há um contador de compilação que varia de 0 a 255 porque o timer é de 8 bits. Quando o contador atinge o valor atribuído pelo TCNT2, ele aciona uma interrupção. Essa interrupção é chamada TIMER2_OVF_vect.
com essas informações, a taxa de interrupção resultante seria: 16 MHz / (pré-calibrador * (255 - TCNT2))
Você pode fazer com que o timer funcione a 16MHz (62,5nSec), embora isso seja muito mais rápido do que você precisa; 2 MHz com uma contagem inicial de (255-2) forneceriam uma taxa de interrupção de 1 MHz. Divida isso por 2 no seu 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
};
A folha de dados para o seu MCU é o recurso básico; este artigo dará a você (e me deu!) um bom avanço.