Ich hab ein kleines Projekt vor, bei dem ich eine Frequenz (Sinusspannung) irgendwo zwischen 50 & 60 KHz messen müsste... Das ganze möglichst präzise (= 2 Stellen nach dem Komma).
Die Spannung ist aktuell noch unbekannt..
Ist das mit nem ESP überhaupt möglich? Mir fehlt da jedweder Ansatz..
Hallo,
Hardware
erst mal musst Du an der Hardware was machen damit du die Spannung nicht höher als zulässig hast. Dann sollte sie auch nicht negativ sein. Im einfachsen Fall nimmst Du eine Diode und bekommst damit immer nur die positive Halbwelle. An einem bestimmten Punkt erkennt der ESP dann halt ein H Pegel.
Software mach eine Preiodendauer-Messung mit micros() Du misst damit dann die Zeitdauer zwischen zwei H Flanken. Den Eingang liest Du mit einem Interrupt ein. In der ISR bildest Du nur die Zeitdifferenz sonst machst Du da nichts. Damit wird die ISR schnellstmöglich beendet.
Eine Torzeitmessung, Impulse eine bestimmte Zeit lang messen, kann bei 50Hz keine zwei Nachkommastellen liefern dazu müsstest Du ja letztlich 100s lang messen. Dann wäre dein Messwert 5000.
Sorry ich hab mich verlesen ich hatte 50-60 Hz gelesen. Aber es sollen ja 50-60 KHz sein.
also 20 KHz geht, es kommt ein bisschen darauf an was der ESP sonst noch so zu tun hat.
Was die Spannungshöhe angeht so denke ich wäre es ganz gut einen kleinen Trenntrafo mit "Untersetzung" vor die Geschichte zu schalten.. Verhältnis muss natürlich entsprechend berechnet werden..
Mit einer Diode (nur positive Halbwelle) würde sich die Frequenz des gemessenen Ergebnisses ja schonmal halbieren. Ich dachte gerade daran hinter die Diode noch nen Schmitt Trigger zu schalten.
Dann hab ich noch eine schöne Funktion in der Arduino Referenz gefunden die sich pulsIn() nennt...
allerdings gibt diese Funktion leider nur einen unsigned long wert zurück... Ein float wäre da geiler...
Beispiel (mit beiden Halbwellen, gleichgerichtet):
ich nehm mal ne Frequenz von 55,6 KHz an, da wäre die Periodendauer gerade mal 17,98561 Microsekunden
erhöht sich die Frequenz nur unwesentlich auf 56 KHz ergibt das ne Periodenlänge von 17,85714 Microsekunden...
Der unsigned long würde mir da wohl jeweils ne 18 in der ausgabe raus schmeißen.. Was leider nicht präzise genug ist... Nach dem Zurückrechnen kämen bei beiden dann nämlich 55,55 KHz raus.
Oder interpretiere ich das jetzt falsch?
LG
wenn es so richtig präzise Hardcore präzise sein soll, dann nimm den passenden Timer eines ESP, konfiguriere ihn auf Frequency Measurement und lies am Ende nur noch die Werte aus die ständig aktuell sind. Da müßtest du dich durchbeißen.
bei einer Vollwellengleichrichtung würdest Du die Frequenz verdoppeln, da ja dann auch die eigentlich negative Halbwelle eine positive Flanke erzeugen würde. Bei einer Frequenz gilt aber die Summe einer positiven und negativen Halbwelle als Periodedauer. Also z.B von einem positiven Nulldurchgang bis zum nächsten.Damit reicht es nur die positiven zu messen und die negativen abzuschneiden.
Eine Periodendauermessung macht man eigentlich bei kleinen Frequenzen um auch da eine genügend hohe Auflösung zu bekommen. Klein meint in der Regel so was bis 500 Hz. je nach gewünschter Auflösung. Bei höheren Frequenzen macht man besser eine Tormessung und misst die Anzahl der Impulse in einer vorgegeben Zeit. Meist nimmt man da eine Sekunde. Damit laufen dann bei Dir 50000 Impulse in einer Sekunde auf. Damit hättest Du dann eine Auflösung von 1Hz. Du willst aber ja 0.01Hz damit müsstest Du 100s lang messen. Macht also auch keinen Sinn.
Du kommst also eigentlich nur mit einer Periodendauermessung hin , musst aber deine Referenz Zeitbasis viel kleiner als 1us haben. Vermutlich was im 10ns Bereich dann sprechen wir aber von 100MHz. Ein ESP8266 kann mit maximal 160Mz laufen. Damit müsste man mit dem Systemtakt direkt arbeiten und einen Timer direkt nutzen . Aber davon hab ich nun überhaupt keine Ahnung. @Doc_Arduino hat ja einen Vorschlag gemacht der darauf hinaus laufen würde.
Zudem sollte man dann auch einen möglichst genauen Quarz einsetzen.
habe mich mal an den Datenblättern des ESP8266 versucht. Dessen Timer scheinen keine Frequenzmessung/Pulscounter zu haben. Wäre unerwartet seltsam. Beim ESP32 gibt paar Capture Modes. Dazu muss noch das Eventsystem konfiguriert werden. Das wird haarig und ich habe keinen ESP32. Für jemanden der sowas noch nie gemacht hat wird das ehrlich gesagt anstrengend. Aber machbar muss sein.
Gab es nicht schon einmal einen Thread wo das schon einmal Thema war? Irgendwas war da wenn ich mich dunkle erinnere. Glaube mit @agmue u.a.. Ob das letztlich lief weiß ich nicht.
Ansonsten könnte man das einmal testen. ESP32 FreqCounter
Wenn das funktioniert und ausreicht wäre ja gut.
Hallo,
so wie ich das sehe werden da Impulse in einer bestimmten Zeit gezählt
A frequency counter library for esp32. It counts the numbers of pulses on a specified pin during a fixed time frame using native interrupts and timers. It only supports one instance per sketch for now.
Hatte nur erstmal nen runden Geburtstag in der Familie...
Ich muss mir Jetzt erstmal all eure Antworten in ruhe zu Gemüte führen...
Dann schauen wir mal weiter...
Außerdem fehlt ja noch die höhe der Amplitude... (Sprich: Spannung)
Bisher ist das ja nur ein "proof of concept"..
Hat von euch vielleicht jemand einen Ozzi griffbereit?
Wie würde die Sinunsspannung (entsprechend auf den benötigten Spannungspegel reduziert) hinter einem Schmitt Trigger aussehen?
Die Idee ist gerade folgende:
Davon ausgehend das ich jetzt keinen Kurzschluss im Kopp habe, könnte man ja wie oben erwähnt die Sinusspannung durch nen Schnitt Trigger schieben und anschließend mit einem Frequenz-/ Inpuls-teiler die Frequenz soweit reduzieren, das der ESP diese präzise messen kann..
Das Ergebnis dann einfach mit der vorherigen Teilung multiplizieren & ausgeben...
Rechtecksignal. Wenn Du nicht genau die Nulldurchgänge triffst, ist die HIGH- und LOW-Zeit nicht ganz gleich. Macht aber nichts, wenn Du von einer zur nächsten gleichen Flanke mißt.
Oszibild
So ungefähr wird das aussehen.
Die Rechteckflanken sind dabei nicht weg, die sind nur so steil und das Oszi so langsam das man die nicht sieht. Stell dir einfach vor das ein Rechtecksignal nur zwischen Ub und Masse wechselt. "Löcher" gibt es keine.
Noch ein Bild von mir eines astabilen Multivibrators.