Fråga:
Arduino tidsklockans noggrannhet
KK6FSL
2014-02-16 05:54:06 UTC
view on stackexchange narkive permalink

Jag försöker för närvarande skapa en Arduino-tidsklocka med hjälp av PJRC-tidsbiblioteket ( http://www.pjrc.com/teensy/td_libs_Time.html). Jag vet att eftersom de flesta Arduino-korten körs med en 16MHz klocka och en enda resonator, kan tiden bli "out-of-sync" efter en viss tidsperiod.

Jag undrade emellertid om någon har en uppfattning om noggrannheten i Time-biblioteket när den används på Arduino DUE med en 84MHz klocka. Jag har testat det och hittills har klockan hållits synkroniserad i några timmar. Tack!

Gränserna för noggrannhet i biblioteket beror på kristallens noggrannhet. Låt oss säga att du har en kristall som är avstängd med 0,5 sekunder varje timme, bra på kort sikt, men om du expanderar det över ett år är det mer än en timme ledigt vid den tiden. Om du vill att något ska hålla en korrekt tid under en lång period föreslår jag en realtidsklocka (de har fortfarande felaktigheter), en GPS-modul eller en internetanslutning för att synkronisera med.
@jamolnng Tack för ditt svar. Vet du riktigheten hos kristallen på Arduino DUE eller var jag skulle kunna hitta den?
Den bästa noggrannheten du kommer att få är 84MHz, när de gör eller kokar kristallen kan de bara göra den till en viss grad korrekt, även kristallens miljö (temperatur, fuktighet etc.) spelar en roll i noggrannhet.
@jamolnng Så kan jag förvänta mig en högre noggrannhet med 84MHz-kristallen snarare än 16MHz-kristallen på de flesta andra Arduinos?
Inte nödvändigtvis för att om 84MHz och 16MHz båda har samma felaktighet per klockcykel, skulle 16MHz-klockan ha en mindre felaktighet i slutet eftersom den gjorde mindre cykler. Kristallens frekvens är mer för hur snabb processorn är
"Den bästa noggrannheten du kommer att få är 84MHz" - det är inte mycket vettigt för mig!
Han letade efter den exakta frekvensen för klockkristallen inklusive dess defekter. Visas att det är för sent att redigera ...
The Due har en [RTC] (http://forum.arduino.cc/index.php?topic=141233.msg1061157#msg1061157 "RTC") men inga stift för att lägga till ett externt batteri för att hålla det igång.
Fyra svar:
#1
+10
Jesse Laning
2014-02-16 06:30:47 UTC
view on stackexchange narkive permalink

Bibliotekets noggrannhetsbegränsningar beror på kristallens noggrannhet. När de gör eller lagar kristallen kan de bara göra den till en viss grad exakt, även kristallens miljö (temperatur, fuktighet etc.) spelar en roll för att den är exakt. Låt oss säga att du har en kristall som är avstängd med 0,5 sekunder varje timme, bra på kort sikt, men om du expanderar det över ett år är det mer än en timme ledigt vid den tiden. Om du vill att något ska hålla en korrekt tid under en lång period föreslår jag en realtidsklocka (de har fortfarande felaktigheter), en GPS-modul eller en internetanslutning för att synkronisera med.

För mer information, se wikipedia-artikeln om kvartskristaller

Användningen av en 84MHz kristall jämfört med en 16MHz kristall kommer inte nödvändigtvis att förbättra Arduino-klockans noggrannhet eftersom kristallens frekvens är mer en indikator processorhastighet än noggrannhet. Arduino-klockans noggrannhet beror främst på kristalloscillatorns noggrannhet.

REDIGERA: Jag är ingen expert på kristalloscillatorer, så om du ser något fel här, låt mig veta

#2
+5
Edgar Bonet
2016-09-02 21:08:13 UTC
view on stackexchange narkive permalink

Återbesöker en gammal fråga ... eftersom jag hittade en mycket informativ blogginlägg som kastar nytt ljus i den. Men låt mig först ge ett visst sammanhang innan jag ger länken.

När jag bedömer kvaliteten på en tidsbas, vare sig det är en kristall, en keramisk resonator eller en laboratoriefrekvensstandard, finns det två uppfattningar som bör särskiljas:

  • noggrannhet : hur nära är tidsbasens frekvens till nominellt värde
  • stabilitet : hur mycket driver frekvensen över tiden

Noggrannhet är viktigt om du vill att din klocka ska ge rätt tid "ur lådan". Men om du är villig att spendera lite tid på att kalibrera din klocka, bryr du dig inte riktigt eftersom du kommer att kalibrera ut eventuella felaktigheter du mäter. jfpoilprets svar ger ett exempel på ett ”manuellt” kalibreringsprotokoll, som nödvändigtvis är ganska långt. Om du kan låna en GPS-modul med 1PPS-utgång kan kalibreringen göras på några sekunder.

Stabilitet är en allvarligare fråga. Om frekvensen av tidsbaserad drift slumpmässigt kommer detta att besegra dina kalibreringsinsatser. I huvudsak kommer kalibreringen att berätta hur snabbt eller långsamt din klocka går just nu , men det tillåter dig inte att förutsäga hur snabbt eller långsamt det kommer att gå i framtiden .

Här är den utlovade länken: Arduino klockfrekvensnoggrannhet, av Joris van Rantwijk.

Vad Joris gjorde är att mäta noggrannheten och stabiliteten hos en Arduino ProMini ( klockade av en keramisk resonator) och en gammal Duemilianove (kvartskristall). Från mitt perspektiv är de viktigaste avhämtningarna:

  • båda klockorna är grovt felaktiga, så båda behöver användarkalibrering för att kunna användas som klockor
  • kvartskristallen i Duemilianove har anständig stabilitet, bättre än 1,5e-8 vid 6 timmars genomsnittstid
  • Pro Minis keramiska resonator är stabil, mer än två storleksordningar värre än kristallen, vilket gör det till största delen värdelöst som en tidsbit

Här är hans Allanavvikelse-plot, som mäter instabilitet i klockan som en funktion av observationstid:

Allan deviation of Arduino Clock Frequency
(källa: jorisvr.nl) sub >

Även om denna studie har vissa begränsningar (endast två kort testades och observationstiden är för kort) är den väl genomtänkt och mycket informativ. Jag uppmuntrar dig att läsa den i sin helhet.

Kvartskristallernas frekvens förändras något med temperaturen. Om du kan kontrollera temperaturen hjälper det till att hålla frekvensen stabil.
#3
+3
jfpoilpret
2014-02-16 14:20:36 UTC
view on stackexchange narkive permalink

Det bästa sättet att känna till noggrannheten hos styrelsens resonator är att mäta det själv.

För att göra det kan du använda Arduino millis () -funktionen ditt bräde och skriv en liten skiss som:

  1. gör att du kan ställa in starttiden för mätning av tidsdrift (t.ex. med en enkel tryckknapp); du kommer att utlösa knappen baserat på en exakt tidsbas.
  2. ring sedan upprepade gånger millis () tills minst 120 timmar ("arduino timmar", det skulle vara cirka 5 dagar) förflutna
  3. visa en signal när de 120h har gått (din skiss borde förmodligen "varna" dig innan den exakta tiden har nåtts så att du gör dig redo för åtgärd)
  4. när 120h har förflutit, kontrollera din referenstid baserat (används i steg 1.) och kontrollera hur mycket tid som har gått (bör vara 120h +/- epsilon)
  5. när du känner till klockans drift och tillhandahållit ditt bräde körs under samma miljöförhållanden (temperaturen huvudsakligen) som ditt mått, kan du använda det i dina skisser för att justera värdet millis () varje timme.

Naturligtvis är detta tillvägagångssätt långt ifrån perfekt eftersom det kräver mänskligt ingripande och därmed kommer att skapa ytterligare tidsdrivningar under mätningar, det är därför du måste mäta dina klockslagunder en lång period.

Ett förbättrat tillvägagångssätt skulle vara att ansluta en RTC-klocka med hög noggrannhet (noggrannheten måste väljas baserat på den noggrannhet du behöver för din applikation) till ditt bräde och anpassa skissen så att den beräknar automatiskt drift. När du har tagit tiden kan du göra detsamma som steg 5 ovan i dina skisser och koppla bort RTC-klockan från ditt bräde.

Viktiga punkter :

  • mäta tidsdriften på kortet som behöver klockjusteras senare (om du har flera kort måste du mäta en drift per kort)
  • säkerställa stabiliteten i den miljö där din styrelsen kommer att användas

Slutligen, om du verkligen behöver hög noggrannhet, ansluter du definitivt en extern klockkälla (t.ex. RTC-klocka, GPS, NTP) till ditt kort och använder den som SyncProvider för PJRC-biblioteket.

#4
+2
jippie
2014-02-16 13:50:26 UTC
view on stackexchange narkive permalink

Din genomsnittliga systemklockkristall stängs av med flera tiotals ppm (delar per miljon. De är utmärkta för stabil och korrekt timing av signaler, men dramatiska för att hålla exakt tid. Utan särskilda bestämmelser kan systemkristallen vara avstängd med flera sekunder per dag.

Lösningen är att använda en riktig realtidsklocka, driven av det som vanligtvis kallas en 32768Hz klockkristall. Dessa kristaller är lätt en faktor 10 bättre i noggrannhet. Du kan antingen ställa in din egen oscillator som avbryter huvudprocessorn och håller räkningen i din Arduino-skiss eller så hittar du ett RTC-brytbräda.

Två slumpmässiga exempel som dyker upp i Google med sökord "RTC breakout":



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...