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.
Réponses:
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.
la source
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
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.
la source
la source
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.
la source
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.
la source
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)
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.
la source
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.
la source
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.
la source
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é"
la source