La réponse acceptée de jfpoilpret est très bien écrite, parfaitement valable et dans 99% des cas je ferai exactement ce qu'il explique. Ses solutions sont bien dans vos paramètres définis, donc elles devraient très bien fonctionner. Mais quoi de mieux que " très bien "? La perfection! Après tout, la question est de générer une valeur exacte. Comme dit assez proche est bon dans la plupart des cas (sans doute tous), et même lorsqu'il s'agit de quelque chose comme des horloges quand 1 seconde doit être 1 seconde, vous devez toujours souffrir d'imperfections héritées des pièces.
Ce que je proposerai n'est pas toujours possible. Dans certains cas, c'est possible, mais avec beaucoup plus de tracas et d'efforts que dans ce cas. Cela vaut-il la peine de dépendre au cas par cas. Mon objectif est principalement de montrer une alternative pour de futures références qui est meilleure dans des cas quelque peu marginaux. Ceci est écrit avec les utilisateurs Arduino novices à l'esprit qui n'ont pas une vaste expérience en électronique.
Pour les personnes plus avancées, cela semblera probablement trop verbeux et stupide. Mais je crois que ces mêmes personnes le savent probablement déjà et n'ont pas besoin de cette réponse. Cela s'applique également à chaque microcontrôleur et à chaque fabricant et architecture. Mais pour les autres microcontrôleurs, vous devrez consulter la fiche technique correcte pour trouver les registres appropriés et les noms et valeurs de pré-échelle.
Dans votre cas, vous avez besoin d'une fréquence spécifique et ce qu'il y a de bien, c'est qu'en réalité, 56 kHz peuvent être atteints très facilement (sans compter les imperfections pratiques des pièces). C'est donc également un exemple parfait.
La génération d'un signal dépend des temporisateurs et de la source d'horloge du microcontrôleur, comme l'explique bien jfpoilpret. Sa réponse ne traite que du problème d'un seul point de vue, c'est-à-dire qu'il s'agit de minuteries. Mais vous pouvez également jouer avec la source d'horloge, ou encore mieux avec les deux pour une synergie et des résultats impressionnants. En modifiant les paramètres de l'environnement, dans ce cas, en piratant le système et en remplaçant la source d'horloge, nous pouvons traiter un problème spécifique avec beaucoup, beaucoup plus de facilité et de simplicité.
Tout d'abord pour rappeler, en raison du basculement de l'état des broches, vous devez exécuter l'ISR deux fois plus que la fréquence du signal. C'est 112 000 fois par seconde. 56 000 et 16 000 000 ne s'additionnent pas très bien comme déjà souligné. Nous devons changer la fréquence du signal ou la fréquence du toucher. Traitons pour l'instant d'une fréquence de signal immuable et trouvons une meilleure vitesse d'horloge.
Il serait plus simple de choisir une horloge avec un ordre de grandeur supérieur à 56 kHz (ou 112 kHz, mais c'est pratiquement le même), car vous n'ajoutez que des zéros et ce type de calcul est le plus simple pour la plupart des gens. Malheureusement, tout dans ce monde est une sorte de compromis avec quelque chose. Toutes les valeurs ne fonctionneront pas.
Le premier exemple est avec une vitesse de générateur de tact trop faible.
Si vous choisissez une horloge à 56 000 Hz, vous ne pourrez rien faire car vous devrez appeler l'ISR à chaque cycle et ne pourrez rien faire d'autre. C'est totalement inutile. Si vous choisissez une vitesse 10 fois plus rapide (560 kHz), vous aurez 9 (10 cycles pour que la minuterie atteigne sa valeur maximale - un cycle pour appeler la fonction ISR) des cycles de microcontrôleur pour faire votre travail et cela est tout à fait possible peut ne pas être suffisant. Vous avez simplement souvent besoin de plus de puissance de calcul.
Si vous choisissez une valeur beaucoup trop grande d'autre part, comme 56 MHz, le microcontrôleur ne peut tout simplement pas fonctionner avec. C'est beaucoup trop rapide. Donc, choisir simplement la plus grande valeur dans la boutique ne la réduira pas non plus.
L'Arduino Uno R3 d'origine a une horloge standard à 16 MHz, donc tout ce qui est plus lent que garanti. La prochaine valeur qui est un ordre de grandeur supérieur à 56 et inférieur à 16 MHz est 5,6 MHz. Cela permettra d'appeler l'ISR tous les 50 cycles et de créer la fréquence de minuterie de 112 000 Hz parfaite. Et votre signal sera exactement de 56 kHz. Vous aurez 49 cycles MCU pour exécuter votre programme entre les appels ISR, mais c'est toujours environ 1/3 de la vitesse de l'horloge d'origine. On peut utiliser le 112 comme base et utiliser une horloge de 11,2 MHz, ce qui donnera environ 2/3 du résonateur de 16 MHz d'origine. La fonction ISR sera appelée tous les 100 cycles et générera toujours un signal parfait de 56 kHz.
Cependant, deux problèmes majeurs existent avec ces valeurs.
Le premier problème dépend fortement de vos besoins: vous sacrifiez environ 1/3 (avec 11,2 MHz) de votre puissance de calcul maximale pour obtenir la fréquence de signal exacte qui utilise une valeur de registre facile à trouver (OCR iirc ). Cela peut vous convenir ou non.
Le deuxième problème est un showstopper dur : il est très facile de trouver des valeurs, mais très souvent elles n'existent tout simplement pas comme source d'horloge fabriquée. Il s'agit de la page Web du résonateur de Farnell qui manque tout simplement de 5,6 MHz et 11,2 MHz.
Pour contourner cela, nous pouvons regarder les valeurs de résonateur disponibles et découvrir quelque chose d'autre qui peut être utilisé pour générer des valeurs exactement souhaitées. Si nous divisons 56 par 4, nous obtenons 14 et heureusement, il y a un résonateur à 14 MHz. Cela nous donne une vitesse beaucoup plus élevée et plus de puissance et une valeur de registre tout aussi facile à trouver. Pour appeler l'ISR 112000 fois par seconde, nous devons mettre la valeur décimale 124 ou hexadécimale 0x7C dans le registre OCR, donc en comptant 124 cycles + 1 pour appeler l'ISR, nous obtenons la valeur parfaite souhaitée.
NB
- ISR - routine de service d'interruption (c'est le code qui est exécuté uniquement sur les interruptions générées)
- La taille de votre programme dépend de la taille de la mémoire! Cela n'a rien à voir avec la vitesse d'horloge et n'a rien à voir avec la fréquence à laquelle vous appelez l'ISR.
Lorsque le microcontrôleur démarre avec une commande de programme, un compteur est incrémenté. Si une interruption est générée, l'ISR est appelé et cette valeur est stockée dans un registre spécial. Lorsque le code ISR est terminé, la valeur du compteur de programme est restaurée à partir de ce registre spécial et le programme continue d'où il a été interrompu comme s'il ne s'était jamais produit.
Je vais donner un exemple extrêmement stupide. Si vous êtes puriste, je vous préviens: des saignements de nez et d'oeil peuvent survenir.
Imaginez que vous deviez marcher d'un endroit à un autre. Les instructions d'itinéraire étape par étape sont votre programme principal et ses commandes. La vitesse à laquelle vous marchez ou courez dépend de votre "vitesse d'horloge", mais pas des instructions de l'itinéraire (30 pas en avant, 1 tour à 90 degrés à gauche, 10 pas en avant, 45 degrés à droite, etc.) Ils sont toujours les mêmes . Imaginez maintenant un petit enfant ou un politicien local corrompu et gourmand qui détache vos chaussures de temps en temps. Il s'agit de l'événement qui génère une interruption. Ensuite, vous vous arrêtez après votre dernière étape, vous agenouillez et attachez à nouveau votre chaussure. Ceci est votre programme ISR.
Ensuite, vous continuez de l'endroit où vous vous êtes arrêté; vous ne partez pas du début. Lorsque vous marchez sans souci dans le monde et avec tout le temps, vous ne vous souciez pas même si vous devez attacher votre chaussure à chaque étape. Cependant, si vous le faites avec des contraintes de temps, comme courir sur 100 mètres aux Jeux olympiques (ou fuir un prédateur mangeur de chair affamé), arrêter et attacher vos chaussures peut avoir des conséquences désastreuses. C'est la même chose avec les microcontrôleurs. Même si vous n'exécutez qu'une seule ligne de code, votre programme continuera, bien que lentement. Si vous ne vous souciez pas du tout de la vitesse, ce ne sera pas un problème. Si vous devez faire un certain temps, comme utiliser d'autres actions dépendant de la minuterie, les interférences peuvent être très indésirables et problématiques.
Moins est plus! Une horloge plus rapide n'est pas toujours meilleure. Les appareils cadencés plus lentement consomment beaucoup moins d'énergie. Cela peut être un point crucial dans un appareil fonctionnant sur batterie.
Les cycles nécessaires sont dérivés de ces formules:
(vitesse d'horloge / (valeur de mise à l'échelle * fréquence d'appel ISR requise)) - 1