LabVIEWForum.de - Arduino Periode messen

LabVIEWForum.de

Normale Version: Arduino Periode messen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Liebe community,

ich habe die Aufgabe ein Messsystem neu aufzubauen. Es geht konkret um die Berechnung des Massenträgheitsmoments eines nicht symmetrischen Körpers.
Ein luftgelagerter Aufspanntisch wird in Schwingung versetzt. Eine Lichtschranke gibt einen Spannungsimpuls wenn eine Markierung am Tisch diese durchläuft.
Dieser Spannungsimpuls ist t1. Beim erneuten durchlaufen haben wir t2. Die Zeit dazwischen ist entscheidend.

Ich habe mich für ein günstiges Messsystem entschieden. Für diese Aufgabe verwende ich ein Arduino Nano.
Über LabView die Zeiten zu erfassen und zu berechnen dürfte eigentlich keine Schwierigkeit sein.
Meine Frage ist eigentlich ob es nicht genauer wäre die Zeit auf dem Board selber zu messen?
Wenn ich ein Programm über die Arduino IDE schreibe wird das doch auch auf dem Board gemacht.
Wie unterscheiden sich diese Methoden?
Oder bin ich hier total auf dem Holzweg?



Danke schon mal im Voraus! Big Grin
Hallo Fuchs,

Zitat:Die Zeit dazwischen ist entscheidend.
Wie sind denn deine Anforderungen bzgl. Auflösung und Genauigkeit?

Zitat:Ich habe mich für ein günstiges Messsystem entschieden. Für diese Aufgabe verwende ich ein Arduino Nano.
Über LabView die Zeiten zu erfassen und zu berechnen dürfte eigentlich keine Schwierigkeit sein.
Meine Frage ist eigentlich ob es nicht genauer wäre die Zeit auf dem Board selber zu messen?
Wenn ich ein Programm über die Arduino IDE schreibe wird das doch auch auf dem Board gemacht.
Wie unterscheiden sich diese Methoden?
Den Arduino zum Erfassen der Spannunsgpulse zu verwenden, ist erstmal ok…

Jetzt geht es aber um die Frage, wo der Zeitpunkt (bzw. genauer der zeitliche Abstand zwischen 2 Pulsen) erfasst wird:
- Wenn "LabVIEW" das machen soll, muss der Arduino deinem PC erstmal die Signale melden. Das geschieht üblicherweise über einen (virtuellen) seriellen Port - und der sorgt für Verzögerungen! Und noch schlimmer: du weißt nicht, welcher Jitter auf diesem Kommunikationkanal wirkt, was sich wiederum auf die Genauigkeit deiner Messung auswirkt…
- Wenn dein Arduino die Zeitdifferenz ermittelt, dann liegt die Genauigkeit im Bereich deiner Schleifeniterationszeit im Arduino. Diese wiederum ist an die maximale Samplerate des ADCs im Arduino gekoppelt: einfach mal das Datasheet lesen…

Eine Alternative wäre noch eine einfache USB-Box wie die USB-6001 von NI. Hier kannst du einen Analogkanal mit 20kHz samplen, kommst also auf eine zeitliche Auflösung von 50µs…
Zitat:Das geschieht üblicherweise über einen (virtuellen) seriellen Port - und der sorgt für Verzögerungen! Und noch schlimmer: du weißt nicht, welcher Jitter auf diesem Kommunikationkanal wirkt, was sich wiederum auf die Genauigkeit deiner Messung auswirkt…
Die benötigte Genauigkeit liegt im Millisekundenbereich.
Wichtig ist die Wiederholbarkeit. Wenn ich 50 Messungen mache und die Streuung zu groß dann ist das blöd! Ich dachte mir schon, dass die Messung am PC nicht so genau ist. Die Frage ist wie ungenau sie ist. Liegt die auch im µs Bereich würde ich das so machen.

Zitat:Wenn "LabVIEW" das machen soll, muss der Arduino deinem PC erstmal die Signale melden.
Die Kommunikation mit dem Nano läuft...


Zitat:- Wenn dein Arduino die Zeitdifferenz ermittelt, dann liegt die im Arduino.
Da fehlt mir im Moment noch ein wenig das Verständnis. Ich schreibe ein Programm auf der Oberfläche von LabView. Wie kann ich nun die Zeit zwischen zwei Signalen auf dem Board messen und mir dann wieder auf dem PC anzeigen lassen?Blink


Zitat:Eine Alternative wäre noch eine einfache USB-Box wie die USB-6001 von NI. Hier kannst du einen Analogkanal mit 20kHz samplen, kommst also auf eine zeitliche Auflösung von 50µs…
Hatte ich erst im Sinn. Es soll aber auch so Smart wie möglich sein. Für die Spannungsversorgung von Magnetventilen (24V) wird letztendlich eine kleine Kunststoffbox verwendet. Da soll auch der Arduino rein. Mit dem USB-6001 hätten wir dann zwei Kästen und mehr Kabelsalat.
Hallo Fuchs,

Zitat:Die benötigte Genauigkeit liegt im Millisekundenbereich.
Du willst also mit >=1kHz samplen…

Zitat:Wichtig ist die Wiederholbarkeit. Wenn ich 50 Messungen mache und die Streuung zu groß dann ist das blöd! Ich dachte mir schon, dass die Messung am PC nicht so genau ist. Die Frage ist wie ungenau sie ist. Liegt die auch im µs Bereich würde ich das so machen.
Beim (virtuellen) COM-Port (VCP) wirkt auf PC-Seite der ganze Treiberstack (USB-LowLevel, USB-Seriell, VISA) und drumherum Windows mit seinem Multitasking: das könnten µs sein, wenn der Virenscanner oder WinUpdate loslegt aber auch mehrere Sekunden…

Zitat:Da fehlt mir im Moment noch ein wenig das Verständnis. Ich schreibe ein Programm auf der Oberfläche von LabView. Wie kann ich nun die Zeit zwischen zwei Signalen auf dem Board messen und mir dann wieder auf dem PC anzeigen lassen?
Das Problem lautet: "Wann startete (oder endete) der erste Puls und wann der darauffolgende Puls?"
Du musst also dir den ersten Zeitpunkt merken und schauen, wann der nächste Puls/Zeitpunkt eintritt. Dann die Differenz bilden!

Wenn du jetzt mit konstanter Samplerate arbeitest, vereinfacht sich das Problem zu: bei welchem Sample trat der erste Puls auf und wieviele Samples später der zweite? Dann einfach "Differenz der Samplenummer / Samplerate" berechnen…

Das kannst du sowohl auf LabVIEW/PC-Seite machen oder im Arduino. Der Arduino hat den Vorteil, dass er als µC "quasi realtime" arbeitet und auch einfach zählen kann. Auf PC-Seite musst du erstmal die ganzen Messdaten vom Arduino (per VCP) übertragen und auswerten - was eben mit Overhead und Jitter behaftet ist. Deshalb würde ich für diese klar umrissene Aufgabe die Lösung direkt auf dem Arduino bevorzugen…

Zitat:Für die Spannungsversorgung von Magnetventilen (24V) wird letztendlich eine kleine Kunststoffbox verwendet. Da soll auch der Arduino rein. Mit dem USB-6001 hätten wir dann zwei Kästen und mehr Kabelsalat.
In eine geringfügig größere Kunststoffbox passt auch die USB-6001 hinein…
OK!
Soweit so gut.
Ich werde die Messung auf dem Board durchführen.
Mir fehlt aber immer noch das Verständnis wie ich das anstelle.
Wenn ich über die LabView Oberfläche schreibe und lese sind genau die Dinge dazwischen die zu einer großen Ungenauigkeit führen.
Wie könnte ein Programm aussehen wo mir nur die Zeit dazwischen anzeigt? Blink

Da habe ich keinen Ansatz.


Zitat:Wenn du jetzt mit konstanter Samplerate arbeitest, vereinfacht sich das Problem zu: bei welchem Sample trat der erste Puls auf und wieviele Samples später der zweite? Dann einfach "Differenz der Samplenummer / Samplerate" berechnen…
Oder liegt die Antwort hier drin und ich verstehe es nicht
(20.09.2023 15:33 )Fuchs schrieb: [ -> ]Ich werde die Messung auf dem Board durchführen.
Mir fehlt aber immer noch das Verständnis wie ich das anstelle.
DAs ist eine sehr gute Idee.
Du solltest dich auf der Arduinoseite mit dem Thema Interrupt und micros befassen.

Zitat:Wenn ich über die LabView Oberfläche schreibe und lese sind genau die Dinge dazwischen die zu einer großen Ungenauigkeit führen.
Wie könnte ein Programm aussehen wo mir nur die Zeit dazwischen anzeigt? Blink
Da habe ich keinen Ansatz.

Ein knapper Ansatz hierfür wäre folgender:

LV: sendet Messungssart an den Nano
Nano: warten auf Interrupt Lichtschranke1
if interupt Lichtschranke1 micros = 0
warten auf Interrupt Lichtschranke 2
if interrupt Lichtschrnake 2
micros = differenzzeit
Serial send differenzeit an LV
LV: Darstellen, speichern, Plotten...

Hope it helps, Ralf aka RMR
Hallo Ralf,

für mein Verständnis ist das nicht möglich. Ich kommuniziere entweder über LV mit dem Arduino oder über die Arduino IDE.

ODER?
Servus Fuchs,

ich bin jetzt nicht in dem Thema drin, aber wenn auf dem Board keine Software läuft, die dir die Informationen gibt, die du brauchst, musst du das irgendwie erstellen. Das Board muss ja auch wissen was du willst und wie es die Informationen bekommt. Ich weiß jetzt aber nicht ob es da fertiges gibt oder das mit den richtigen Befehlen abgefragt werden kann.
Klingt jetzt zumindest nicht so, so wie ich das hier lese, also musst du das selbst machen, auf dem Arduino Nano selbst!

MfG Timo
Danke für eure Antworten!

Wenn ich ein Programm auf der Oberfläche der Arduino IDE schreibe und mir die ms zwischen zwei Signalen berechnen lasse, wie bekomme ich den Wert der ms auf die Oberfläche von LV?
Hallo Fuchs,

Zitat:wie bekomme ich den Wert der ms auf die Oberfläche von LV?
Ganz einfach ausgedrückt:
Code:
im Arduino:
serial.println("dt=" + ms)

in LabVIEW:
VISARead
Referenz-URLs