....ein kleiner Sommerloch-Füller......Sekundentakt, auch so kann mans machen:
Wie schon öfter zuvor war wieder mal für ein ganz anderes Projekt
eine halbwegs exakte Zeitmessung gefragt.
Weil hier aber aus verschiedenen Gründen eine klassische Lösung mit einem
"Uhrenquarz" nicht in Frage kam und die Schaltung weiterhin mit
ca 4MHz betrieben werden sollte (wg.PWM) musste eine andere Lösung her.
(es gibt die Möglichkeit, einen 32.768 kHz Quarz als Taktgeber nur für die Uhr
anzuschliessen und den Atmega über den internen Oszillator zu takten, aber
ich kann in diesem Fall mit 1 oder 8 MHz nichts anfangen, ich brauche
einfach ca. 4MHz um eine PWM-Frequenz von etwa 8 kHz zu erhalten)
Bisher habe ich hierzu einfach einen Timer laufen lassen und
die erhaltenen takte gezählt und dann entsprechend in Minuten
umgerechnet. Das ist aber nie wirklich genau geworden, nur so bis
etwa +- eine Minute pro Tag. Es hat zwar locker gereicht, und
war auch absolut ganggenau, nur eben mit fester Abweichung aber
eine wirkliche Uhr wars halt nicht
Diesmal wollte ich das ein bisschen eleganter hinbekommen.
So richtig mit zuvor ausrechnen und dann passts.
Das bisherige Verfahren war gar nicht so schlecht, nur der Abgleich
war nicht so toll gelöst und nicht fein genug, weils halt einfach nicht passte.
Der 4MHz Takt und die Teilung durch 1024 ergeben einfach kein
"Stunden-Kompatibles" Ergebnis, irgend ein Rest bleibt immer.
eine Sekunde pro Stunde macht einfach schon fast eine halbe Minute
pro Tag. Damit kann man heutzutage niemand mehr beeindrucken!
Aus meiner Charger-Steuerung hatte ich noch 4,0960 MHz Quarze übrig.
(da war ein 1,0 kHz Rechteck zu erzeugen)
Das passt hervorragend, weil damit bei einem Prescaler von 1024
eine Taktfrequenz von exakt 4kHz am Timer entsteht. ( 4 * 1,024 = 4,096)
Damit kann man was anfangen, das sind "gerade" Zahlen zum runterteilen.
Ein anderer gängiger Wert der gut geeignet wäre sind 3,6864 MHz.
(ein typischer "Baudratenquarz" mit dem fast alle gängigen Baudraten möglich sind
Der Hauptvorteil des 3,6864 MHz Quarzes wäre eine größere Anzahl an Baudraten
die perfekt passen würden. Damit ergibt sich nach dem Vorteiler 1024
eine Frequenz von 3600Hz am Timer.Das ist auch als Zeitbasis bestens geeignet.
Es kommt halt immer drauf an, was man denn letztendlich haben will.
Ich habe den 4.0960 MHz Quarz genommen, weil ich den ganz einfach schon
da liegen hatte und derzeit die serielle Schnittstelle nicht benötigt wird.
Falls man die serielle Schnittstelle braucht, dann wäre der 3,6864 MHz Quarz auf alle
Fälle vorzuziehen. Die Abweichung der PWM-Frequenz ist normalerweise
das geringere Problem.Da werde ich mir mal ein paar besorgen wenn ich wieder
mal Bauteile bestelle. Ich muss mal eine Liste erstellen, was wofür geeignet ist.
(Baudraten, PWM-Frequenzen und geradzahlige Taktfrequenzen)
erst mal einen Timer initialisieren:
Config Timer2 = Timer , Prescale = 1024 'Konfiguriere Timer2
Enable Timer2
On Timer2 Count_von_timer2
Dann für Ordnung nach dem Einschalten sorgen
Timer2 = 6 '250 Schritte
'Timer2 = 31 '225 Schritte
Count0 = 0
Countmin = 0
Sek = 0
und das dazugehörige Unterprogramm:
Count_von_timer2:
Timer2 = 6 '=250 Schritte mit 4kHz =16Hz
'Timer2 = 31 '=225 Schritte mit 3,6kHz =16Hz
Incr Count0
If Count0 >= 16 Then ' 16 Schritte = 1 Sekunde
Incr Sek
Count0 = 0
End If
If Sek >= 60 Then
Incr Countmin ' "long-Variable, läuft nicht so schnell über....
Sek = 0
End If
Return
So habe ich ein sehr exaktes Sekunden und Minutensignal.
In drei Tagen weniger als eine Sekunde Abweichung! Noch besser als erwartet!
Nachtrag: mittlerweile fast 100Stunden gelaufen, noch immer keine feststellbare Abweichung!
Die Umrechnung in Stunden geschieht im Hauptprogramm,
aber das ist dann eh nur fürs Display. Hier wird intern in Minuten gerechnet,
da gehts eigntlich gar nicht sooooooogenau, aber ich wills diesmal korrekt haben,
auch im Hinblick auf ein demnächst mal aktualisiertes Franzbox-Programm
wo die Genauigkeit der Messungen verbessert werden soll.
Nachtrag: Aber auch mit den 4 MHZ der Franzbox bekäme man einen brauchbaren Takt hin!
.......oder wenn für Arduino-Kompatibilität 8 bzw sogar16 MHz-Quarze eingesetzt würden.
Ich war nur damals einfach noch nicht so weit das anders zu machen.....
Das muss ich bei einem der nächsten Updates mal korrigieren.
Mit 16MHz ist z.B. ein exakter 500Hz Takt möglich also 125Hz bei 4MHz.
ich habe im Box-Programm aber versucht, die Messung direkt vom Timer aus zu steuern
und habe den Timer deshalb möglichst langsam laufen lassen mit ewa 15 Durchläufen pro Sekunde.
Das funktioniert auch, aber es schafft auch noch ganz andere Probleme auf die ich hier aber nicht
eingehen will. Besser wäre es gewesen, mit 125Hz zu takten und dann die auszuführenden Aktionen
auf den Durchlauf so zu verteilen dass es nicht zu Timimgproblemen kommt.Manche Dinge müssen
nicht gar so oft erfolgen insbesondere das Schreiben ins Display oder Messungen der 12V-Batterie
Keine Kommentare:
Kommentar veröffentlichen