Preciso sincronizar dois microcontroladores para que eles possam medir a velocidade das ondas de propagação. As medições de atraso de tempo precisam ter precisão de microssegundos (erro menor que 1/2 de microssegundo).
Eu tenho dois microcontroladores ( ATmega328 ) que usam um cristal de 12MHz.
Ambos estão equipados com transceptores Bluetooth. Os transceptores Bluetooth enviam e recebem pacotes com uma instabilidade de ~ 15 milissegundos.
Espero sincronizar os microcontroladores usando os transceptores Bluetooth ou algum outro método criativo.
Tentei sincronizá-los tocando-os juntos, mas preciso que eles permaneçam sincronizados por cerca de 10 minutos, e seus relógios flutuam rápido demais. Talvez se fosse possível prever com precisão o desvio do relógio, esse método funcionaria.
Como devo conseguir essa sincronização?
Respostas:
Não quero chover no seu desfile sem fio. Você encontrou um requisito difícil, mas inesperado. Algo assim merece uma reavaliação de todo o design do sistema.
A primeira coisa que vem à mente é registrar as duas unidades em um oscilador. Você possui comunicação Bluetooth, o que sugere que o alcance é da ordem de 10m. Você pode conectar suas unidades com um cabo coaxial RG174 ou uma fibra óptica, que carregaria o relógio.
Segundo , existem osciladores de precisão. Em ordem crescente de precisão e custo.
Terceiro , oscilador de precisão treinado com GPS. Todo satélite GPS possui vários relógios atômicos a bordo. Geralmente, há muitos satélites de GPS à vista. O GPS é usado para cronometrar com precisão (uso menos conhecido em comparação com navegação por satélite). A maioria dos receptores GPS possui uma saída de 1PPS (um pulso por segundo), que fornece um tempo preciso de 50ns.
Para ter um desvio de 0,5μs acima de 600s (10min), seu relógio (o relógio de 12MHz em seu design atual) deve ter um desvio inferior a 0,0008ppm. Mas se você puder corrigir o erro de tempo de tempos em tempos a partir de uma fonte externa de baixa deriva, o requisito para a deriva no relógio poderá ser mais relaxado. Se você puder corrigir a cada segundo, seu relógio poderá ter um desvio de 0,5 ppm.
fonte
Módulos GPS com saídas de 1pps estão prontamente disponíveis e são baratos.
Não é realmente necessário disciplinar o oscilador da CPU em relação ao GPS (por exemplo, com um PLL). Desde que você possa "registrar o registro de data e hora" de eventos externos em relação ao relógio da CPU, é relativamente simples interpolar o tempo da transmissão de onda e receber eventos entre dois eventos do PPS.
Geralmente, você pode usar a combinação de um timer de hardware no microcontrolador, juntamente com um contador de software para seus eventos de estouro, para criar um contador de ciclo da CPU de largura arbitrária. Pode ser complicado lidar corretamente com eventos de rolagem, tanto no contador de hardware quanto no software, mas no final, você pode ter, por exemplo, um contador de 32 bits que conta com a taxa do relógio da CPU (dando alta resolução ) e passa por um período maior que os intervalos que você está tentando medir (por exemplo, 429 segundos a 10 MHz).
Você pode usar esse contador para marcar os diferentes eventos externos com data e hora. Se um desses eventos são pulsos de 1 pps de um receptor GPS, a precisão básica a longo prazo do relógio da CPU se torna um problema. A única coisa que importa é sua estabilidade a curto prazo. Você pode salvar os carimbos de hora do GPS em um buffer FIFO e comparar os carimbos de hora de outros eventos com os valores desse buffer. Como você sabe que os pulsos do GPS estão exatamente com um segundo de distância, é possível encontrar a hora exata de qualquer outro evento interpolando.
Por fim, se você tiver essa configuração em execução em dois sistemas separados, cada um com seu próprio receptor GPS, poderá comparar os tempos calculados para vários eventos nos dois sistemas com alta precisão (normalmente da ordem de ± 100 ns), mesmo se o Os relógios da CPU dos dois sistemas não são sincronizados.
fonte
Eu implementei uma sincronização de relógio sem fio para microcontroladores antes, mas apenas com precisão de milissegundos, o que era bom o suficiente para o aplicativo. De minha leitura, este artigo explica muito bem a sincronização de microssegundos: http://www.math.u-szeged.hu/tagok/mmaroti/okt/2010t/ftsp.pdf
Essencialmente, se você tiver conhecimento do evento de transmissão e do evento de chegada de um pacote de rádio no transmissor e no receptor, respectivamente, você terá um evento observável comum (supondo que você ignore o tempo de propagação da onda de rádio) entre os 2 sistemas que podem ser usado como referência. A outra característica interessante mencionada no artigo é a estimativa de inclinação do relógio usando regressão linear.
fonte
Verifique o CSP (Bluetooth Clock Synchronization Protocol), que é uma parte opcional do Health Device Profile (HDP). As seções desse documento relevantes para o CSP são 2.1 e 8.
Ainda não tive a chance de experimentá-lo, mas, tanto quanto posso dizer, o BlueZ (a pilha oficial de protocolos Bluetooth do Linux) acabou de adicionar suporte ao HDP , incluindo suporte ao CSP. Portanto, mesmo que não pareça que você esteja executando em uma plataforma compatível com a pilha BlueZ, talvez o código forneça pelo menos uma boa implementação de referência.
fonte