J’aime la programmation de microcontrôleur Arduino, et je l’utilise régulièrement dans la recherche aérospatiale, ainsi que dans les projets de maison. Comme je travaille sur mes nombreux projets maison, cependant, je me surprends qui ont besoin d’une minuterie très précise. C’est parce que mon objectif de projets de maison autour avion Radio commande (RC) et des signaux de communication de hobby RC sont axés sur la synchronisation des signaux. Ces signaux de communication RC est appelés PWM (Pulse Width Modulation) et PPM (Pulse Position Modulation). Dans les signaux, une déviation de bâton complet dans un seul sens, sur un émetteur radio à main, correspond généralement à ~ 1000us (microsecondes), et une déviation de bâton complet dans le sens inverse correspond à ~ 2000us.
Pour mesurer le temps dans ces signaux, j’ai utilisé tout d’abord l’Arduino micros() fonction, en conjonction avec les interruptions externes. La fonction intégrée de micros() Arduino est bon, mais pas assez bon pour mes besoins. Il a une précision de 4us (voir ici). Cela signifie que, si je lis dans un signal PWM que je connais est exactement 1500us (position Centre-bâton sur un émetteur manuel), je verrais lectures de 1496, 1504, 1500 et même parfois 1492 ou 1508us. Il s’agit de trop d’écart.
Alors... J’ai regardé et j’ai regardé et j’ai cherché une solution. La seule solution que j’ai pu trouver utilisé Timer1 du microcontrôleur Atmega328, qui est inacceptable pour mes besoins, car alors je perds d’utilisation de l' Arduino bibliothèque de servo. Donc, j’ai décidé de faire une tonne de lecture et de descendre dans les entrailles du microcontrôleur, accédant directement à temporisateurs de l’Atmel et écrire ma propre fonction de minuterie.
De cette entreprise est née ma Timer2_Counter « bibliothèque », qui fournit des fonctions qui peuvent être utilisés à la place de la fonction micros(), et qui fournissent une précision de 0.5us, qui est mieux que la fonction micros() 8 x !
Pour plus d’informations sur mon code, ainsi que la dernière version de mon code, y compris une liste complète de ses fonctions, reportez-vous à mon article ici :
Fonction micros() Arduino avec 0.5us précision - à l’aide de mon Timer2_Counter "Bibliothèque".