Étape 1: Convertisseurs et le registre de correspondance de comparer
Le premier paramètre que j’aborderai est la vitesse à laquelle le minuteur incrémente le compteur. L’horloge de l’Arduino tourne à 16MHz, il s’agit de la plus grande vitesse que les minuteries peuvent incrémenter leurs compteurs. À 16MHz, chaque graduation du compteur représente 1/16 000 000 de seconde (~ 63ns), donc un compteur aura 10/16 000 000 secondes pour atteindre une valeur de 9 (compteurs sont indexés de 0) et 100/16 000 000 secondes pour atteindre une valeur de 99.
Dans de nombreuses situations, vous trouverez qu’il est trop rapide de réglage de la vitesse de compteur à 16MHz. Timer0 et timer2 sont des minuteries de 8 bits, ce qui signifie qu’ils peuvent stocker une valeur de compteur maximale de 255. Timer1 est un temporisateur de 16 bits, ce qui signifie qu'il peut stocker une valeur de compteur maximale de 65535. Une fois qu’un compteur atteint son maximum, il cocheront retour à zéro (cela s’appelle le débordement). Cela signifie à 16MHz, même si nous avons sur le registre de correspondance de comparer la valeur du compteur max, interruptions produira toutes les 256/16 000 000 secondes (~ 16us) pour les compteurs de 8 bits et chaque 65 536/16 000 000 secondes (~ 4 ms) pour le compteur 16 bits. De toute évidence, ce n’est pas très utile si vous souhaitez uniquement d’interrompre une fois par seconde.
Au lieu de cela, vous pouvez contrôler la vitesse de l’incrémentation du compteur minuterie à l’aide de ce qu’on appelle un diviseur. Un Prédiviseur dicte la vitesse de votre minuterie selon la l’équation suivante :
(vitesse de minuterie (Hz)) = (vitesse d’horloge Arduino (16MHz)) / diviseur
Donc un 1 diviseur s’incrémente le compteur à 16MHz, un diviseur 8 il incrémentera à 2MHz, un Prédiviseur 64 = 250kHz et ainsi de suite. Comme il est indiqué dans les tableaux ci-dessus, le diviseur peut être égal à 1, 8, 64, 256 et 1024. (Je vais vous expliquer le sens de CS11 CS12 et de CS10 dans l’étape suivante.)
Maintenant, vous pouvez calculer la fréquence d’interruption avec l’équation suivante :
interrompre la fréquence (Hz) = (Arduino vitesse d’horloge 16 000, 000Hz) / (prescaler * (Comparez match Registre + 1))
+ 1 est dans là car le comparer correspondent aux Registre est zéro indexé
réarrangeant l’équation ci-dessus, vous pouvez résoudre pour la valeur de Registre compare match qui donnera à votre fréquence d’interruption souhaitée :
comparer le registre de correspondance = [16 000, 000Hz / (prescaler * désiré fréquence interrupt)] - 1
n’oubliez pas que lorsque vous utilisez des minuteries 0 et 2 ce nombre doit être inférieure à 256 et inférieure à 65536 de timer1
donc, si vous vouliez une interruption par seconde (fréquence de 1Hz) :
comparer le registre de correspondance = [16 000 000 / (prescaler * 1)] -1
avec un diviseur de 1024, vous obtenez :
comparer le registre de correspondance = [16 000 000 / (1024 * 1)] -1
= 15 624
depuis 256 < 15 624 < 65 536, vous devez utiliser timer1 pour cette interruption.