De kerels van Hey...
Hier is een opvolging van het project van de digitale klok dat ik over een jaar geleden gepost heb. Ik heb niet overwogen de drift van de RTC-module! Ik heb gevonden de drift te zijn plus 1 RTC minuut voor elke 21 dagen voorbij, dat is enorm. Dit is al na heroriëntatie op de xtal-oscillator in de module van de break-out DS1307 om zo dicht mogelijk bij de chip mogelijk te zijn, die samen met andere overwegingen, in de maxim app Opmerkingwerd gesuggereerd.
Opties overwogen:
1. optimaliseren van RTC: Kijk voor de beste xtal, bijpassende capacitances, etc, etc <--niet onmogelijk
2. handmatige decrement knop voor de minuten waarde toevoegen <--dit betekent dat wijzigingen in de hardware. De gemakkelijke uitweg!!
3. auto-kalibratie door de host-microcontroller
Het algoritme:
Wat ik nodig heb is een automatische software gebaseerde kalibratieroutine. Na sommige proeven (en eigenlijk vinden van de tijd om het te doen!), kwam ik met dit... Opslaan van de cal factor 21 (dagen per minuut) en de dag de laatste cal werd gedaan op een handige locatie voor niet-vluchtig. Elke keer dat de klok is ingeschakeld (in mijn geval dat is elke ochtend 7:05 uur, met uitzondering van weekends en feestdagen ;), de mcu leest deze waarden en vergelijken met de huidige RTC datum als veelvouden van 21 dagen reeds is verstreken. Als ja, decrement minuut waarde door de overeenkomstige graaf sla huidige dag terug naar de locatie van de 'lastCalDay'. Hetzelfde controleren op de volgende kracht...
De uitvoering:
Voor de locatie van de cal heeft DS1307 een 'algemene reservebatterij ram met onbeperkt schrijft'. Voor de calFactor en de lastCalDay zullen we twee 8-bit bytes. Voor het tellen van dagen verschil, zullen we de RTC-datum (maand en dag getallen) omzetten in een enkel geheel getal vanaf een referentiedatum. We kunnen voor dit eerste dag van het huidige jaar gebruiken als referentie, dagnummer 1. Dit betekent dat het maximum aantal dagen tussen cal mag niet meer dan 365. Met behulp van dagnummer is handig om het verschil te krijgen, en ook voor het opslaan van de datum op het RAM-geheugen. Voeg gewoon de voorziening voor nieuwe jaar wanneer dagen tellen van 365 tot 1 teruggaat. Eenmaal dagen verschil wordt bepaald dat we vervolgens het desbetreffende aantal minuten kunt verlagen. Voor de eenvoud van de code koos ik om cal overslaan als de resulterende minuut verschil zal wrong weerom het cijfer van uren. Raadpleeg de attachmed voor de volledige code uitvoering.
De resultaten:
Resultaten van mijn validatie gebleken juiste werking zoals ontworpen. Natuurlijk, de code, en inderdaad het algoritme kunnen nog steeds worden geoptimaliseerd voor de nauwkeurigheid en elegantie, maar voor nu deze werkt voor mijn doel prima!
Laat het me weten als je meer details nodig indien u wenst te maken van dit project... Suggesties zijn ook welkom.
Bedankt. Geniet van!