Vraag:
Hoe krijg ik een nauwkeurige tijd?
John Walthour
2014-02-12 07:34:28 UTC
view on stackexchange narkive permalink

Ik heb een klok gemaakt met een Arduino, maar de tijd lijkt te afwijken. Ik ben op de hoogte van het probleem met rollover; de klok lijkt in de loop van een week ongeveer 15 minuten te bewegen.

Ik gebruik een aangepaste printplaat met deze resonator van Digi-key. De code leest de millis () -functie aan het begin van elke lus en werkt vanuit die waarde.

Mijn vraag is: hoe kan ik de tijd meten met een Arduino, nauwkeurig genoeg om een ​​redelijke bureauklok te maken?

De milliseconde-functie wordt geleverd met gegevens van een interrupt, die een paar klokcycli nodig heeft om te lopen. Dit voegt een minuscule hoeveelheid tijd toe aan elke tik.
@TheDoctor: Dit is niet juist. De interrupt vertraagt ​​de hardwaretimer die `millis ()` aandrijft niet.
Vijf antwoorden:
Ricardo
2014-02-12 08:07:08 UTC
view on stackexchange narkive permalink

Opmerking: hoewel mijn antwoord werd geaccepteerd en een hogere stemscore heeft, moet je het goede antwoord van Edgar Bonet lezen over hoe je je Arduino de tijd kunt laten houden zonder een RTC.

Ik ben redelijk succesvol geweest in het gebruik van de DS1307 Real Time Clock. Hier is een link naar zijn datasheet.

Hieronder staan ​​enkele van zijn kenmerken:

  • Het gebruikt een IC-interface voor communicatie met Arduino, waardoor het gemakkelijk is om te programmeren met behulp van de juiste bibliotheken (beschikbaar op het net).

  • Het is verbonden met Arduino via de SCL- en SDA-pinnen (respectievelijk analoog A4 en A5), dus alleen met 2 pinnen.

  • Het vereist zeer weinig externe componenten om te werken.

  • IT kan worden aangesloten op een knoopcel batterij, zodat het de tijd zal houden, zelfs als de Arduino is uitgeschakeld. In de energiebesparende modus gaat de knoopcelbatterij jaren mee.

  • Hij drijft heel weinig (in mijn geval drijft hij maar een paar seconden per week).

  • Het is niet erg duur.

Als u niet van plan bent een RTC te gebruiken, kunt u het kristal dat gewoonlijk wordt gebruikt vervangen om een ​​klok te leveren aan arduino voor een kristaloscillatormodule zoals deze van Farnel of deze andere. Ze worden geleverd in 4-pins pakketten zoals in de onderstaande afbeeldingen. Ze zullen een veel nauwkeurigere klok voor je arduino genereren.

Crystal oscillator image Crystal oscillator image Crystal oscillator image

Beide genoemde modules hebben toleranties van 50 ppm en werken op 5V.

Nogmaals, voor de duidelijkheid, deze kristaloscillatormodules moeten niet worden verward met normaal 2-pins kristal zoals hieronder. Die maken bijvoorbeeld deel uit van het circuit van externe klokken voor MCU's.

Crystal oscillator

Is de DS1302 goed genoeg of moet ik naar de DS1307 verhuizen?
Edgar Bonet
2015-03-05 17:25:15 UTC
view on stackexchange narkive permalink

Je hebt geen RTC nodig om een ​​klok te bouwen: de ATmega-chip heeft alle hardware die nodig is om de taken van de RTC zelf uit te voeren. Hier is hoe:

  1. Koop een 32768 Hz horlogeglas: koop het of demonteer een oude klok. Deze kristallen, speciaal ontworpen om de tijd bij te houden, hebben een extreem temperatuurverloop. Je zou er ook een nodig hebben als je een RTC-chip zou willen gebruiken.

  2. Configureer de zekeringen van je ATmega zodat ze op de 8 MHz RCoscillator lopen. Dit maakt uw millis () -functie vreselijk onnauwkeurig en maakt ook de XTAL1- en XTAL2-pinnen vrij.

  3. Verbind het horlogekristal met de TOSC1- en TOSC2-pinnen . Dit zijn dezelfde pinnen als XTAL1 en XTAL2 (9 en 10 op de 328P). De verschillende namen worden gebruikt om verschillende functies aan te duiden.

  4. Configureer de timer / teller 2 voor asynchrone werking, normale telmodus, presaler ingesteld op 128 en schakel de timer overflowonderbreking in.

Nu krijg je een TIMER2_OVF-interrupt met een zeer constante snelheid van één keer per seconde. U hoeft de klokweergave slechts één seconde vooruit te zetten in de ISR. Tussen de onderbrekingen door kunt u de MCU in zeer diepe slaap zetten (energiebesparende slaapstand: niets werkt behalve Timer / Teller 2) en jarenlang op een paar AA-cellen draaien. Tenzij het beeldscherm veel stroom verbruikt, natuurlijk.

Ik heb precies dit gedaan om mijn 24-uurs eenhandige muurklok te bouwen. Deze link verwijst nu naar de Engelse vertaling van de originele documentatie in Frans.

Kwarts-kalibratie

Als u uw kwarts niet kalibreert, kunt u een aanzienlijke afwijking verwachten, meestal een paar seconden per week . De driftsnelheid is afhankelijk van de straalcapaciteit van de sporen die het kristal met de MCU verbinden. In principe zou het kunnen worden verwijderd door wat extra, fijn afgestemde capaciteit toe te voegen. Het is vermeldenswaard dat u hetzelfde driftprobleem zou hebben met een RTC.

Als u tevreden bent met dit soort nauwkeurigheid, leef er dan mee en wees vrolijk. Als u echter de drift wilt meten, zult u merken dat deze erg stabiel is. U kunt dit dan gemakkelijk compenseren in software, en een nauwkeurigheid bereiken van een paar seconden per jaar .

Het algoritme voor het corrigeren van de drift is heel eenvoudig. Aan de hand van de gemeten afwijking bepaal je de precieze vertraging tussen de interrupts, die heel dicht bij 10 9 nanoseconden moet zijn, en dan:

  #define ONE_SECOND 1000000000 // in nanoseconden # definieer ONE_INTERRUPT 999993482 // bijvoorbeeldISR (TIMER2_OVF_vect) {statische uint32_t unaccounted_time; unaccounted_time + = ONE_INTERRUPT; while (unaccounted_time > = ONE_SECOND) {advance_display_by_one_second (); unaccounted_time - = ONE_SECOND; }}  

In het bovenstaande voorbeeld is de quartz iets te snel en compenseert de software door om de paar dagen een vinkje te "missen". Als het kwarts te laag was, zou dezelfde code in plaats daarvan elke paar dagen dubbel tikken.

Dit soort kalibratie kan ook worden gedaan voor een RTC, maar het zou aanzienlijk ingewikkelder zijn omdat de RTC de tijd rapporteert in afgebroken vorm die zich van nature niet leent voor rekenkundige bewerkingen.

Wauw, dat is echt een strak ontwerp! Ik hou echt van hoe je genoeg foto's hebt opgehangen om het ontwerp duidelijk te maken, zelfs voor ons, dwaze monoglot Amerikanen :) Ik vind het heel leuk om expliciete projectdocumentatie zoals deze te zien!
@JohnWalthour: Bedankt! Nu moedig je me aan om een ​​vertaling te schrijven. :-)
@JohnWalthour: Klaar! De link verwijst nu naar de Engelse vertaling.
Voor de duidelijkheid: als je zegt: "ATmega-chip heeft alle benodigde hardware", is dat niet helemaal waar als je een nieuw kristal moet aanschaffen. Ik denk dat je oplossing glad is en niet boven het vervangen van het kristal, maar ik was een beetje in de war toen je zei dat ik geen hardware nodig heb en je dan omdraait en zegt dat ik een stuk hardware moet vervangen.
@KellyS.French: Mijn zin was "de ATmega-chip heeft alle hardware die nodig is ** om de taken van de RTC ** zelf uit te voeren" (cursivering toegevoegd). Maar dan is het belangrijk op te merken dat de meeste RTC's, inclusief de alomtegenwoordige DS1307, een extern kristal nodig hebben om te werken. De ATmega is niet anders: hij heeft alles wat nodig is om _de RTC zelf_ te vervangen, maar niet om het kristal te vervangen dat je toch op de RTC zou moeten aansluiten. Houd er rekening mee dat een RTC _module_ _meer_ is dan alleen een RTC, aangezien deze het kristal bevat.
@EdgarBonet eerlijk genoeg meneer! Ik hoop dat ik niet onbeleefd overkwam, ik drukte mijn verbazing uit.
mpflaga
2014-02-12 08:37:29 UTC
view on stackexchange narkive permalink

De resonator die je hebt gespecificeerd heeft een stabiliteit van 0,3%, waarbij de kristal- of kristaloscillator (zoals vermeld door Ricardo) 50 ppm is. Vele malen stabieler. Om nog maar te zwijgen over het temperatuurverloop van de resonator is verschrikkelijk. Door verwarming door zonlicht verandert dit. Daarom mag een resonator niet worden gebruikt om de tijd gedurende lange perioden bij te houden.

Als u dus een kristal of een kristaloscillator gebruikt, krijgt u wat u wilt. Gebruik het op de ATmega en stel de zekeringen respectievelijk in of gebruik een verbinding met een RTC.

Waar 50ppm is 0,005% stabiliteit?
Ik generaliseer over die specificatie, om het antwoord kort te houden. Let op stabiliteit terzijde Res. hebben een veel grotere tolerantie en kunnen behoorlijk afwijken. Zoals John W ervaart. "het juiste onderdeel voor de juiste baan"
Oh, ik was gewoon nieuwsgierig naar de terminologie @mpflaga ... nieuw voor mij.
jippie
2014-02-12 12:22:09 UTC
view on stackexchange narkive permalink

Als u geen extra hardware zoals een Real Time Clock (bijv. DSDS1307) wilt gebruiken, kunt u de nauwkeurigheid van de timing aanzienlijk verbeteren door alle ongebruikte interrupts uit te schakelen. Standaard worden Arduino-sketches geleverd met verschillende interruptroutines ingeschakeld en worden ze vaak niet gebruikt voor je sketch. De snelste manier om erachter te komen of u het zonder kunt om ze uit te schakelen, is door noInterrupts ();

uit te geven.
-1 (hoewel dit -4 verdient) omdat: 1. Tenzij je ze echt nodig hebt, alle interrupts standaard zijn uitgeschakeld, met als enige uitzondering TIMER0 \ _OVF, die nodig is voor het bijhouden van de tijd. 2. De nauwkeurigheid van de timing van de Arduino's wordt voornamelijk beperkt door de kwaliteit van de resonator. 3. Interrupts hebben geen invloed op de nauwkeurigheid van `millis ()`, tenzij het je lukt om meer dan een milliseconde tegelijk aan het onderhoud te besteden, in welk geval je andere problemen hebt ... 4. Interrupts uitschakelen met `noInterrupts ()` zal voorkomen dat `millis ()` helemaal de tijd bijhoudt!
Chris K
2014-02-12 10:48:40 UTC
view on stackexchange narkive permalink

Ik begrijp dat veel van de geest van Arduino is om zuinig te zijn en af ​​en toe door een probleem te sjokken. Ik gebruik Arduino (en nu chipKIT, aangezien het 10x het RAM-geheugen en 10x de kloksnelheid heeft) voor mijn werkplek en ik heb "perifere functies" nodig om op snelheid te zijn en zo snel mogelijk te werken.

I gebruik de sparkfun real-time klok in een van mijn projecten en ben er erg blij mee. Ze hebben ook een "Dead on" -variant.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...