Precisione dell'orologio Arduino


10

Attualmente sto cercando di creare un orologio Arduino utilizzando la libreria PJRC Time ( http://www.pjrc.com/teensy/td_libs_Time.html ). So che poiché la maggior parte delle schede Arduino funzionano con un clock a 16 MHz e un singolo risonatore, il tempo può diventare "non sincronizzato" dopo un certo periodo di tempo.

Tuttavia, mi chiedevo se qualcuno avesse un'idea dell'accuratezza della libreria Time quando viene utilizzato su Arduino DUE con un orologio a 84 MHz. L'ho provato e finora l'orologio è stato sincronizzato per alcune ore. Grazie!


I limiti di accuratezza della libreria dipendono dalla precisione del cristallo. Supponiamo che tu abbia un cristallo spento di 0,5 secondi ogni ora, ottimo per un breve periodo, ma se lo espandi nell'arco di un anno, a quel punto è scaduto più di 1 ora. Se vuoi che qualcosa mantenga un orario preciso per un lungo periodo, ti suggerisco un orologio in tempo reale (hanno ancora imprecisioni), un modulo GPS o una connessione Internet per la sincronizzazione.
Jesse Laning,

@jamolnng Grazie per la risposta. Conosci la precisione del cristallo su Arduino DUE o dove potrei andare per trovarlo?
KK6FSL,

La migliore precisione che otterrai è 84MHz, quando producono o cucinano i cristalli che riescono a renderli solo in una certa misura accurati, anche l'ambiente del cristallo (temperatura, umidità, ecc.) Gioca un ruolo nel precisione di esso.
Jesse Laning,

@jamolnng Quindi posso aspettarmi una maggiore precisione con il cristallo 84MHz piuttosto che il cristallo 16MHz sulla maggior parte degli altri Arduinos?
KK6FSL

5
"La massima precisione che otterrai 84MHz" - non ha molto senso per me!
Cybergibbons,

Risposte:


10

I limiti di accuratezza della libreria dipendono dalla precisione del cristallo. Quando producono o cucinano il cristallo, possono renderlo solo in una certa misura preciso, anche l'ambiente del cristallo (temperatura, umidità, ecc.) Gioca un ruolo nella precisione di esso. Supponiamo che tu abbia un cristallo spento di 0,5 secondi ogni ora, ottimo per un breve periodo, ma se lo espandi nell'arco di un anno, a quel punto è scaduto più di 1 ora. Se vuoi che qualcosa mantenga un orario preciso per un lungo periodo, ti suggerisco un orologio in tempo reale (hanno ancora imprecisioni), un modulo GPS o una connessione Internet per la sincronizzazione.

Per ulteriori informazioni guarda l' articolo di Wikipedia sui cristalli di quarzo

L'uso di un cristallo da 84 MHz rispetto a un cristallo da 16 MHz non migliorerà necessariamente la precisione dell'orologio Arduino poiché la frequenza del cristallo è più un indicatore della velocità del processore che della precisione. La precisione dell'orologio Arduino dipende principalmente dalla precisione dell'oscillatore a cristallo.

EDIT: Non sono un esperto di oscillatori a cristallo, quindi se vedi qualcosa di sbagliato qui per favore fatemelo sapere


5

Rivisitazione di una vecchia domanda ... come ho trovato un post sul blog molto istruttivo che getta nuova luce in esso. Vorrei prima fornire un po 'di contesto prima di fornire il collegamento.

Quando si valuta la qualità di una base dei tempi, che si tratti di un cristallo, un risuonatore ceramico o uno standard di frequenza di livello da laboratorio, ci sono due nozioni che dovrebbero essere distinte:

  • accuratezza : quanto è vicina la frequenza della base dei tempi al suo valore nominale
  • stabilità : quanta frequenza si sposta nel tempo

La precisione è importante se si desidera che l'orologio fornisca l'ora corretta "out of the box". Tuttavia, se sei disposto a passare un po 'di tempo a calibrare l'orologio, non ti interessa davvero perché calibrerai qualsiasi imprecisione che misuri. La risposta di jfpoilpret fornisce un esempio di un protocollo di calibrazione "manuale", che per necessità è piuttosto lungo. Se è possibile prendere in prestito un modulo GPS con un'uscita 1PPS, la calibrazione potrebbe essere eseguita in pochi secondi.

La stabilità è un problema più serio. Se la frequenza della base dei tempi varia in modo casuale, questo annullerà i tuoi sforzi di calibrazione. In sostanza, la calibrazione ti dirà quanto velocemente o lentamente il tuo orologio sta funzionando in questo momento , ma non ti permetterà di prevedere quanto velocemente o lentamente funzionerà in futuro .

Ecco il link promesso: precisione della frequenza di clock di Arduino , di Joris van Rantwijk.

Quello che Joris ha fatto è misurare l'accuratezza e la stabilità di un Arduino Pro Mini (dotato di un risuonatore ceramico) e di un vecchio Duemilianove (cristallo di quarzo). Dal mio punto di vista, i principali takeaway sono:

  • entrambi gli orologi sono grossolanamente inaccurati, quindi entrambi avrebbero bisogno della calibrazione dell'utente per poter essere utilizzati come orologi
  • il cristallo di quarzo del Duemilianove ha una stabilità decente, migliore di 1,5e-8 a 6 ore di tempo medio
  • la stabilità del risuonatore ceramico della Pro Mini è patetica, più di due ordini di grandezza peggiore del cristallo, il che lo rende essenzialmente inutile come un pezzo di tempo

Ecco il suo diagramma di deviazione di Allan , che misura l'instabilità dell'orologio in funzione del tempo di osservazione:

Deviazione di Allan della frequenza di clock di Arduino
(fonte: jorisvr.nl )

Sebbene questo studio abbia alcuni limiti (sono state testate solo due schede e il tempo di osservazione è troppo breve), è ben pensato e molto istruttivo. Ti incoraggio a leggerlo per intero.


1
La frequenza dei cristalli di quarzo varia leggermente con la temperatura. Se riesci a controllare la temperatura, aiuta a mantenere stabile la frequenza.
Duncan C

3

Il modo migliore per conoscere l'accuratezza del risonatore della tua scheda è misurarlo da solo.

Per fare ciò, puoi usare la millis()funzione Arduino della tua scheda e scrivere un piccolo schizzo che:

  1. consente di impostare l'ora di inizio per misurare la deriva del tempo (ad es. con un semplice pulsante); attiverai il pulsante in base a una base temporale precisa .
  2. quindi chiama ripetutamente millis () fino a quando non sono trascorse almeno 120 ore ("ore di arduino", ovvero circa 5 giorni)
  3. mostra un segnale quando sono trascorse quelle 120h (il tuo schizzo dovrebbe probabilmente "avvisarti" prima che sia stato raggiunto il tempo esatto in modo da essere pronto per la misurazione)
  4. quando sono trascorse le 120h, controlla in base al tempo di riferimento (utilizzato nel passaggio 1.) e controlla quanto tempo è trascorso (dovrebbe essere 120h +/- epsilon)
  5. una volta che conosci la deriva del tuo orologio, e purché la tua tavola funzionerà nelle stesse condizioni ambientali (principalmente la temperatura) della tua misura, puoi usarla nei tuoi schizzi per regolare il millis()valore ogni ora circa.

Naturalmente, questo approccio è lungi dall'essere perfetto in quanto richiede un intervento umano e quindi creerà ulteriori deviazioni del tempo durante le misurazioni, ecco perché è necessario misurare le deviazioni del tempo di clock per un lungo periodo.

Un approccio migliore sarebbe quello di collegare un clock RTC ad alta precisione (l'accuratezza deve essere scelta in base all'accuratezza di cui hai bisogno per la tua applicazione) alla tua scheda e adattare lo schizzo in modo che calcoli automaticamente la deriva. Una volta ottenuta la deriva del tempo, puoi fare lo stesso del passaggio 5 sopra nei tuoi schizzi e scollegare l'orologio RTC dalla tua scheda.

Punti importanti :

  • misurare la deriva del tempo sulla scheda che dovrà essere regolata in un secondo momento (se si dispone di più schede, è necessario misurare una deriva per scheda)
  • assicurare la stabilità dell'ambiente in cui verrà utilizzata la tua tavola

Infine, se hai davvero bisogno di un'elevata precisione, collega sicuramente una sorgente di clock esterna (ad es. Orologio RTC, GPS, NTP) alla tua scheda e usala come SyncProvider per la libreria PJRC.


2

Il tuo cristallo di clock di sistema medio sarà spento di diverse decine di ppm (parti per milione. Sono ottimi per un tempismo stabile e preciso dei segnali, ma drammatici per mantenere un tempo preciso. Senza disposizioni speciali il cristallo di sistema potrebbe essere spento di diversi secondi al giorno.

La soluzione è utilizzare un vero orologio in tempo reale, guidato da quello che è comunemente noto come un cristallo dell'orologio 32768Hz. Questi cristalli sono facilmente un fattore 10 in termini di precisione. Puoi impostare il tuo oscillatore che interrompe il processore principale e tenere il conto nel tuo schizzo di Arduino o trovare una scheda di breakout RTC.

Due esempi casuali che compaiono in Google con i termini di ricerca "breakout RTC":

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.