Comment pourrais-je faire fonctionner un petit oscillateur avec une précision de 31 891 269 116 µHz?

15

Je cherche à construire un module RTC pour Arduino qui fonctionne à l'heure de Mars. Le facteur de conversion est de 1,0274912510 seconde terrestre en 1 seconde mars.

Bien que j'aie réussi à accomplir cela par programme avec une résolution <2 secondes (ce qui n'est pas exactement idéal, je préférerais quelque chose comme 300 ms de précision) en utilisant des calculs à virgule fixe sur un Arduino Uno connecté à un module RTC normal, je suis se demandant s'il serait possible d'avoir une sorte d'oscillateur basse tension fonctionnant précisément à 31.891.269.116 µHz (31.891269116 kHz) qui serait, plus ou moins, interchangeable avec un cristal d'horloge standard de 32 kHz (cependant, je serais ouvert à d'autres idées si tant qu'ils ne sont pas prohibitifs.)

Des idées sur la façon dont cela pourrait être possible? Alternativement, une sorte de minuterie qui se déclenche une fois toutes les 1.0274912510 secondes serait également acceptable.

renégats
la source
13
Pourquoi l'unité étrange (µHz?) C'est 31,891 kHz. Donc, vous cherchez probablement un cristal de montre à 32 kHz.
JRE
21
Commencez par vos besoins. Vous avez spécifié une précision extraordinaire. Pourquoi? Ailleurs, vous dites que vous pouvez faire ce que vous voulez avec un Arduino. Je suis désolé de vous dire cela, mais vous plaisantez, à moins que vous n'utilisiez quelque chose comme une horloge rubidium ou césium comme référence. Alors dites-nous ce que vous faites et quelles sont vos exigences de performance. Ce sont des exigences fonctionnelles, pas vos performances dérivées. Si vous essayez de produire une horloge verrouillée sur une autre, dites-le et faites-nous savoir quelles sont vos exigences (et tolérances).
WhatRoughBeast
46
Vous essayez de résoudre votre manque de compétences en programmation avec du matériel très coûteux et personnalisé. Vous pouvez facilement implémenter une conversion à virgule flottante 256 bits dans un Arduino, ou quelle que soit la précision que vous souhaitez.
pipe
14
Je pense que c'est un excellent exemple de la raison pour laquelle l'inclusion de plus d'informations à l'avance permet aux gens de vous orienter dans la bonne direction. La réponse de Brian Drummond est maintenant la meilleure, ou du moins bon marché et réalisable pour un amateur. C'est également un bon exemple de la raison pour laquelle vous devez être prudent lorsque vous spécifiez la précision et l'exactitude - il existe de nombreux paramètres potentiellement pertinents pour une horloge. Nous n'avons même pas encore discuté de compensation de température ou de gigue.
pjc50
11
"Le facteur de conversion est de 1,0274912510 seconde terrestre en 1 seconde martienne." - confondez-vous la différence de longueur de jour entre Mars et la Terre avec la longueur d'une seconde? La durée d'un jour solaire sur Mars est de 88 775 s, soit 1,02749 jour terrestre (sur 86 400 s). De l'autre et le second est défini par le rayonnement émis par un atome de césium, et même en tenant compte de la dilatation du temps, vous auriez besoin de vitesses d'environ 0,23 c pour obtenir cette différence de 2,7%.
ilkkachu

Réponses:

41

Utilisez un cristal à 32768 kHz comme tout le monde, mais divisez par 33669 à la place, ce qui donne une erreur de -5,08 ppm. (Vous pouvez supprimer cela en ajustant la capacité de charge si vous le souhaitez).

Ce n'est pas précis, mais pour une horloge de Mars, ce sera aussi bon que n'importe quelle horloge à quartz de la Terre. Autrement dit, en ignorant les problèmes de compensation de température pour les températures ambiantes de Mars, la plupart des cristaux de montre ne sont disponibles que pour la Terre, sauf si vous pouvez trouver des fournisseurs martiens ...

J'utiliserais les périphériques de compteur dans un MSP430 pour faire la division, et (en supposant que vous conduisez un mouvement d'horloge mécanique à quartz standard) générer des impulsions bipolaires de 30 ms sur ses broches de sortie chaque seconde, en suivant approximativement les synchronisations d'origine que vous pouvez mesurer sur un oscilloscope.

Arduino ou similaire fera l'affaire, mais le MSP peut être mis en veille entre les impulsions, consommant moins de 1uA avec l'oscillateur LF en marche. Voici un exemple de conception avec le code source et le PCB pour une montre - uniquement l'heure de la Terre jusqu'à présent, bien que cela puisse probablement être corrigé en changeant une constante.

Brian Drummond
la source
1
Je vous remercie! Sur la base d'autres commentaires, je pense que cela semble être l'option la plus viable sans avoir à plonger dans le domaine des horloges atomiques, je l'ai donc choisie comme solution à ma question. J'apprécie également particulièrement le design que vous avez lié.
renégats
Sachez que les chiffres importants que vous avez donnés ne seront pas atteints avec un cristal RTC standard. L'erreur de 5 ppm du calcul sera probablement inférieure à la tolérance aux cristaux.
user2943160
6
@ user2943160 si vous avez une bonne référence, vous pouvez atteindre 1 ppm ou plus avec le réglage initial - il y aura une dérive de quelques ppm sur quelques années et (étrangement pour les cristaux de diapason) une variance parabolique avec la température. Toutes les horloges à quartz bon marché de ma maison fonctionnent à des taux différents, elles n'ont probablement jamais été taillées en usine et ne sont pas beaucoup mieux qu'une horloge à pendule compensée en température.
Brian Drummond
+1 juste pour les "fournisseurs martiens".
Olin Lathrop
41

Vous pouvez faire mieux que la suggestion de Brian Drummond. Bien qu'il puisse être vrai que votre oscillateur est la plus grande source d'erreur dans le système, il n'y a aucune raison d'ajouter une erreur systématique supplémentaire quand c'est assez facile de ne pas le faire.

Réglez votre intervalle de minuterie à 33668 ticks, démarrez un compteur à 0 et à chaque interruption de minuterie, augmentez le compteur de 6754.

Si, après incrémentation, le compteur est> = 8105, soustrayez 8105 et réglez l'intervalle de temporisation pour la seconde suivante à 33669 ticks.

Sinon, laissez le compteur tranquille et définissez l'intervalle de la minuterie pour la seconde suivante sur 33668.

Cela vous donnera (en supposant un cristal parfait à 32,768 kHz) un intervalle moyen de

(33668 + 6754 / 8105) / 32768 ~= 1.0274912510006

secondes (moins d'une erreur partie par billion par rapport à 1,0274912510), au lieu de 1,0274963378906 secondes (près de 5 erreurs partie par million). Cela signifie que la précision à long terme de votre horloge dépendra vraiment de la précision de l'oscillateur; l'erreur due aux mathématiques contribuera sensiblement à moins d'un tick d'erreur par an. Bien que la longueur d'une seule seconde ait une erreur relative jusqu'à 25 ppm, sur des intervalles de moyenne de plus en plus longs, l'erreur disparaît.

Il s'agit de l' algorithme de Bresenham appliqué au chronométrage, et la fraction 6754/8105 a été trouvée comme suit:

32768 * 1,027491251 = 33668,833312768

La fraction continue exacte pour 33668.833312768 est [33668; 1, 4, 1, 1349, 1, 7].

La suppression du dernier terme donne approximativement 33668 + 6754/8105, qui a toutes les parties qui s'intègrent parfaitement dans 16 bits.

Hobbs
la source
16

10101014

Dmitry Grigoryev
la source
J'espérais éviter le matériel coûteux si possible. En ce moment, j'y parviens avec un module RTC normal et un Arduino, et je suis capable de faire la conversion de 1000ms à 1027.4912510ms, mais je n'ai qu'une résolution d'environ 1-2 secondes, ce qui signifie qu'il est autocorrecteur mais n'est pas terriblement précis .
renégats du
12
@renegadeds, vous devez alors indiquer clairement dans votre question quelle précision est acceptable. Et veuillez fournir un peu de contexte: une seule balise [arduino] serait un bon indice que vous ne construisez pas un stand de laboratoire de haute précision.
Dmitry Grigoryev
1
Noté, j'ai mis à jour la question et ajouté la balise Arduino.
renégats
15

Cela pourrait être fait avec un rubidium ou une autre horloge de référence atomique à 10 MHz, peut-être une PLL pour donner (disons) 100 MHz, puis compté avec un accumulateur de phase ~ 36 bits pour donner une résolution de 0,001 Hz. Ce dernier pourrait se faire avec un petit FPGA.

Vous pouvez lire sur les méthodes de synthèse numérique directe (DDS). Il y a des puces qui font le DDS mais peut-être pas avec une largeur de bit aussi large.

Les modules d'horloge Rubidium sont disponibles sur le marché excédentaire ou auprès de fabricants tels que Microsemi.

Spehro Pefhany
la source
7

Vous ne définissez pas «cher», c'est donc quelque chose d'un coup dans le noir.

Commencez avec un générateur commercial (y compris eBay) de 10 MHz. Rubidium pour le choix, mais quelle que soit la précision que vous pouvez obtenir, cela définit vos performances.

Maintenant, construisez un diviseur programmable de 28 bits de long. À 10 MHz, vous pouvez vous en sortir avec la logique CMOS 74HC, mais vous devrez utiliser une configuration de transport rapide. La sortie déclenche également une division par deux bascule qui fournit le bit 29.

Le diviseur peut fonctionner à un rapport de 10 274 ​​912 ou 10 274 ​​913, selon l'état du bit 29. Pour une entrée parfaite à 10 MHz, la période de sortie effective pour le bit 28 sera alors de 1,02749125 secondes, ce qui est approximativement précis à 1 ppb, soit environ 30 msec / an. Une entrée moins précise, bien sûr, produira une sortie moins précise.

En utilisant des 74HC161 standard, vous pouvez le faire avec 8 circuits intégrés, et si vous faites attention, vous pourrez peut-être utiliser une carte de bande de prototypage standard, bien que vous souhaitiez être très prudent en renforçant le système au sol. Perfboard serait moins cher, plus compact et plus durable, mais le câblage serait moins pratique, car vous auriez besoin de souder les connexions. Vous pouvez ensuite le mettre dans quelque chose comme du RTV de qualité électronique (PAS le RTV que vous obtenez à la quincaillerie), pour une taille de module finale de l'ordre de 2 x 2 x 1/2 pouces, sans compter l'oscillateur.

ÉDITER

Notez que votre norme de performance, liée aux RTC "réguliers", est en fait de l'ordre de 1 seconde / jour de précision, ce qui est 30 fois pire que cette approche. Donc, tout d'abord, vous pouvez supprimer le bit 29 ou diviser votre 10 MHz en 5 MHz et utiliser un rapport de 5 137 456. Cette fréquence d'horloge plus faible aux compteurs permettra une structure de portage plus simple, en évitant le portage rapide qui serait nécessaire à 10 MHz. Votre précision est désormais de l'ordre de 60 ms / an pour une horloge parfaite.

PLUS DE MODIFICATION

Un rapide coup d'œil sur eBay montre un grand nombre d'OCXO à 10 MHz pour moins de 20 dollars. Ceux-ci auront généralement des stabilités de 1 ppb ou mieux, avec 0,2 ppb une spécification assez courante. Obtenez-en un et vous devriez être en forme. Vous voudriez emprunter un compteur de fréquence / période de résolution assez élevée pour déterminer la fréquence de sortie réelle, puis ajuster le rapport de division pour correspondre.

WhatRoughBeast
la source
D'accord, et même si OCXO n'est pas dans le budget de puissance, un TCXO est et peut encore améliorer un cristal de montre.
hobbs
4

101110141011

106

Une PLL de type "fraction N synth" est utilisée pour dériver n'importe quel rapport d'une référence telle que 10Mhz à partir de certaines unités GPS.

Si un oscillateur TCXO a une stabilité de 1 ppm, il ne peut être réglé qu'un peu plus que cela et pas un décalage de 2,07% par rapport à 1 pps ou 1,0274912510 Hz, donc une PLL avec une ou plusieurs puces N fractionnaires est un moyen de le faire avec un VC-OCXO ou un capuchon mécanique réglé OCXO.

ajouté - Pour générer le 1pps sur le temps MARs, alors le rapport de division est 26,337.44856 en utilisant 5 chiffres entiers et un résidu de 5 chiffres.

  • Si vous pouvez régler le Xtal à 0,01 ppm, il ne sera généralement stable qu'à 1 ppm, sauf si un micro-four est fabriqué à ~ 30 ° C, car Tempco est généralement nul autour de la température corporelle pour certains XTALS, pas nécessairement des MEM. À moins que Vcc et la température ne dépassent 0,1 0,1 ° C, il est impossible de corriger l'erreur de résidu mieux que 0,01 ppm, même 0,1 ppm est difficile à court terme et le vieillissement à long terme sera d'au moins 1 ppm par an.

  • Ainsi, en théorie, si vous disposiez d'une horloge calibrée à 1 ppm d'un GPS pour régler l'heure de la Terre à 1 ppm, il serait impossible de s'attendre à une meilleure précision de correction des résidus.

  • Valeur d'erreur résiduelle du diviseur par seconde. est 44856/100000 (+26 337)

  • Conversion de 44856 en binaire = 1010111100111000
  • Cela nécessite un compteur de résidus pour basculer entre / 44856 et 45857

  • Nous faisons cette division des résidus en tronquant le nombre de résidus binaires à 8 bits puis en faisant tourner les bits pour que MSB devienne LSB.

  • 10101111 devient 11110101

  • Chaque seconde, un compteur de résidus de 11110101 et où chaque position de bit "n" = 1 est la valeur de comptage en binaire n ^ 2 où le taux de division est de 45857 au lieu de 44856. Puisque le LSB = 1, cela signifie que chaque deuxième comptage bascule jusqu'à ce que 101 secondes, puis le choix du diviseur est basculé pour le compte 1pps suivant. Cette opération est répétée pour choisir le diviseur à utiliser pour la seconde suivante, puis incrémenter le pointeur jusqu'à ce que le pointeur atteigne la fin et attendre la prochaine horloge de terre de 1 pp.

  • Ce processus est répété pour le compte entier de ce résidu binaire tourné ou 10101111> 11110101 = 245 secondes afin qu'un diviseur de synthétiseur N fractionnaire de 1pps de temps Mars soit créé chaque seconde avec des corrections effectuées tous les 245 secondes pour rester à l'heure. à long terme.

-Le ratio de diviseur à virgule flottante pour l'horloge est peut-être plus facile.

Tony Stewart Sunnyskyguy EE75
la source
2

Vous pouvez résoudre ce problème de manière assez triviale sans modifier le matériel (bien que vous souhaitiez une fréquence de référence plus stable), en utilisant des fractions binaires, et vous pouvez le faire d'une manière qui vous donne une résolution en millisecondes et qui peut facilement être rendu gratuit. suffisamment d'erreurs de conversion cumulatives pour vous permettre de voir la précision fondamentale de toute source à laquelle vous pouvez vous référer, y compris une horloge atomique.

Ce que vous feriez, c'est de modifier votre interruption de minuterie pour qu'elle s'accumule dans un registre très large, et à chaque interruption, ajoutez une valeur assez longue qui est une représentation aussi précise du rapport d'une milliseconde terrestre à une "milliseconde Mars" que vous le souhaitez.

Disons, pour les besoins de l'argument, que vous vouliez une résolution de 32 bits pour la conversion. Vous pouvez utiliser un accumulateur 64 bits, les 32 bits inférieurs représentant la fraction Ce que vous feriez serait de déterminer la valeur appropriée, légèrement inférieure à 2 ^ 32, qui représente le facteur de conversion. Chaque fois que votre interruption milliseconde Terre se déclenche, vous ajoutez cette valeur à l'accumulateur. Chaque fois que vous souhaitez interroger l'horloge, vous retournez les 32 bits supérieurs, qui est le nombre de millisecondes Mars écoulées, tandis que les 32 bits inférieurs ne sont conservés qu'en interne pour éviter les erreurs d'arrondi.

L'utilisation de longues fractions binaires comme celle-ci vous permet d'effectuer une conversion avec autant de précision que vous le souhaitez. 32 bits est presque certainement trop long pour la fraction, tandis que 32 bits pour les millisecondes entières peuvent être trop courts, mais vous pouvez ajuster comme vous le souhaitez.

Soit dit en passant, cette technique d'accumulation dans un long registre mais ne signalant qu'un certain nombre de bits les plus significatifs est la façon dont la synthèse numérique directe peut produire une résolution de fréquence extrêmement élevée.

Vous pouvez également envisager de faire une partie de la conversion en modifiant le rapport du diviseur de l'horloge système 8 ou 16 MHz à l'interruption en millisecondes, en le rapprochant de l'intervalle d'une "milliseconde Mars". Surtout si vous voulez quelque chose de plus précis qu'un cristal bon marché, vous pouvez avoir affaire à une référence habituelle de 10 MHz disciplinée par un GPS ou plus directement par une horloge atomique, vous pouvez donc remplacer cela par la source d'horloge AVR 8/16 MHz habituelle et recalculer diviser les ratios en conséquence.

Chris Stratton
la source
0

L'approche de synthèse numérique directe (DDS) ou d'oscillateur à commande numérique est un moyen assez simple d'obtenir le niveau de résolution souhaité d'une fréquence de sortie sans dépendre de la fréquence d'horloge.

Dans cette approche, vous disposez d'un accumulateur de phase haute résolution. Chaque boucle autour de vous ajoute un incrément de phase qui a également une résolution fine. La sortie est le bit le plus élevé de l'accumulateur.

Lorsque vous l'utilisez pour donner une onde carrée, les bords ne peuvent changer qu'avec l'horloge d'entrée (ou la fréquence de boucle logicielle), de sorte que le bord tremble d'où il devrait être, mais au fil du temps, il n'y a pas d'erreur cumulative - vous pouvez faire une résolution comme aussi haut que vous le souhaitez.

Vous pouvez le faire dans un logiciel assez facilement (par exemple sur AVR), et certains micros ont maintenant du matériel NCO. http://ww1.microchip.com/downloads/en/AppNotes/90003131A.pdf Un petit PIC pourrait le faire dans un matériel avec une résolution de 20 bits (1 ppm), à partir d'un xtal 32 kHz ou d'un four précis à 10 MHz.

Henry Crun
la source
0

Cherchez à faire fonctionner un cristal de quartz personnalisé four à un multiple entier de la fréquence souhaitée. Ils ne coûtent pas beaucoup plus qu'une fréquence standard. Recherche sur le Web "cristal de quartz personnalisé"

D Duck
la source