Precisão do relógio de ponto do Arduino

10

Atualmente, estou tentando criar um relógio de ponto do Arduino usando a biblioteca de horário do PJRC ( http://www.pjrc.com/teensy/td_libs_Time.html ). Eu sei que, como a maioria das placas Arduino está funcionando com um relógio de 16 MHz e um único ressonador, o tempo pode ficar "fora de sincronia" após um certo período de tempo.

No entanto, eu queria saber se alguém tem uma idéia sobre a precisão da biblioteca Time quando usado no Arduino DUE com um relógio de 84MHz. Eu tenho testado e até agora, o relógio foi mantido em sincronia por algumas horas. Obrigado!

KK6FSL
fonte
As limitações de precisão da biblioteca dependem da precisão do cristal. Digamos que você tenha um cristal que sai de 0,5 segundo a cada hora, ótimo para curto prazo, mas se você expandir isso ao longo de um ano, terá mais de uma hora de folga nesse período. Se você deseja que algo mantenha um tempo preciso por um longo período, sugiro um relógio em tempo real (eles ainda têm imprecisões), um módulo GPS ou uma conexão à Internet para sincronizar.
Jesse Laning
@jamolnng Obrigado pela sua resposta. Você conhece a precisão do cristal no Arduino DUE ou onde eu poderia encontrá-lo?
KK6FSL
A melhor precisão que você obtém é de 84MHz, quando eles fabricam ou cozinham o cristal, eles só podem torná-lo com um certo grau de precisão, e também o ambiente do cristal (temperatura, umidade etc.) desempenha um papel importante. precisão disso.
Jesse Laning
@jamolnng Então, posso esperar uma precisão mais alta com o cristal de 84MHz do que com o cristal de 16MHz na maioria dos outros Arduinos?
KK6FSL
5
"A melhor precisão que você obtém é de 84MHz" - isso não faz muito sentido para mim!
Cybergibbons

Respostas:

10

As limitações de precisão da biblioteca dependem da precisão do cristal. Quando eles produzem ou cozinham o cristal, eles só podem torná-lo preciso em um certo grau, também o ambiente do cristal (temperatura, umidade etc.) desempenha um papel na precisão do mesmo. Digamos que você tenha um cristal que sai de 0,5 segundo a cada hora, ótimo para curto prazo, mas se você expandir isso ao longo de um ano, terá mais de uma hora de folga nesse período. Se você deseja que algo mantenha um tempo preciso por um longo período, sugiro um relógio em tempo real (eles ainda têm imprecisões), um módulo GPS ou uma conexão à Internet para sincronizar.

Para mais informações, consulte o artigo da wikipedia sobre cristais de quartzo

O uso de um cristal de 84MHz versus um de 16MHz não necessariamente melhora a precisão do relógio Arduino, pois a frequência do cristal é mais um indicador da velocidade do processador do que da precisão. A precisão do relógio Arduino depende principalmente da precisão do oscilador de cristal.

Edição: Eu não sou especialista em osciladores de cristal, por isso, se você ver alguma coisa errada aqui, por favor me avise

Jesse Laning
fonte
5

Revisitando uma pergunta antiga ... como encontrei um post muito informativo que lança uma nova luz sobre ela. Mas deixe-me primeiro fornecer um contexto antes de fornecer o link.

Ao avaliar a qualidade de uma base de tempo, seja um cristal, um ressonador de cerâmica ou um padrão de frequência de laboratório, existem duas noções que devem ser distinguidas:

  • precisão : quão perto está a frequência da base de tempo do seu valor nominal
  • estabilidade : quanto essa frequência varia ao longo do tempo

A precisão é importante se você deseja que seu relógio dê a hora correta "fora da caixa". No entanto, se você estiver disposto a gastar algum tempo calibrando seu relógio, não se importará porque irá calibrar qualquer imprecisão que medir. A resposta de jfpoilpret fornece um exemplo de um protocolo de calibração “manual”, que é necessariamente bastante longo. Se você puder emprestar um módulo GPS com uma saída de 1PPS, a calibração poderá ser feita em alguns segundos.

A estabilidade é uma questão mais séria. Se a frequência da base de tempo mudar aleatoriamente, isso anulará seus esforços de calibração. Essencialmente, a calibração indicará o quão rápido ou lento o seu relógio está funcionando no momento , mas não permitirá que você preveja o quão rápido ou lento ele será executado no futuro .

Aqui está o link prometido: precisão da frequência do relógio Arduino , de Joris van Rantwijk.

O que Joris fez foi medir a precisão e a estabilidade de um Arduino Pro Mini (com clock de um ressonador de cerâmica) e de um antigo Duemilianove (cristal de quartzo). Do meu ponto de vista, os principais tópicos são:

  • ambos os relógios são muito imprecisos, portanto, ambos precisariam de calibração do usuário para serem usados ​​como relógios
  • o cristal de quartzo do Duemilianove possui estabilidade decente, melhor que 1.5e-8 às 6 h em média
  • a estabilidade do ressonador de cerâmica do Pro Mini é patética, mais de duas ordens de magnitude pior que o cristal, o que o torna essencialmente inútil como peça de relógio

Aqui está seu gráfico de desvio de Allan , que mede a instabilidade do relógio em função do tempo de observação:

Desvio de Allan da frequência do relógio do Arduino
(fonte: jorisvr.nl )

Embora este estudo tenha algumas limitações (apenas duas placas foram testadas e o tempo de observação é muito curto), é bem pensado e muito informativo. Convido você a ler na íntegra.

Edgar Bonet
fonte
11
A frequência dos cristais de quartzo muda levemente com a temperatura. Se você pode controlar a temperatura, ajuda a manter a frequência estável.
Duncan C
3

A melhor maneira de conhecer a precisão do ressonador da sua placa é medi-la você mesmo.

Para fazer isso, você pode usar a millis()função Arduino do seu quadro e escrever um pequeno esboço que:

  1. permite que você defina a hora de início da medição do desvio do tempo (por exemplo, com um simples botão); você acionará o botão com base em uma base de tempo precisa .
  2. em seguida, chame repetidamente millis () até pelo menos 120 horas ("horas do arduino", que seria em torno de 5 dias)
  3. exibir um sinal quando essas 120 horas tiverem passado (seu esboço provavelmente deve "avisá-lo" antes que a hora exata seja atingida, para que você se prepare para a medição)
  4. quando as 120h tiverem passado, verifique o tempo de referência com base (usado na etapa 1.) e quanto tempo passou (deve ser 120h +/- epsilon)
  5. depois de conhecer o desvio do relógio e desde que sua prancha funcione nas mesmas condições ambientais (principalmente a temperatura) da sua medida, você pode usá-lo em seus esboços para ajustar o millis()valor a cada hora.

Obviamente, essa abordagem está longe de ser perfeita , pois requer intervenção humana e, portanto, criará desvios de tempo adicionais durante as medições, é por isso que você precisa medir os desvios de tempo do relógio por um longo período.

Uma abordagem aprimorada seria conectar um relógio RTC de alta precisão (a precisão deve ser escolhida com base na precisão necessária para sua aplicação) à sua placa e adaptar o esboço para que calcule automaticamente a deriva. Depois de obter o desvio de tempo, você pode fazer o mesmo da etapa 5 acima em seus esboços e desconectar o relógio RTC da sua placa.

Pontos importantes :

  • medir o desvio de tempo no quadro que precisará de ajuste do relógio mais tarde (se você tiver várias placas, deverá medir uma deriva por placa)
  • garantir a estabilidade do ambiente em que sua placa será usada

Finalmente, se você realmente precisar de alta precisão, conecte definitivamente uma fonte de relógio externa (por exemplo, relógio RTC, GPS, NTP) à sua placa e use-a como um SyncProvider para a biblioteca PJRC.

jfpoilpret
fonte
2

Seu cristal médio de relógio do sistema será desligado em várias dezenas de ppm (partes por milhão. Eles são ótimos para sincronização estável e precisa dos sinais, mas são dramáticos para manter o tempo preciso. Sem disposições especiais, o cristal do sistema pode ser desligado vários segundos por dia.

A solução é usar um relógio de tempo real adequado, acionado pelo que é comumente conhecido como cristal de relógio de 32768Hz. Esses cristais são facilmente um fator 10 melhor em precisão. Você pode configurar seu próprio oscilador que interrompe o processador principal e manter a contagem em seu esboço do Arduino ou você encontra uma placa do RTC.

Dois exemplos aleatórios que aparecem no Google com os termos de pesquisa "RTC breakout":

jippie
fonte