Forum: Mikrocontroller und Digitale Elektronik Wie Frequenzen bis 2000Hz mit PC messen?


von Markus S. (euroretter)


Lesenswert?

Hallo Forum,

ich bitte um Eure Hilfe bei folgender Problemstellung:
Es sollen Frequenzen gemessen werden, gleichzeitig an drei Wellen.
Frequenzbereich je Welle bis ca. 2000 Hz, das Mess-Signal des 
Geschwindigkeits-Sensors ist sinusförmig, Bereich 0..5V oder 5V ... 10V

Diese Frequenzinfo benötige ich in eimen PC-Programm (vorzugsweise 
Visual C++)

Per Software möchte ich entweder die Analogwerte der am Eingang 
anliegenden Sinusspannung erkennen (denke, dazu reichen 16 oder 12 bit 
Auflösung) oder ich forme das Sinussignal zuvor per Hardware in ein 
Rechtecksignal um (mittels Komparator, Schmitt-Trigger, ...)

Sinn ist letztlich, per Software unmittelbar die garade am Eingang 
anliegende Frequenz bzw. Periodendauer zu erkennen/ermitteln.

Das ganze soll mit einem Notebook laufen, das HW-Interface wird also 
höchstwahrscheinlichein USB-Interface haben.

Das Problem dabei scheint zu sein, dass die von mir bisher gefundenen 
USB-Interfaces nur bis max. 1000 mal je Sekunde ihre gemessenen Werte 
per USB an den Rechner weitergeben können. Sie sind zwar problemlos in 
der Lage, höhere Frequenzen als 2000Hz zu erfassen, aber können nicht 
jede Schwingung  1:1 via USB an den PC geben.

Ich möchte aber zu jedem Zeitpunkt der anliegenden max. 2000Hz 
möglichtst schnell die Periodendauer oder Frequenz der soeben 
anliegenden Schwingung ermitteln.

Dazu benötige ich wohl eine Art schnellen Zähler oder Timer. Ist sowas 
in C++ softwaretechnisch genau und verlässlich zu realisieren oder macht 
hier ein HW-Zähler mehr Sinn? Wie lese ich den dann ein?

Ich hoffe ich habe mich halbweg klar ausgedrückt ...

Eine Menge Fragen jedenfalls, ich danke Euch für jeden Tipp, Hinweis und 
Vorschläge zur Umsetztung.
Auch Infos zu Firmen, die geeignete Interfaces anbieten, sind 
willkommen.

MfG
euroretter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus S. schrieb:
> Das Problem dabei scheint zu sein, dass die von mir bisher gefundenen
> USB-Interfaces nur bis max. 1000 mal je Sekunde ihre gemessenen Werte
> per USB an den Rechner weitergeben können. Sie sind zwar problemlos in
> der Lage, höhere Frequenzen als 2000Hz zu erfassen, aber können nicht
> jede Schwingung  1:1 via USB an den PC geben.
Ist ja nicht so schlimm: wenn der USB-Wandler z.B. mit 20kHz abtastet, 
und dir jede ms 20 Messwerte schickt, dann kannst du die problemlos 
wieder zusammensetzen. So wird das bei USB-Oszilloskopen und 
Logicanalytern auch gemacht...

von USB (Gast)


Lesenswert?

Also mit USB High Speed und Interrupt Transfer geht das ohne weiteres. 
Da ist ein Update alle 125µs möglich. Daher könntest du den Zähler auf 
einem modernen ARM implementieren, also Tiva C 129 Series oder 
STM32F4xx. Die USB Enumeration ist nicht so hart, wie sie zu sein 
scheint, man muss nur viel lesen. Hässlich könnte allerdings dann die 
PC-seitige Software werden, da ein eigener USB Treiber nötig wäre.

von Ulrich H. (lurchi)


Lesenswert?

Der einfache Weg wäre es das Signal mit der Soundkarte oder ähnlichem 
Aufzunehmen und dann digital auszuwerten. Je nach Signalqualität sollte 
man zu erst digital filtern und kann dann eine Sinusfunktion an die 
Daten anpassen. Je nach Vorwissen wäre der erste Schätzwert ggf. per FFT 
zu bekommen, oder halt aus der letzten Messung.
Die Auflösung bzw. das Rauschen in der Frequenz hängt von der Länge des 
Datensatzes ab (nimmt etwa mit Länge hoch 3/2 ab). Wenn das Signal wenig 
Störungen enthält reicht schon eine relativ kurze Messzeit (so im 
Bereich 0.01 s) für eine gute Auflösung - sonst braucht es halt etwa 
länger.

Als Referenz dient der Takt der Soundkarte - wenn man hohe Anforderungen 
(besser als etwa 0.01%-0.001%) hat, muss man da ggf. aussuchen und ggf. 
im Wechsel ein externes Referenzsignal messen.

von ohnePlan (Gast)


Lesenswert?

Markus S. schrieb:
> Diese Frequenzinfo benötige ich in eimen PC-Programm (vorzugsweise
> Visual C++)

Dient das nur zum Anzeigen, oder willst du damit noch irgendwas 
zeitkritisches machen?

von ?!? (Gast)


Lesenswert?

Ulrich H. schrieb:
> Der einfache Weg wäre es das Signal mit der Soundkarte oder
> ähnlichem
> Aufzunehmen und dann digital auszuwerten. Je nach Signalqualität sollte
> man zu erst digital filtern und kann dann eine Sinusfunktion an die
> Daten anpassen. Je nach Vorwissen wäre der erste Schätzwert ggf. per FFT
> zu bekommen, oder halt aus der letzten Messung.
> Die Auflösung bzw. das Rauschen in der Frequenz hängt von der Länge des
> Datensatzes ab (nimmt etwa mit Länge hoch 3/2 ab). Wenn das Signal wenig
> Störungen enthält reicht schon eine relativ kurze Messzeit (so im
> Bereich 0.01 s) für eine gute Auflösung - sonst braucht es halt etwa
> länger.
>
> Als Referenz dient der Takt der Soundkarte - wenn man hohe Anforderungen
> (besser als etwa 0.01%-0.001%) hat, muss man da ggf. aussuchen und ggf.
> im Wechsel ein externes Referenzsignal messen.

Das Problem sehe ich allerdings dort, daß die Soundkarte nur 2 Kanäle 
hat, links und rechts. Und außerdem könnte es bei niedrigen Frequenzen 
schwierig werden, da die Soundkarten nicht bis Null Hertz erfassen 
können (C-Kopplung).

Für 3 Messkanäle (Sinus) wäre vielleicht ein USB-A/D-Wandler mit 
mehreren Kanälen geeignet. Da gibts meist auch eine 
Software-Schnittstelle, um die für eigene Anwendungen abzufragen.

von m.n. (Gast)


Lesenswert?

Da würde ich einen Arduino Uno nehmen, der über T1-Capture schnell die 
Periodendauer messen kann und per auf dem Board vorhandenen 
RS232->USB-Wandler den Wert ausgibt.

Eine weitere Möglichkeit wäre, das mit einem STM32F4-Discovery-Board zu 
erledigen; T8 mit seinen 4xCapture-Eingängen an PC6 - PC9 ist frei 
verfügbar.

Aktuell baue ich mit dem STM32F407 einen 4-Kanal Frequenzzähler, der 
neben der Ausgabe per RS232 (optional USB) die Werte auch noch auf einem 
LCD anzeigt.

Dies sind nur ein paar Möglichkeiten.

von Wolfgang (Gast)


Lesenswert?

Natürlich wird es auch mit einem PC hinzukriegen sein.

Einfacher wäre es sicherlich, für die Frequenzmessung einen kleinen µC 
abzustellen, der die ausgewertete Frequenz als Zahl per USB an den PC 
weiterreicht.

von Karl H. (kbuchegg)


Lesenswert?

Markus S. schrieb:

> Das Problem dabei scheint zu sein, dass die von mir bisher gefundenen
> USB-Interfaces nur bis max. 1000 mal je Sekunde ihre gemessenen Werte
> per USB an den Rechner weitergeben können. Sie sind zwar problemlos in
> der Lage, höhere Frequenzen als 2000Hz zu erfassen, aber können nicht
> jede Schwingung  1:1 via USB an den PC geben.

Wenn es nur um das Feststellen der Frequenz geht, sollte man auch mal 
ins Auge fassen, dass die externe Hardware die Frequenz ausmisst und nur 
noch diesen Zahlenwert fix&fertig an den PC weiter gibt.

Denn wenn sich Windows ein Päuschen gönnt, weil der Virenchecker wieder 
mal drann ist, oder die Festplatte aufgeräumt werden muss, ist es dann 
recht schnell auch mal Essig mit dem ermitteln der Frequenz aus den 
Messwerten.

Für einen externen µC hingegen, auf dem dieses Programm und nur dieses 
Programm ganz alleine läuft, ist das Ausmessen von einer paar 
Analogsignalen im Bereich bis 2kHz ein Kinderspiel.

Edit: 2 Köpfe (Wolfgang + moi), 1 Gedanke

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Karl Heinz schrieb:
> Edit: 2 Köpfe (Wolfgang + moi), 1 Gedanke

Dafür war deiner viel liebevoller ausgemalt ;-)

von Markus S. (euroretter)


Lesenswert?

ohnePlan schrieb:
>> Diese Frequenzinfo benötige ich in eimen PC-Programm (vorzugsweise
>> Visual C++)
>
> Dient das nur zum Anzeigen, oder willst du damit noch irgendwas
> zeitkritisches machen?

Die gemessenen Periodendauern werden für weitere Berechnungen im 
Programm verwendet. Wichtig ist, dass jede anliegende Schwingung 
gemessen wird, bei der Messung keine Schwingung 'verloren' geht oder 
über mehrere Schwingungen gemittelt wird.

von Markus S. (euroretter)


Lesenswert?

m.n. schrieb:
> Da würde ich einen Arduino Uno nehmen, der über T1-Capture schnell die
> Periodendauer messen kann und per auf dem Board vorhandenen
> RS232->USB-Wandler den Wert ausgibt.
>
> Eine weitere Möglichkeit wäre, das mit einem STM32F4-Discovery-Board zu
> erledigen; T8 mit seinen 4xCapture-Eingängen an PC6 - PC9 ist frei
> verfügbar.
>
> Aktuell baue ich mit dem STM32F407 einen 4-Kanal Frequenzzähler, der
> neben der Ausgabe per RS232 (optional USB) die Werte auch noch auf einem
> LCD anzeigt.

Das hört sich gut an. Der  Arduino Uno ist ja sehr weit verbreitet. Wie 
'schwer' ist die Lernkurve, wenn Kenntnisse in C Programmierung 
vorhanden sind?

Kann denn der Arduino Uno via USB 2000 mal in der Sekunde Werte zum PC 
schicken oder ist dann er bzw. der PC dann voll ausgelastet? Alternativ 
könnte ich doch  auch z.B. 1 Sekunde lang Messwerte mit dem  Arduino Uno 
erfassen, in einem Array speichern und denn in einem 'Rutsch' via USB 
zum PC übertragen.

Unklar ist mir noch, wie ich USB Werte einlese auf PC Seite, gib es 
dafür fertige Klassen/Funktionen/ in bzw. für Visual C++ 2013 ?

euroretter

von Tom (Gast)


Lesenswert?

?!? schrieb:
> Das Problem sehe ich allerdings dort, daß die Soundkarte nur 2 Kanäle
> hat, links und rechts.

Das Problem ist keins, auch 24 Kanäle mit 192kHz/24bit sind nur eine 
Kostenfrage.
http://www.thomann.de/de/search.html?KF=on&gk=coaius&oa=pra&bn=&pr=&wgfid1=7574&wgf7574=4&wgfid2=7575&wgf7575=&wgfid3=7572&wgf7572=&wgfid4=2091&wgf2091=&wgfid5=7573&wgf7573=&wgfid6=7576&wgf7576=&wgfid7=7577&wgf7577=&wgfid8=7578&wgf7578=&wgfid9=7413&wgf7413=&wgfid10=2096&wgf2096=&wgfid11=2099&wgf2099=&wgfid12=7581&wgf7581=&wgfid13=7580&wgf7580=&wgfid14=2100&wgf2100=&wgfid15=2101&wgf2101=&kf=on

Ob man daraus mit Software das gewünschte Ergebnis erzielt, ist eine 
reine Frage der Programmierkünste... Latenz hat man am PC immer, die 
Frage ist, was
> möglichtst schnell
bedeutet.

von m.n. (Gast)


Lesenswert?

Markus S. schrieb:
> Die gemessenen Periodendauern werden für weitere Berechnungen im
> Programm verwendet. Wichtig ist, dass jede anliegende Schwingung
> gemessen wird, bei der Messung keine Schwingung 'verloren' geht oder
> über mehrere Schwingungen gemittelt wird.

Damit scheidet Arduino Uno aus. Dieser würde sich eignen, mit einer 
einfachen Hardware Stichproben der Perioden zu erfassen und zu 
übertragen. Für die Erfassung jeder einzelnen Periode ist er meiner 
Meinung nach zu schnell an seinen Grenzen.
Cäsars 'parte et divide' zu Folge könnte man die Erfassung auf drei AVRs 
aufteilen; pro Kanal ein ATTiny2313/4213, der per T1-capture jede 
Periode erfaßt und per TxD ausgibt. Die Zusammenführung der Kanäle würde 
dann über eine entsprechende Anzahl von RS232->USB-Adaptern erfolgen.
Für max. 200 Messungen/s habe ich eine fertige € 3,--/Kanal Lösung, 
wobei die Messrate durch die 'float'-Ausgabe begrenzt wird. 
http://www.mino-elektronik.de/fmeter/neue_versionen.htm

Bleibt aus meiner Sicht der STM32F407. Die Erfassung ist für ihn 
keinerlei Problem; auch hat er genug RAM, um über mehrere Sekunden 
Periode für Periode aufzuzeichen. Auch eine Datenübertragung per USB 
wird hinreichend schnell sein.
Eigene USB-Routinen habe ich keine. Am besten sucht man sich ein 
Projekt, das die USB-Verbindung sauber gelöst hat und ergänzt die 
Periodendauermessungen.

Ein anderer Weg wäre, die Vorverarbeitung im STM32 vorzunehmen; 
anschließend überläßt man dem PC die aufbereiteten Daten. Dafür würde 
wieder eine RS232-Verbindung reichen.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Eine Frage wurde hier m.E. noch nicht deutlich gestellt und beantwortet: 
Muss die Messung längere Zeit und live erfolgen oder genügt auch das 
Samplen über einen gewissen Zeitraum und dann eine Auswertung "in aller 
Ruhe"? Das würde den Spielraum hinsichtlich geeigneter Lösungen deutlich 
erweitern.

Und dann wundert mich hier noch 'was Allgemeines: Wieso wird hier immer 
noch und immer wieder auf dem alten Zopf RS232 herumgeritten? Zur 
Verbindung zu einem modernen Computer/Laptop ist ja wohl USB das 
Mindeste. Viele meiner Projekte mache ich gar mit Netzwerk (Arduino Nano 
+ Netzwerkadapter = 20 Euro), wenngleich USB den Vorteil der einfachen 
Spannungsversorgung bietet (solange diese bezüglich der Stromstärke 
ausreicht) ...

von m.n. (Gast)


Lesenswert?

Frank Esselbach schrieb:
> Und dann wundert mich hier noch 'was Allgemeines: Wieso wird hier immer
> noch und immer wieder auf dem alten Zopf RS232 herumgeritten? Zur
> Verbindung zu einem modernen Computer/Laptop ist ja wohl USB das
> Mindeste.

Warum gehen Leute immer noch zu Fuß zum Bäcker, obwohl man doch mit 
einem Geländewagen die schnelle Abkürzung über Nachbars Felder nehmen 
könnte?

Hast Du für den STM32F4 stabile USB-Treiber, die an allen Rechnern unter 
allen Betriebssystemen funktionieren? Die verwende ich dann sofort.
Oder ist zu befürchten, dass sich ein Kunde von sonstwo auf der Erde 
meldet, um mitzuteilen, dass sein Rechner nach 1-2 Stunden abstürzt, 
nachdem er Dein USB-Gerät angestöpselt hat?

USARTs (RS232 ist ja nur ein allgemein verwendeter Oberbegriff) sind 
dagegen ein Kinderspiel mit garantierbarer Funktion. Die Problematik der 
Kompatibilität kann man dann auf den RS232->USB-Adapter verlagern, für 
deren Funktion sicherlich viele Programmierer mit speziellem know how 
sorgen.

Warum soll ich für eine einfache Datenübertragung eine Technik 
verwenden, die komplette Filme in Echtzeit wiedergeben kann?

Man kann sich natürlich verschiedene Quellcodes zusammenkopieren und 
sich freuen, wenn es läuft. Wenn nicht, dann sieht man vor lauter Bäumen 
den Wald nicht mehr.
Für eine kommerzielle Lösung wird man sich sicherlich passende Treiber 
kaufen, wenn man zügig zum Ziel kommen muß, oder entsprechende 
Arbeitszeit einplanen müssen. Ich habe weder Zeit noch Geld ;-)

m.n. schrieb:
> Am besten sucht man sich ein
> Projekt, das die USB-Verbindung sauber gelöst hat und ergänzt die
> Periodendauermessungen.

Das hatte ich ja vorgeschlagen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.