Estou procurando criar um módulo RTC para o Arduino que roda em tempo de Marte. O fator de conversão é 1,0274912510 segundos de Terra para 1 Marte de segundo.
Embora eu tenha conseguido fazer isso programaticamente com uma resolução <2 segundos (o que não é exatamente ideal, eu prefiro algo como 300 ms de precisão) usando matemática de ponto fixo em um Arduino Uno conectado a um módulo RTC comum, eu estou imaginando se seria possível ter algum tipo de oscilador de baixa tensão funcionando com precisão de 31.891.269.116 µHz (31,891269116 kHz) que seria mais ou menos intercambiável com um cristal de relógio padrão de 32 kHz (no entanto, eu estaria aberto a outras idéias, então desde que não sejam proibitivamente caros.)
Alguma idéia de como isso pode ser possível? Como alternativa, algum tipo de timer que dispara uma vez a cada 1.0274912510 segundos também seria aceitável.
Respostas:
Use um cristal de 32768kHz como todos os outros, mas divida por 33669, gerando um erro de -5,08ppm. (Você pode remover isso cortando a capacitância de carga, se quiser).
Não é preciso, mas para um relógio de Marte será tão bom quanto qualquer relógio de quartzo da Terra. Ou seja, ignorando os problemas de compensação de temperatura para as temperaturas ambientes de Marte, a maioria dos cristais de relógio estão disponíveis apenas para uso na Terra, a menos que você possa encontrar fornecedores marcianos ...
Eu usaria os periféricos do contador de tempo em um MSP430 para fazer a divisão e (supondo que você esteja dirigindo um movimento de relógio mecânico de quartzo padrão) gere pulsos bipolares de 30ms em seus pinos de saída a cada segundo, seguindo aproximadamente os tempos originais que você pode medida em um osciloscópio.
Arduino ou similar fará o trabalho, mas o MSP pode ser adormecido entre pulsos, consumindo menos de 1uA com o oscilador LF funcionando. Aqui está um exemplo de design com código fonte e PCB para um relógio - apenas o tempo da Terra até agora, embora isso possa provavelmente ser corrigido alterando uma constante.
fonte
Você pode fazer melhor do que a sugestão de Brian Drummond. Embora possa ser verdade que o seu oscilador é a maior fonte de erro no sistema, não há razão para adicionar erros sistemáticos adicionais quando é fácil o suficiente.
Defina seu intervalo de timer para 33668 ticks, inicie um contador em 0 e, a cada interrupção do timer, aumente o contador em 6754.
Se, após o incremento, o contador for> = 8105, subtraia 8105 e defina o intervalo do timer para o segundo seguinte para 33669 ticks.
Caso contrário, deixe o contador em paz e defina o intervalo do timer para o segundo seguinte para 33668.
Isso dará a você (assumindo um cristal perfeito de 32.768kHz) um intervalo médio de
segundos (menos de um erro de parte por trilhão em relação a 1,0274912510), em vez de 1,0274963378906 segundos (erro de quase 5 partes por milhão). Isso significa que a precisão de longo prazo do seu relógio dependerá verdadeiramente da precisão do oscilador; o erro devido à matemática contribuirá substancialmente com menos de um tique de erro por ano. Embora o comprimento de qualquer um único segundo terá um erro relativo de até 25 ppm, mais de mais intervalos mais longos e médios do erro desaparece.
Esse é o algoritmo de Bresenham aplicado à pontualidade, e a fração 6754/8105 foi encontrada da seguinte forma:
32768 * 1.027491251 = 33668.833312768
A fração contínua exata de 33668.833312768 é [33668; 1, 4, 1, 1349, 1, 7].
A eliminação do último termo fornece o 33668 + 6754/8105, que possui todas as partes que se encaixam perfeitamente em 16 bits.
fonte
fonte
Isso poderia ser feito com um rubídio ou outro relógio de referência atômica a 10 MHz, talvez um PLL para fornecer (digamos) 100 MHz, e depois contado com um acumulador de fase de ~ 36 bits para obter uma resolução de 0,001 Hz. O último poderia ser feito com um pequeno FPGA.
Você pode ler sobre os métodos de síntese digital direta (DDS). Existem chips que fazem o DDS, mas talvez não com uma largura de bits tão ampla.
Os módulos de relógio Rubidium estão disponíveis no mercado excedente ou de fabricantes como a Microsemi.
fonte
Você não define "caro", então isso é algo como um tiro no escuro.
Comece com um gerador comercial de 10 MHz (incluindo o eBay). Rubídio para escolha, mas qualquer precisão que você possa obter define seu desempenho.
Agora construa um divisor programável de 28 bits. Em 10 MHz, você pode usar a lógica CMHC 74HC, mas precisará usar uma configuração de transporte rápido. A saída também aciona uma divisão por dois flip-flop, que fornece o bit 29.
O divisor pode funcionar na proporção de 10.274.912 ou 10.274.913, dependendo do estado do bit 29. Para uma entrada perfeita de 10 MHz, o período de saída efetivo do bit 28 será de 1,02749125 segundos, aproximadamente preciso para 1 ppb, ou cerca de 30 ms / ano. Uma entrada menos precisa, é claro, produzirá uma saída menos precisa.
Usando o padrão 74HC161s de pântano, você pode fazer isso com 8 ICs e, se for cuidadoso, poderá usar uma placa de tira de prototipagem padrão, embora deseje ter muito cuidado ao reforçar o sistema de aterramento. O Perfboard seria mais barato, mais compacto e mais durável, mas a fiação seria menos conveniente, pois você precisaria soldar as conexões. Em seguida, você pode colocá-lo em algo como um RTV de nível eletrônico (NÃO o RTV obtido na loja de ferragens), para um tamanho final de módulo na faixa de 2 x 2 x 1/2 polegadas, sem contar o oscilador.
EDITAR
Observe que seu padrão de desempenho, estando vinculado a RTCs "regulares", está na verdade na faixa de 1 seg / dia de precisão, que é 30 vezes pior que essa abordagem. Portanto, primeiro, você pode acabar com o estágio de bit 29 ou, alternativamente, dividir seus 10 MHz a 5 MHz e usar uma proporção de 5.137.456. Essa taxa de clock mais baixa nos contadores permitirá uma estrutura de transporte mais simples, evitando o transporte rápido que seria necessário a 10 MHz. Sua precisão agora é da ordem de 60 ms / ano para um relógio perfeito.
EDIÇÃO ADICIONAL
Uma rápida olhada no eBay mostra um grande número de OCXOs de 10 MHz por menos de 20 dólares. Eles normalmente têm estabilidades de 1 ppb ou melhor, com 0,2 ppb uma especificação bastante comum. Pegue um desses e você deve estar em boa forma. Você deseja emprestar um medidor de frequência / período de resolução razoavelmente alta para determinar a frequência de saída real e ajustar a taxa de divisão para corresponder.
fonte
Os relógios "Stratum 1" são derivados de10- 11 Cristais de corte SC usados em ~ $ 250 VC-OCXO (por exemplo, Vectron), a menos que você compre usado. Depois, com o ajuste para sincronizar com relógios globais como WWV, VLF, GPS 10MHz ou relógio de 1pps, que por sua vez são sincronizados para10- 14 relógios atômicos via "bloqueado para 3 satélites". Então você pode calibrar para10- 11 erro.
Para fazer outro f, como a sua frequência, é necessário um deslocamento de 2,07% de 1pps, para que isso não seja possível ajustando um cristal de relógio em10- 6 estabilidade.
Uma "fração N sintetizador" do tipo PLL é usada para derivar qualquer proporção de uma referência, como 10Mhz, de algumas unidades GPS.
Se um oscilador TCXO tiver uma estabilidade de 1ppm, ele poderá ser ajustado um pouco mais do que isso e não um deslocamento de 2,07% de 1 pps ou 1,0274912510 Hz, portanto, um PLL com um (s) N (s) chip (s) fracionário (s) é uma maneira de fazer isso com um VC-OCXO ou OCXO com tampa mecânica.
adicionado - para gerar 1pps no tempo de MARs, a taxa de divisão é 26.337.44856 usando 5 dígitos inteiros e um resíduo de 5 dígitos.
Se você puder ajustar o Xtal para 0,01 ppm, ele será estável normalmente para 1ppm, a menos que um micro-forno seja feito a ~ 30 ° C, pois o Tempco geralmente é nulo em torno da temperatura do corpo para alguns XTALS, não necessariamente MEMs. A menos que Vcc e temp estejam dentro de 0,1 ° C, qualquer coisa que tente corrigir o erro de resíduo melhor que 0,01 ppm é impossível, mesmo 0,1ppm é difícil a curto prazo e o envelhecimento a longo prazo será de pelo menos 1ppm por ano.
Assim, em teoria, se você tivesse um relógio calibrado de 1ppm de um GPS para ajustar o tempo da Terra de 1ppm, seria impossível esperar uma melhor precisão na correção de resíduos.
Valor de erro residual do divisor por segundo. é 44856/100000 (+26.337)
É necessário um contador de resíduos para alternar entre / 44856 e 45857
Fazemos essa divisão de resíduos truncando o número de resíduos binários para 8 bits e girando os bits para que o MSB se torne LSB.
10101111 torna-se 11110101
A cada segundo, um contador de resíduos de 11110101 e em que cada posição "n" do bit = 1 é o valor da contagem no binário n ^ 2, em que a proporção do número inteiro de divisão é 45857 em vez de 44856. Como o LSB = 1, cada 2ª contagem alterna até 101 segundos, a opção do divisor é alternada para a próxima contagem de 1pps. Isso é repetido para escolher qual divisor é usado para o próximo segundo e depois incrementar o ponteiro, até o ponteiro chegar ao fim e aguardar o próximo relógio de terra de 1pps.
Esse processo é repetido para toda a contagem desse resíduo binário girado ou 10101111> 11110101 = 245 segundos, para que um divisor N sintético fracionário de 1pps em tempo de Marte seja criado a cada segundo com correções feitas a cada 245 segundos para permanecer pontual. para longo prazo.
talvez a proporção do divisor de ponto flutuante para o relógio seja mais fácil.
fonte
Você pode resolver isso de maneira bastante trivial no software sem alterar o hardware (apesar de querer uma frequência de referência mais estável), usando frações binárias, e pode fazê-lo de uma maneira que ofereça resolução em milissegundos e possa ser facilmente liberado erros de conversão cumulativos suficientes para permitir que você veja a precisão fundamental de qualquer fonte à qual possa fazer referência, incluindo um relógio atômico.
O que você faria é modificar a interrupção do temporizador para se acumular em um registro muito amplo e, a cada interrupção, adicionar um valor bastante longo, que é uma representação tão precisa da proporção de um milissegundo da Terra para um "milissegundo de Marte" como você deseja.
Digamos, por uma questão de argumento, que você queria uma resolução de 32 bits para a conversão. Você pode usar um acumulador de 64 bits, com os 32 bits inferiores representando a fração. O que você faria é descobrir o valor apropriado, um pouco menos que 2 ^ 32, que representa o fator de conversão. Cada vez que sua milissegundo de terra interrompe o disparo, você adiciona esse valor ao acumulador. Sempre que você deseja consultar o relógio, você retorna os 32 bits superiores, que é o número inteiro de milissegundos de Marte decorrido, enquanto os 32 bits inferiores são preservados apenas internamente para evitar erros de arredondamento.
O uso de frações binárias longas como essa permite realizar uma conversão com a precisão que você desejar. 32 bits é quase certamente muito longo para a fração, enquanto 32 bits para os milissegundos inteiros podem ser muito curtos, mas você pode ajustar conforme desejado.
Aliás, essa técnica de acumular em um registro longo, mas apenas relatar algum número de bits mais significativos, é como a síntese digital direta pode produzir uma resolução de frequência extremamente alta.
Você também pode considerar fazer parte da conversão alterando a proporção do divisor do relógio do sistema de 8 ou 16 MHz para a interrupção de milissegundos, aproximando-o do intervalo de um "milissegundo de Marte". Especialmente se você quiser algo mais preciso do que um cristal barato, pode estar lidando com uma referência habitual de 10 MHz disciplinada por um GPS ou mais diretamente por um relógio atômico, para substituir a fonte de relógio usual do AVR 8/16 MHz e recalcular divisores de acordo.
fonte
A abordagem de síntese digital direta (DDS) ou oscilador controlado numérico é uma maneira bastante simples de obter qualquer nível desejado de resolução de uma frequência de saída sem depender da freqüência do relógio.
Nesta abordagem, você tem um acumulador de fase de alta resolução. Cada loop ao seu redor adiciona um incremento de fase que também possui uma resolução fina. A saída é o bit mais alto do acumulador.
Ao usá-lo para fornecer uma onda quadrada, as bordas são alteradas apenas com o relógio de entrada (ou taxa de loop do software); portanto, as bordas tremem de onde deveriam estar, mas com o tempo, não há erro cumulativo - você pode fazer a resolução conforme necessário. alto como você quer.
Você pode fazer isso em software com bastante facilidade (por exemplo, no AVR), e alguns micros agora possuem hardware NCO. http://ww1.microchip.com/downloads/en/AppNotes/90003131A.pdf Um pequeno PIC pode fazer isso em hardware com resolução de 20 bits (1ppm), de um xtal de 32kHz ou de um forno preciso de 10MHz.
fonte
Procure obter um cristal de quartzo personalizado com forno funcionando em algum múltiplo inteiro da frequência desejada. Eles não custam muito mais do que uma frequência padrão. Pesquisa na web "cristal de quartzo personalizado"
fonte