Genaue Netzfrequenzmessung mit Arduino Nano <5mHz

Hallo Leute,

Für ein Projekt muss ich einen Frequenzmessgerät bauen, welches welches eine Genauigkeit von <5 mHz aufweist. Die Hardware habe ich schon fertig und bekomme ein Rechtecksignal mit Hilfe eines Schmitt-Triggers etc. auf den Digitalen Input meines Arduinos. Habe dann ein Programm mit dem attached Interrupt geschrieben und als Timer die micros() Funktion verwendet, allerdings zählt micros() nur alle 4 Microsekunden und daher kommt es zu Abweichungen mit über 10 Microsekunden. Dann habe ich es noch einmal mit der Freqcount.h library die ich via Google gefunden habe, allerdings bekomme ich dann keine Nachkomma stellen. Daher meine Frage, ist es überhaupt möglich eine so genaue Messung mit dem Nano zu realisieren, wenn ja wie? und hat eventuell jemand einen Tipp für die weitere Herangehensweise.

Grüße

Atmoz22

Du wirst um eine stabile und genaue Referenzfrequenz nicht drumrumkommen, wenn es Dir tatsächlich auf Genauigkeit ankommt. Die bekommst Du mit dem Nano als Bezugsfrequenz sicher nicht hin, oder Du bist bereit mit den Toleranzen zu leben. Du kannst natürlich auch den Nano-Takt mal ausmessen (lassen), dann weißt Du wenigstens über die Abweichung vom Soll Bescheid. Hilft aber auch nix wenn Temperaturdrift dazukommt.

Kurzum: das ist nicht so einfach zu machen wie Du das vielleicht vorstellst. Zumindest mit den gelieferten Informationen.

Nochwas: Netzfrequenz ist langzeitstabil - das muss die Referenz dann auch sein, mindest mal um den Faktor 2 sogar besser.

Die bekommst Du mit dem Nano als Bezugsfrequenz sicher nicht hin, oder Du bist bereit mit den Toleranzen zu leben.

Den Resonator durch einen hochwertigen Quarzoszillator ersetzen. Wenn es ganz genau werden soll, einen der beliebten Quarzöfen verwenden.

Auch sind Interrupts da nicht immer Zielgenau.(siehe ATOMIC) z.B. Besser einen TimerEingang verwenden, und Ereignisse zählen. Darum heißen die Dinger ja auch Counter, und nicht nur Timer.

Danke für die schnellen Antworten. Das heisst also für mich, da der Nano nicht genau 16 MHz hat fällt die Ermittlung mit den Timern, vor allem hinsichtlich einer dauerhaften Messung weg. Wenn ich das richtig sehe habe ich die Möglichkeit mit der aktuellen Abweichung aufgrund der Micros Funktion zu leben oder als Bezungsfrequenz einen externen Quarz zu verwenden, wobei ich da überhaupt keine Vorkenntnisse habe wie das mit dem Arduino zu realisieren ist.

Es gibt fertige Arduino-Klone mit einem Quarz statt Resonator.

Oder du baust dir deine eigene Platine. Da kannst du Quarz + Last-Kondensatoren so genau machen wie es die Technik erlaubt.

Naja ich hatte einen Billigresonator auf dem Nano mit 15,595 Mhz.. wenn man das nicht weiß wird man im Millisekundenbereich ganz schön hinters Licht geführt.

Ohne großen Aufwand, aber großem Equipment kann man ein GPS Modul benutzen.. sollte es ab 10€ geben.

Bei den billigen Modulen weicht das GPS UTC Time Synchronisierte "Pulse Per Second" PPS-Signal gerade mal 100ns ab. Zwischen zwei Impulsen zählt man dann das zu messende signal.. zum Beispiel mit Timer1, ICP Capture und T1 als Eingang.

Als Notlösung könnte man auch ein DS3231 Modul nehmen, das hat auch einen PPS Pin oder als Bezug ein ebenso genauen Temperaturkompensierten 32768hz Output. Kost 1,50 und kommt halt drauf an wofür das ganze sein soll, ob das genau genug ist.

Die Stabilität der Sinus-Rechteck Umwandlung spielt auch eine Rolle. Bei den Schaltschwellen eines Schmitt-Triggers kann die Temperatur auch eine Rolle spielen, je nach Schaltung. Man sollte daher auch prüfen, wie weit die gemessene Periodendauer streut.

Für ein Projekt muss ich einen Frequenzmessgerät bauen, welches welches eine Genauigkeit von <5 mHz aufweist

5 mHz / 50 Hz = 100 ppm. Das ist also nicht soo aufwendig. Die üblichen Quarze liegen bei 20 ppm, ein Selbstbau - Atmega328p mit Quarz sollte also reichen:
http://www.gammon.com.au/images/Arduino/Minimal_Arduino7.jpg

Klaus_ww:
Nochwas: Netzfrequenz ist langzeitstabil

Das wäre auch eine Alternative: Kalibriere deine Messung durch Vergleich mit öffentlichen Online-Werten Oder mach es sportlich durch eine Langzeit-Messung. Die Netzzeit hax eine max. Abweichung von 20 sec. Nach allerspätestens 2 Tagen bist du auch unter 100 ppm Abweichung … :wink:

Reden wir jetzt von milliHerz oder MegaHerz? Grüße Uwe

Atmoz22: allerdings zählt micros() nur alle 4 Microsekunden und daher kommt es zu Abweichungen mit über 10 Microsekunden.

5mHZ sind 200 Sekunden!

Hertz ist eine Maßangabe in Bezug auf Sekunden, 5mHz sind dann 1/0,005=200

Was ich da jetzt nicht verstehe.. "5mHz" sind 5000 Microsekunden?? für eine Abtastung würden Millisekunden reichen.

Er will aber nicht 5 mHz messen, sondern eine Auflösung und Genauigkeit von mindestens 5 mHz.

@Michael: man kann die Netzfrequenz nicht sonderlich genau messen, wenn man sie auch als Referenz nimmt :D

Ich habe das so verstanden:
Es sollen 50Hz überprüft werden.
50,005 oder 49,995 Hz sollen als Abweichung erkannt werden.
Die Abweichung soll in 0,005Hz Schritten ermittelt werden können.

Richtig?
Oder habe ich recht?

Stimmt, wieso man das auch immer mHz nennt, war mir noch nie aufgefallen.

Wenn man erstmal die quarzfrequenz ermittelt hat ist der Rest einfach..

Edit: Es ist womöglich trotzdem nicht korrekt, im Prinzip sind es mKHz.

Naja, mHz sind halt 10E-3 Hz, genauso wie kHz eben 10E3 Hz sind. Und wie wir schon wissen ist es mit dem Ermitteln der Quarzfrequenz nicht ganz getan denn da gibt's halt auch Drift.

Aber unser TO soll halt mal sagen, ob das reicht.

man kann die Netzfrequenz nicht sonderlich genau messen, wenn man sie auch als Referenz nimmt

Warum nicht? Wenn man darauf vertraut, dass der langfristige Mittelwert 50,000 Hz sind, kann man das doch als Referenz nehmen? Wenn nicht, bzw. man diese Annahme überprüfen will, braucht man natürlich eine separate Referenz (Quarz, ist kurzfristig erheblich konstanter, driftet aber langfristig beliebig viel weiter weg als die Netzfrequenz).

Atmoz22 (TO) hat übrigens auch noch nicht verraten, wie schnell er die Abweichung erkennen können muss/will.

Wenn er nur ganze Schwingungen zählt, braucht er für 5 mHz Auflösung tatsächlich 200 sec (also über 3 Minuten), wie Suppeste richtig bemerkt hat.

Alle 10 ms hätte er allerdings einen Nulldurchgang. Wenn er die Zeit bis zum nächsten auf 10 ms * 0.0001 = 1.00 µs genau messen könnte (was mit einem Arduino schwierig wird), hätte er seine genaue Frequenzmessung in Echtzeit. Aber die Zeit für 50 Schwingungen (ca. 1 sec) kann man auf 0.01 % genau (100 µs / 1000000µs) bestimmen. Oder (1 ms / 10 sec), gibt auch noch recht spontane Werte.

Die Aufgabe lässt sich aber nicht durch Suche einer passenden Library im Internet lösen, hoffe ich.

Wieso muss du ein Frequenzmessgerät bauen? Geht es darum ein Netzrelais zu bauen? Sowas gibt es doch wie Sand am Meer ;P

So, ich bringe mal etwas Licht ins dunkle: Ziel des Messgerätes ist es die Schwankungen im Stromnetz aufzunehmen. Die Messwerte werden im Sekundentakt über eine rs232 Schnittstelle gesendet. Aktuell nehme ich 50 Werte auf mittel sie und gebe sie dann aus. Habe testweise die Messung mit einem Frequenzgenerator durchgeführt welcher auf microHz genau ist und hatte eine Abweichung von 10 milliHz. Mit einem Programm in welchem ich die Timer genutzt habe waren die Abweichungen noch größer; da der Takt anscheinend keine 16 MHz ist. Daher suche ich jetzt halt nach einer Möglichkeit die Messgenauigkeit der einzelnen Werte zu erhöhen. Aber scheinbar geht ja kein Weg drum herum einen Quarz zu verwenden und auf die Arduino ide zu verzichten

Atmoz22: Aber scheinbar geht ja kein Weg drum herum einen Quarz zu verwenden und auf die Arduino ide zu verzichten

Wenn man genau auf die Platinen schaut, dann ist es kein Problem einen Arduino-Nachbau mit Quarz statt ungenauem Resonator zu finden. Wahllos herausgegriffenene Beispiele: httUNO-R3-ATMEGA328P-CH340G-MICRO-USB-Development-Board-Compatible-to-Arduino oder UNO-R3-Arduino-kompatibel-gesockelter-ATmega328P-PU-16MHz-USB Man erkennt deutlich den zweiten großen Quarz auf der Platine.

Habe noch so einen hier zu Hause rumfliegen: http://www.ebay.de/itm/201528050952?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

der müsste ja funktionieren. Wenn ich den verwendende kann ich ja auch die freqcounter.h Library verwenden von (http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/) nur bekomme ich dort keine Nachkomma stellen. Lässt sich das Programm irgendwie anpassen, dass ich die Nachkommastellen bekomme?