Oui, en fonction de la fréquence d'horloge de base de votre Arduino. Par exemple, voici les fréquences et les périodes d'entrée du temporisateur après la mise à l'échelle, pour le compteur 2 d'un ATMega2560, et une fréquence d'horloge de base de 16 MHz. Le temporisateur a intégré des options de valeur "pré-échelle" qui déterminent la fréquence / période, comme indiqué dans ce tableau:
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
Pour une meilleure résolution de synchronisation, vous utilisez une valeur appelée TCNT2. Il y a un compteur intégré qui va de 0 à 255 car le temporisateur est à 8 bits. Lorsque le compteur atteint la valeur attribuée par TCNT2, il déclenche une interruption. Cette interruption est appelée TIMER2_OVF_vect.
compte tenu de ces informations, le taux d'interruption résultant serait: 16 MHz / (pré-échelle * (255 - TCNT2))
Vous pouvez faire fonctionner la minuterie à la fréquence complète de 16 MHz (62,5 ns), bien que ce soit beaucoup plus rapide que nécessaire; 2 MHz avec un décompte initial de (255-2) vous donnerait un taux d'interruption de 1 MHz. Divisez cela par 2 dans votre 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 fiche technique de votre MCU est la ressource de base; cet article vous donnera (et m'a donné!) une bonne longueur d'avance.