La documentation de micros () note que la valeur de retour sera toujours un multiple de 4.
Existe-t-il un moyen d'obtenir un clic de microseconde de résolution plus élevée, de préférence jusqu'au niveau 1 microseconde?
La descente au niveau AVR est acceptable.
Réponses:
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:
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:
La fiche technique de votre MCU est la ressource de base; cet article vous donnera (et m'a donné!) une bonne longueur d'avance.
la source
Mark, j'ai décidé d'écrire un nouvel ensemble de fonctions, basé sur l'Arduino Atmega328 Timer2, et en utilisant des interruptions de débordement, pour obtenir une précision à 0,5us. Mon code est disponible pour téléchargement et utilisation ici:
http://electricrcaircraftguy.blogspot.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html
Voici une brève description: "J'ai écrit un" libary "pour obtenir une précision de 0,5us sur une fonction de remplacement" micros () ", afin que je puisse obtenir des résultats reproductibles en lisant un signal PWM ou PPM, à moins de 1us. J'ai cherché tout autour du Internet et ne pouvait pas trouver quelque chose de comparable (ou qui était facile à utiliser et qui maintenait la capacité de l'Arduino à écrire des signaux PWM via le Servo Libary), donc je pense que c'est ma première contribution majeure au monde de l'Arduino et du contrôle radio. "
la source
Si le passage au niveau AVR est acceptable (comme vous l'avez mentionné dans votre question), vous pouvez configurer une minuterie et même obtenir les tics de l'horloge de l'AVR.
Vous devez vous référer à la fiche technique de votre AVR car elle diffère selon les différents ATMegas et ATTinys. Mais la procédure est toujours la même. Ce que vous devez faire, c'est:
TCCR
De cette façon, vous pouvez obtenir les graduations exactes du registre de la minuterie, mais vous devez compter les débordements manuellement. C'est aussi précis que possible par la technologie.
Voici un exemple de code pour l'AT90S2313 obsolète, mais il vous donne de bons conseils sur la marche à suivre:
la source
TIMSK
,TOIE0
etc. (copie de la configuration du minuteur à partir de la fiche technique atmega328p). Il semble que vous ne puissiez pas utiliser la macro ISR (), utilisez plutôt arduino.cc/en/Reference/AttachInterrupt .