Précision de l'horloge Arduino

10

J'essaie actuellement de créer une horloge Arduino en utilisant la bibliothèque de temps PJRC ( http://www.pjrc.com/teensy/td_libs_Time.html ). Je sais que puisque la plupart des cartes Arduino fonctionnent avec une horloge de 16 MHz et un seul résonateur, le temps peut devenir "désynchronisé" après un certain laps de temps.

Cependant, je me demandais si quelqu'un avait une idée de la précision de la bibliothèque de temps lorsqu'elle est utilisée sur l'Arduino DUE avec une horloge à 84 MHz. Je l'ai testé et jusqu'à présent, l'horloge a été synchronisée pendant quelques heures. Merci!

KK6FSL
la source
Les limites de précision de la bibliothèque dépendent de la précision du cristal. Disons que vous avez un cristal qui s'éteint de 0,5 seconde toutes les heures, idéal pour le court terme, mais si vous l'étendez sur une année, il est plus d'une heure à ce moment-là. Si vous voulez que quelque chose garde une heure précise sur une longue période, je suggère une horloge en temps réel (ils ont encore des inexactitudes), un module GPS ou une connexion Internet pour se synchroniser.
Jesse Laning
@jamolnng Merci pour votre réponse. Connaissez-vous la précision du cristal sur l'Arduino DUE ou où pourrais-je aller le trouver?
KK6FSL
La meilleure précision que vous obtiendrez est de 84 MHz, lorsqu'ils fabriquent ou font cuire le cristal, ils ne peuvent le rendre que dans une certaine mesure, l'environnement du cristal (température, humidité, etc.) joue également un rôle dans la précision de celui-ci.
Jesse Laning
@jamolnng Puis-je m'attendre à une précision plus élevée avec le cristal 84MHz plutôt qu'avec le cristal 16MHz sur la plupart des autres Arduinos?
KK6FSL
5
"La meilleure précision que vous obtiendrez est de 84 MHz" - cela n'a pas beaucoup de sens pour moi!
Cybergibbons

Réponses:

10

Les limites de précision de la bibliothèque dépendent de la précision du cristal. Lorsqu'ils fabriquent ou font cuire le cristal, ils ne peuvent le rendre que dans une certaine mesure, l'environnement du cristal (température, humidité, etc.) joue également un rôle dans sa précision. Disons que vous avez un cristal qui s'éteint de 0,5 seconde toutes les heures, idéal pour le court terme, mais si vous l'étendez sur une année, il est plus d'une heure à ce moment-là. Si vous voulez que quelque chose garde une heure précise sur une longue période, je suggère une horloge en temps réel (ils ont encore des inexactitudes), un module GPS ou une connexion Internet pour se synchroniser.

Pour plus d'informations, consultez l' article de wikipedia sur les cristaux de quartz

L'utilisation d'un cristal à 84 MHz par rapport à un cristal à 16 MHz n'améliorera pas nécessairement la précision de l'horloge Arduino car la fréquence du cristal est plus un indicateur de la vitesse du processeur que de la précision. La précision de l'horloge Arduino dépend principalement de la précision de l'oscillateur à cristal.

EDIT: Je ne suis pas un expert des oscillateurs à cristal, donc si vous voyez quelque chose de mal ici, faites le moi savoir

Jesse Laning
la source
5

Revisiter une vieille question ... car j'ai trouvé un article de blog très instructif qui jette un nouvel éclairage dessus. Mais permettez-moi d'abord de fournir un certain contexte avant de donner le lien.

Lors de l'évaluation de la qualité d'une base de temps, qu'il s'agisse d'un cristal, d'un résonateur en céramique ou d'un étalon de fréquence de laboratoire, il convient de distinguer deux notions:

  • précision : quelle est la fréquence de la base de temps à sa valeur nominale
  • stabilité : combien cette fréquence dérive-t-elle au fil du temps

La précision est importante si vous voulez que votre horloge donne l'heure exacte «prête à l'emploi». Cependant, si vous êtes prêt à passer un peu de temps à calibrer votre horloge, vous ne vous en souciez pas vraiment, car vous allez calibrer toute inexactitude que vous mesurez. La réponse de jfpoilpret fournit un exemple de protocole d'étalonnage «manuel», qui est par nécessité assez long. Si vous pouvez emprunter un module GPS avec une sortie 1PPS, l'étalonnage pourrait être effectué en quelques secondes.

La stabilité est un problème plus grave. Si la fréquence de la base de temps dérive de manière aléatoire, cela annulera vos efforts d'étalonnage. Essentiellement, l'étalonnage vous indiquera la vitesse ou le ralentissement de votre horloge en ce moment , mais il ne vous permettra pas de prédire la vitesse ou la lenteur de son exécution à l'avenir .

Voici le lien promis: précision de la fréquence d'horloge Arduino , par Joris van Rantwijk.

Ce que Joris a fait, c'est mesurer la précision et la stabilité d'un Arduino Pro Mini (cadencé d'un résonateur en céramique) et d'un vieux Duemilianove (cristal de quartz). De mon point de vue, les principaux points à retenir sont les suivants:

  • les deux horloges sont grossièrement imprécises, donc les deux auraient besoin d'un étalonnage par l'utilisateur pour être utilisées comme montres
  • le cristal de quartz du Duemilianove a une stabilité décente, meilleure que 1,5e-8 à 6 h de temps moyen
  • la stabilité du résonateur en céramique du Pro Mini est pathétique, plus de deux ordres de grandeur pire que le cristal, ce qui le rend essentiellement inutile comme pièce d'horlogerie

Voici son graphique de déviation d'Allan , qui mesure l'instabilité de l'horloge en fonction du temps d'observation:

Déviation d'Allan de la fréquence d'horloge Arduino
(source: jorisvr.nl )

Bien que cette étude présente certaines limites (seulement deux planches ont été testées et le temps d'observation est trop court), elle est bien pensée et très informative. Je vous encourage à le lire en entier.

Edgar Bonet
la source
1
La fréquence des cristaux de quartz change légèrement avec la température. Si vous pouvez contrôler la température, cela aide à maintenir la fréquence stable.
Duncan C
3

La meilleure façon de connaître la précision du résonateur de votre carte est de le mesurer vous-même.

Pour ce faire, vous pouvez utiliser la millis()fonction Arduino de votre carte et écrire un petit croquis qui:

  1. vous permet de régler l'heure de début de mesure de la dérive du temps (par exemple avec un simple bouton-poussoir); vous déclencherez le bouton en fonction d'une base de temps précise .
  2. puis appeler à plusieurs reprises millis () jusqu'à ce qu'au moins 120h ("heures arduino", soit environ 5 jours) se soient écoulées
  3. afficher un signal lorsque ces 120h se sont écoulées (votre croquis devrait probablement vous "avertir" avant l'heure exacte afin que vous soyez prêt pour la mesure)
  4. lorsque les 120 heures se sont écoulées, vérifiez votre temps de référence basé (utilisé à l'étape 1.) et vérifiez combien de temps s'est écoulé (devrait être 120 heures +/- epsilon)
  5. une fois que vous connaissez la dérive de votre horloge, et à condition que votre planche fonctionne dans les mêmes conditions environnementales (température principalement) de votre mesure, vous pouvez l'utiliser dans vos croquis pour ajuster la millis()valeur toutes les heures environ.

Bien sûr, cette approche est loin d'être parfaite car elle nécessite une intervention humaine et créera donc des dérives de temps supplémentaires pendant les mesures, c'est pourquoi vous devez mesurer vos dérives d'horloge sur une longue période.

Une approche améliorée serait de connecter une horloge RTC de haute précision (la précision doit être choisie en fonction de la précision dont vous avez besoin pour votre application) à votre carte et d'adapter le croquis afin qu'il calcule automatiquement la dérive. Une fois que vous avez obtenu la dérive du temps, vous pouvez faire la même chose que l'étape 5 ci-dessus dans vos croquis et déconnecter l'horloge RTC de votre carte.

Points importants :

  • mesurer la dérive de temps sur la carte qui nécessitera un ajustement d'horloge plus tard (si vous avez plusieurs cartes, vous devez mesurer une dérive par carte)
  • assurer la stabilité de l'environnement dans lequel votre planche sera utilisée

Enfin, si vous avez vraiment besoin d'une grande précision, connectez définitivement une source d'horloge externe (par exemple, horloge RTC, GPS, NTP) à votre carte et utilisez-la comme SyncProvider pour la bibliothèque PJRC.

jfpoilpret
la source
2

Le cristal d'horloge de votre système moyen sera éteint de plusieurs dizaines ppm (parties par million. Ils sont parfaits pour une synchronisation stable et précise des signaux, mais dramatique pour garder une heure précise. Sans dispositions spéciales, le cristal du système peut être éteint de plusieurs secondes par jour.

La solution consiste à utiliser une horloge en temps réel appropriée, entraînée par ce que l'on appelle communément un cristal de montre à 32 768 Hz. Ces cristaux sont facilement 10 fois plus précis. Vous pouvez soit configurer votre propre oscillateur qui interrompt le processeur principal et garder le décompte dans votre croquis Arduino, soit trouver une carte de dérivation RTC.

Deux exemples aléatoires qui apparaissent dans Google avec les termes de recherche "RTC breakout":

jippie
la source