Erfahrung mit Frequency Counter Library?

Hallo,
hat jemand hier im deutschen Forum schon Erfahrungen mit der Frequency Counter Library und der dazu abgebildeten Schaltung mit BC549 gesammelt?

hier der Link:
http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/

Die threads im englischem Forum habe ich schon gelesen. Mich interessiert jedoch, ob hier Erfahrungen zur Kalibrierung gemacht wurden und welche Anwendungsmöglichkeiten es gibt.

Ich habe vor damit die Drehzahl eines Dreiphasen-Wechselstromgenerators auszumessen (eine Umdrehung = 6 Phasenwechsel)

Gruß Klaus

Wie genau soll die Kalibrierung ausfallen? Wenn der Arduino mit Quarz und nicht etwa mit Resonator läuft sind +/- 100ppm also 0.1 Promille überhaupt kein Problem. Wenn Du es genauer brauchst, dann brauchst Du eine möglichst genaue Zeitbasis. Es ist überhaupt kein Problem mit dem Arduino 16MHz aufzulösen, aber mit dem Quarz kannst Du nur schwerlich besser als +/- 100pm erreichen.

Für +/-2.5ppm fällt mir als billigste Lösung ein DS3231 ein. Gibt's auch fertig verlötet von verschiedenen Anbietern (z.B. hier http://macetech.com/store/index.php?main_page=product_info&cPath=5&products_id=8).

Falls das nicht reicht, dann erklär uns was für einen Generator Du da überwachen willst :slight_smile: Falls Du jedenfalls völlig sinnfrei die Genauigkeit so richtig übertreiben willst, dann such mal bei Ebay nach
"Efratom" oder "Thunderbolt GPS" :wink:

Udo

Hallo Udo,
also die Genauigkeit, wie Du sie beschrieben hast würde vollkommen ausreichen (mit Quarz). Ich hatte da wohl einen falschen Denkansatz und meinte, dass man bei Verwendung der im obigen Link gezeigten Schaltung erst noch eine Kalibrierung erfolgen müßte.

Für mich als eher Einsteiger, ist die Dokumentation zur Frequency Counter Library etwas schmal. :slight_smile:

Bei dem Generator handelt es sich um einen Dreiphasen-Scheibengenerator an einem Windrad. Er hat neun Spulen und 2 x 12 Magnete (verteilt auf zwei Rotorscheiben).
Die Leistung liegt max. bei ca 300 W - wird aber sicher nur sehr selten erreicht werden. :frowning:

Für die Frequenz (daraus die Drehzahlableitung) würde eine Messung zwischen zwei Phasen ausreichen. Die min. und max. auftretenden Spannungen liegt hier zwischen 1,5 (bei ca. 50 U/min) und 25 V.

Bei dem gestrigen ersten kurzen Test (wegen Regen abgebrochen) erhielt ich noch keine auswertbaren Messergebnisse.

Für Hinweise dazu bin sehr dankbar, vielleicht hat ja jemand schon Erfahrungen auf diesem Gebiet oder eine Andere Lösung.

Bisher hatte ich die Umdrehung mit einem Hallsensor direkt gemessen. Problem dabei ist, dass die Messung oben direkt am Generator auf dem Mast erfolgt (extra Zuleitung) :frowning:

Deshalb suche ich eine Lösung, die Umdrehung des Windrades anhand der erzeugten Wechselspannung zu messen.

Gruß Klaus

Aha, also die Library wird schon funktionieren. Das eigentliche Problem ist, daß Du einen geeigneten Tiefpassfilter vorne dran brauchst. Sonst wird jede Art von Störung (z.B. Schaltnetzteile als Verbraucher) Dir eine zu hohe Frequenz liefern.
Dagegen hilft entweder ein Tiefpaß in Hardware oder vergleichbares in Software. Oder gleich eine FFT. Je nachdem ob Du eher mit Hardware oder Software bewandert bist kannst Du das eine oder das andere tun. Oder beides :wink:
Die Library wird jedenfalls bei Deinem Fall eher unzuverlässig sein. Wie gesagt, das liegt nicht an der Lib sondern daran, daß Dein Signal nicht zwangsweise ein Sinus sein wird.

Udo

Hallo berlin1109
Da der Generator im Endeffekt ein Synchrongenerator mit Dauermagneterregung ist, ist die Amplitude der Spannung proportional zur Drehzahl. Du brauchst eigentlich nur die Spannung gleichzurichten (Brückengleichrichter genügt) und mit einem Kondensator zu glätten. ein Spannungsteiler bring Dir dann das Signal auf für den Ardunio verträgliche 5V Vollauschlag. Dann einfach mit Analogeingang messen. Wenn Du eine 5,1V Zenerdiode paralell zum Eingang schaltest schützt du diesen gegen überspannung wenn mal eine Sturmböe den Rotor ergreift.
Diese Meßmetode ist zwar nicht so genau, da eine Zeitmessung eine größere Auflösung hat, aber vieleicht genügt es Dir, da es weniger Aufwand ist. Das gesagte gilt für einen leerlaufenden Generator. Durch Verluste an den Leitungen und den Spulen des Generators kann ein Spannungabfall auftreten der die Messung verfälscht Auch die Dioden Der Gleichrichtung schlucken 1,4V. Durch Kenntnis der Stronstärke und der Widerstände kannst Du das rechnerisch kompensieren.

Aber Du mußt entscheiden wie genau Du messen willst.

Grüße Uwe

Ich würde sowas anders lösen. Erst der Tiefpass, dann Spannungsbegrenzer mit Z-Dioden und dann der Analogeingang. Die Gleichrichtung plus Glättkondensator macht das Messen schwieriger.

Und zwecks Berechnung am Besten gleich im Horowitz Hill nachschauen :slight_smile:

Dann auf den Arduino.

Einziges Problem: wie verhindert man negative Spannung am Analogeingang --> den 0-Leiter oder eine Phase nicht an Masse klemmen sondern an eine höhere Spannung, z.B. 2.5V. Kann man ebenfalls per Spannungsteiler (z.B. 2 4.7k Widerstände) erledigen.

Bauteileaufwand: 1 Widerstand + 1 Kondesator für den Filter, 2Z Dioden für die Begrenzung, 2 Widerstände für den Teiler für die 2.5V Referenz.

Udo

Nachtrag:
http://www.physics.emich.edu/molab/lock-in/lowpass.html

Hallo Udo
wie gesagt, es hängt von der Genauigkeit ab, die berlin1109 haben will.
Meine Lösung ist ungenauer aber einfacher, da nur eine Gleichspannung gemessen werden muß, ohne rechnerische Auswertung.
Deine ist genauer.
Lassen wir die Entscheidung berlin1109.
Grüeß Uwe

Hallo,
danke für die vielen Tipps. Die Variante der Spannungsmessung hatte ich auch schon mal angedacht, aber ich bin der vielleicht leihenhaften Ansicht verfallen, wenn ein definierter Phasenwechsel pro Umgrehung vorliegt müßte man das doch für die Umdrehungsmessung irgendwie nutzen können. Vielleicht überlege ich es mir ja noch mal und wähle doch die Spannungsmessungsvariante? :-/

Beim nochmaligen lesen der posts zur Frquency Counter lib habe ich noch einen anderen Ansatz gefunden der vielleicht eine weitere Möglichkeit bietet:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1231326297/30

Im post #36 ist ein Codebeispiel ohne die o.g. lib.
Hier wird über die Funktion pulsin() des Arduinos genutzt.
Werde mal ein bischen rumexperimentieren und Verschiedenes ausprobieren: Frequenzmessung mit Tiefpass und lib, Spannungsmessung und Pulsmessung und dann berichten.

Für weitere Ideen bin ich natürlich sehr dankbar. :slight_smile:

Gruß Klaus

Phasenwechsel ist schon ein guter Ansatz. Nur so 100% definiert ist der nicht immer . Es hängt viel davon ab wie steil Dein Signal ansteigt und wie "sauber" es ist.
Das heißt nicht, daß das schwierig ist. Es ist leicht damit umzugehen. Man muss halt nur drauf achten sonst wundert man sich hinterher.

Gruß, Udo

Hallo berlin1109

Achtung: pulseIn() ist eine Funktion, die wie delay() die Abarbeitung des Sketch anhält und solange stopt bis Du einen Messung gemacht wurde.
Das ist normalerweise kein Problem, aber es ist besser Du weißt davon.

Grüße Uwe

Als Quereinsteiger, der Programmierung und Elektronik nur als Hobby betreibt, habe ich durch viele Basteleien zwar schon einige Erfahrungen gesammelt, dass aber eher auf einem niedrigem Level. Deshalb bitte ich um Nachsicht, wenn ich mal etwas daneben liege und Probleme oft mit empirischen Ansätzen zu lösen versuche. :slight_smile:

@ Udo
Das mit dem "sauberen Signal" ist sicher ein Problem. Ein weiteres Problem sehe ich darin, dass das Signal in seiner Amplitude sehr stark schwankt (von ca, 1,5 V bis zu 25 V und mehr)

Ich denke dabei z.Zt. von einfacher Transistorschaltung über Optokoppler bis Operationsverstärker?

@ Uwe

Der von mir angedachte Sketch soll folgendes machen

  1. einfaches blinken von sechs LEDs, die je zu zweit an einem der drei Abspannseile für den Mast angebracht sind. Das ganze soll nicht die Flugzeuge warnen, sondern vielmehr am Boden dafür sorgen, dass ich nicht über die Spannseile stolpere - wer schon mal Zelten war wird mich verstehen ;D
  2. Umdrehungsmessung
  3. Weiterleitung der Daten per RF-Modul an einen Arduino mit Ethernetshield.
  4. Eventuell ausgeben der Daten auf einem Diplay

Das ganze müsste so zu machen sein, dass genügend Zeit für die einzelnen Funktionen zur Verfügung steht, da z.B. eine gemittelte Umdrehungsmessung aus zehn einzelnen Messungen nur alle 2 Sekunden durchaus ausreicht.

Das mit der Blockierung des Programmablaufs durch die pulsIn-Funktion ist mir schon klar, aber es gibt ja die Möglichkeit ein "Timeout" dabei festzulegen.
Habe das mal so überschlagen:

  • eine Umdrehung = 6 Phasenwechsel
  • Messbeginn ab 60 RPM = 1 U/sek
  • 1000 ms / 6 = 166,6... ms, also Aufgerundet 170 ms max. pro pulsIn-Messung
  • danach die unten genannte Blink-Funktion bedienen (without delay)
  • von z.B. zehn Messungen den Durchschnitt ermitteln und die Daten senden bzw. auf dem Display ausgeben

Nach meinen bisherigen Erfahrungen mit dem Arduino müsste das zeitlich machbar sein? :-/

Gruß Klaus

Hallo berlin1109

  1. es gibt LEDs mit eingebauten Blinkschaltung; einfach mit Vorwiderstand an Batterie oder Spannungsversorgung und schon blink es.
  2. Achtung wegen möglicher Notwendigkeit mehrerer Seriellere Schittstellen.

pulseIn-Funktion
Ich wolte nur daß es Dir bewußt ist. Ich glaube auch das es machbar ist. Auch wenn Du nicht alle 2 Sekungen die Drehzahl mißt wird das sicher Kein Problem sein.

Grüße Uwe

@ Uwe
Ja das mit dem Blinken ist Spielerei und ich habe das als Lauflicht schon fertig (immer im Kreis um den Mast herum). Es sollte dabei sicher kein Problem mit dem Timing auftreten, da das timing für die Blinkphasen sich ohne nennenswerte Verzögerung in Meszyklen per pulsIn einfügne lässt?

Habe bisher nur mit RF01/02-Modulen + virualWire.lib und HD44780-Displays Erfahrungen gesammelt und gehe davon aus, dass sich hier kein Konflikt mit seriellen Schnittstellen ergibt.

Gruß Klaus

Ich weiß ja nicht wie schnell so ein Generator drehen kann. Aber ich würde nicht erwarten, daß die Frequenz >1kHz ausfallen wird. Dann hätte der Arduino zwischen zwei 0 Durchgängen immer so etwa 8000 Takte Zeit. Das reicht locker um die Frequenz bei jeden Nulldurchgang neu auszurechnen.

Das mit den großen Schwankungen ist nicht so schlimm. zwischen 1 und 25V liegt ja nur ein Faktor von 25. Das kriegt man schon mit der einfachen Schaltung die ich vorgeschlagen habe in den Griff.

Gruß, Udo

@ Udo
weil ich eben ein empirischer Bastler bin, hatte ich mich bisher auch noch nicht mathematisch genau mit den auszulesenden Frequenzen befasst. Heute (noch vor Deinem post) habe ich das nochmal durchgerechnet und festgestellt, dass meine bisherigen "Kopfrechnungsüberschläge" weit daneben liegen.
Ausgehend von
60 U/min = 1 U/sek = 6 Phasenwechsel = 6 Hz
maximal kann ich mit gerundeten 720 U/min rechnen (mehr währe Sturm und da sollte sich das Windrad durch die Sturmsicherung wegdrehen)
Da komme ich auf läppische 62 Hz?
Damit dürfte es kaum noch Timingprobleme mit dem arduino geben. :slight_smile:

Noch eine Frage, bezieht sich der Hinweis auf die oben genannte Schaltung auf den Tiefpass?
Wenn ja bin ich wohl auf dem richtigen Weg, denn ich habe damit heute schon rumgespielt (+Transistorstufe) und eigentlich ganz gute Messergebnisse erhalten. Mir fehlen aber z.Zt. die passend dimensionierten Bauteile um genaue Ergebnisse zu erziehlen.

Gruß Klaus

Hallo berlin1109

Leider ist es genu umgekehrt; je kleiner die Frequenz desto länger blockiert PulseIn() dein Programmablauf.
Und dann kommen die Timeingprobleme.

Grüeß Uwe

Ich würde da mit "klassischer" und "moderner" Elektronik arbeiten. Ich
denke das es am einfachsten ist einen Schmittrigger mit dem Signal und der entsprechenden Schwelle ca 1,4V zu füttern (natürlich ein Tiefpass davor auf 80Hz) dann hast du schöne Ansteigende und fallende Flanken.
Dann kannst du mit attachInterrupt (http://arduino.cc/en/Reference/AttachInterrupt) auf die Fallende oder die steigende Flanke regieren und dann die Millis speichern 1/(millis2-millis2) und dann hast du die Frequenz. In der Loop machst du dann den rest.
Ja genau die interrupts unterbrechen auch das Zählen der millis aber mit der Flankenauswertung nur so lange die Flanke und der Code die Zeit braucht. Wenn man in den Funkionen nur die Zeit speichert ist (also so wenig Code wie möglich) der "Zeitverlust" vernachlässigbar.

Edit: fand ein paar Rechtschraibfehler

Genau wie Volvodani das beschreibt macht man das. Dann hat man auch überhaupt keine Probleme mit niedrigen Frequenzen.

Was die Schaltung angeht: wie gesagt ein einfacher RC Tiefpass und mit Zener Dioden die Spitze kappen. Ich würde R = 47k nehmen. Das kommt immer gut wenn einem nichts besseres einfällt :slight_smile: C kann dann ziemlich klein ausfallen ~33nF. Damit haben die Zener Dioden auch nur sehr wenig Strom zu verkraften um die Spitzen zu kappen.

Udo

Ich habe nochmal über die Schaltung nachgedacht. Da Du eh keine FFT vorhast muß die Kurve ja nicht sehr sauber ausfallen. Dann kannst Du wie folgt vorgehen:

G--------R------+-----+------------A
                |     |
                C     Z
                |     |
M---------------+-----+------------M

G = Generator
M = Masse von Generator bzw. Arduino
A = Eingang von Arduino
R = 47k
C = 33nF
Z = 5V Zenerdiode

Der RC Filter funktioniert als Tiefpass und die Z Diode schützt den Arduinoeingang vor Über und Unterspannung. In "Sperrrichtung" begrentzt sie den Eingang auf 5V und in "Durchlassrichtung" verhindert sie, daß der Eingang zu weit unter 0V gezogen wird. Wenn Du sehr mutig bist kannst Du die Diode auch weglassen weil der Controller auch Schutzdioden hat. Keine Ahnung wieviel die wirklich aushalten.

Die Interrupts löst Du dann sinnvollerweise bei steigenden Flanken aus. Anstelle des vorgeschlagenen Schmitttriggers ignorierst Du einfach alle Flanken in einer Totzeit von 5ms nach jeder detektierten Flanke. Damit bist Du zwar auf 200Hz begrenzt, aber dann fliegt Dein Windrad ja eh weg :slight_smile:

Udo