Präzise Zeitmessung beim Atmega 2560

Hallo zusammen,

vielleicht könnt ihr mir weiterhelfen. Ich habe ein Programm auf einem Atmega2560 (16MHz) mit einem 16bit Timer, der die Zeiten t1=5s und t2=2s misst. Jetzt ist meine Frage auf wie viele Nano oder Mikrosekunden genau misst der Controller die Zeiten und wie berechne ich das.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Das hängt davon ab, ob Du einen Quarz oder Resonator eingebaut hast und wie weit der in der Produktion streut. Außerdem hat die Temperatur einen Einfluß, ist sie konstant oder stark schwankend.

Quarz ist keiner verbaut und die Temperatur kann man als konstant ansehen (Laboraufbau)

Pauschal gesagt, ist der verbaute Resonator nicht sehr genau, was heißt, das du damit keine präzise Zeitmessung erhältst.
Was du dann berechnen willst, hast du noch nicht beschrieben.

Ah sorry. Ich meine wie groß die Abweichung von der vorgegebenen Zeiten (t1) und der tatsächlich vergangenen Zeit ist. Also zum Beispiel sollte t1 5 Sekunden laufen, läuft aber tatsächlich nur 4,995 Sekunden und diese tatsächliche Zeit möchte ich berechenen.

Das wird ohne Justierung nix. Zuerst musst du mit einer Referenz die Abweichung des µC bestimmen.

Zur eigentlichen Messung: Einen Interrupt benutzen und im Interrupthandler dann mit https://docs.arduino.cc/language-reference/funktionen/time/micros/ die Schaltzeiten messen.

Werde ich probieren, danke.

@uwefed hatte mal dazu was geschrieben, eventuell meldet er sich ja :wink:

1 Like

Die 16 MHz kommen von einem Resonator mit ca. 1promille Genauigkeit. (1s Abweichung in 20 Minuten) Das ist die einzige Zeitbasis eines nackten Arduino.

Wenn du damit 5,000 s misst, können das auf einer anderen Uhr durchaus 4,995 ... 5,005 s sein, ohne dass du annehmen musst, das beide Uhren fehlerbehaftet sind.

Es gibt auch Quarze, die typischerweise eine Genauigkeit von 30 ppm haben, also 30fache Genauigkeit.

Wenn du also eine vertrauenswürdige Referenz-Uhr hast, kannst du überprüfen, ob das beobachtete Geschwindigkeitsverhältnis einigermaßen konstant ist (kurzfristig bei den auftretenden Temperaturschwankungen und langfristig).

"Genau" ist relativ. Wenn du erzählst, warum und wie genau du es brauchst, kann man evtl. über den erforderlichen Aufwand diskutieren.

1 Like

Zum Verständnis ich habe mit dem Resonator eine Genauigkeit bei 5s von +-0,005s und dann würden noch Temperaturschwankungen hinzukommen, richtig?

Eine Referenz-Uhr habe ich nicht, der Versuchsaufbau ist von unserer Hochschule und ich habe nur Zugriff über Remotedesktop (ändern kann ich da also leider nichts). Das Projekt war eine Totmannschaltung zu realisieren (da brauch ich es also auch nicht extrem genau) und eine Aufgabe in der Dokumentation war eben wie stark die Zeiten t1 und t2 von den tatsächlich eingestellten Zeiten abweicht.

Wenn du erkennen kannst, dass die Abweichung 0,001s je Sekunde ist, hast du doch eine Referenz-Uhr.
Und die Aufgabe ist nicht, diese auf 0 zu bringen, sondern sie zu dokumentieren.
Eventuell mit der Bewertung, dass dies für die Aufgabe (Totmannschaltung) völlig ausreichend ist.

Es hängt von deiner Timer Konfiguration ab.
Ich hoffe das du nicht von millis() oder micros() redest.
Mit Prescaler 1 kannst du bis auf 62,5ns (1/16MHz) genau messen, was ein Takt entspricht. Mit Prescaler 2 entsprechend bis auf 125ns genau usw.
Wie genau dieser eine Takt von 62,5ns wirklich genau 62,5ns ist, hängt von den schon erwähnten Bauteilen usw. ab. Du kannst ja einmal berechnen wieviel Taktabweichung bspw. 100ppm oder 1000ppm entsprechen.
Um wirklich zu wissen wie genau dein Arduinoboard taktet, dazu benötigst du eine Referenz der du vertraust. Also wie immer im Leben.

1 Like

ok, ich melde mich, weiß aber nicht mehr was ich wann geschrieben habe. Sorry.
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.