LabVIEWForum.de - Drehzahlmessung mit Hall-Sensor auf Arduino

LabVIEWForum.de

Normale Version: Drehzahlmessung mit Hall-Sensor auf Arduino
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Moin Leute,
ich bin neu hier und arbeite erst seit ein paar Wochen mit Labview. Daher ist meine Frage mit Sicherheit sehr trivial, aber ich komme nicht weiter.

Folgendes:
Ich möchte die Drehzahl einer Welle mittels eines Hallsensors messen. Dafür klebt auf der Welle ein Magnet, der dann am Hallsensor vorbeikommt. Der Sensor schaltet dann einfach nur true, wenn der Magnet gerade da ist und false, wenn nicht.
Ich verwende LabView 2019 und eine Arduino Uno über das Linx Tool. Auf der Arduino habe ich den Hallsensor über den Digitalpin angeschlossen. Nun war meine Idee zur Drehzahlmessung, dass ich über den Block "verstrichene Zeit" die Zeit stoppe und jedes Mal, wenn der Sensor True schaltet, also eine Umdrehung rum ist, die Zeit gestoppt, gespeichert und in die Drehzahl umgerechnet im GUI angezeigt wird. Anschließend wird die Zeit neu gestartet. Beim der nächsten Umdrehung wird wieder die neue Zeit gestoppt, der alte gespeicherte Wert überschrieben und wieder im GUI als Drehzahl ausgegeben.

Das zentrale Problem ist hier das Speichern des Wertes.
Wie kann ich die gestoppte Zeit als Konstante speichern und beim nächsten Mal überschreiben?
Ich habe schon diverse Dinge mit Arrays, Rückkoppelungen und Schieberegistern probiert, aber da ich keine For Schleife n Mal durchlaufen will, war das alles nicht zielführend.
Oder ist die Idee mit dem Tool "verstrichende Zeit" grundsätzlich falsch und gibt es eine ganz andere Lösung?
Im Anhang ist mein Entwurf, der aber nicht so funktioniert wie gewollt.

Aber vermutlich ist das Problem einfach meine mangende Labview Erfahrung, daher bin ich für jede Hilfe und Tipps dankbar!

Danke schon mal an alle!!!!!

Liebe Grüße

Nomier
Hallo Nomier,
herzlich willkommen im Forum!

Zitat:Das zentrale Problem ist hier das Speichern des Wertes.
Wie kann ich die gestoppte Zeit als Konstante speichern und beim nächsten Mal überschreiben?
Ich habe schon diverse Dinge mit Arrays, Rückkoppelungen und Schieberegistern probiert, aber da ich keine For Schleife n Mal durchlaufen will, war das alles nicht zielführend.
Wenn du einen Wert für die nächste(n) Iterationen speichern/bereitstellen willst, solltest du ein Schieberegister verwenden!

Eine "Konstante" kann man nicht speichern/ändern/überschreiben: dann wäre es ja keine Konstante mehr! Big Grin
Du willst wahrscheinlich so etwas wie eine "Variable" haben: in LabVIEW ist der Draht die Variable - oder das Schieberegister!

Zitat:Oder ist die Idee mit dem Tool "verstrichende Zeit" grundsätzlich falsch und gibt es eine ganz andere Lösung?
Falsch ist die Idee nicht. Es geht aber auch einfacher: man merkt sich den Timestamp des letzten Hall-Pulses in einem Schieberegister. Beim nächsten Puls dann einfach aktueller Timestamp minus den gespeicherten rechnen. (Letztendlich macht ElapsedTime genau das gleiche…)

Zitat:Im Anhang ist mein Entwurf, der aber nicht so funktioniert wie gewollt.
Da ist nur ein Bild. Bilder kann man mit LabVIEW weder debuggen noch editieren.
Beim nächsten mal bitte echten Code anhängen!
Hallo GerdW,
danke für die schnelle Antwort.

Das mit der Konstante ist mir auch gerade aufgefallen, aber du weißt ja, was ich meine.

Ok, also Schiebregister in eine For Schleife. Ich habe auch die Funktionsweise von den Schieberegistern noch nicht so ganz verstanden. Ich will ja keine diskrete Anzahl an Schleifendurchläufen haben.
Und wie sage ich dem Schieberegister, dass es den Wert speichern soll?

Im Anhang ist jetzt die richtige Datei.

Danke nochmal und viele Grüße

Nomier
Hallo Nomier,

Zitat:Ok, also Schiebregister in eine For Schleife.
Wozu die FOR-Schleife?
Du hast doch schon eine While-Loop…

Zitat:Ich will ja keine diskrete Anzahl an Schleifendurchläufen haben.
Dafür verwendest du doch schon eine While-Loop…

Zitat:Ich habe auch die Funktionsweise von den Schieberegistern noch nicht so ganz verstanden.
Ein Schieberegister "schiebt" den Wert, den man ins rechte Terminal schreibt, in die nächste Iteration der Loop und gibt ihn am linken Terminal wieder aus.
Ganz einfach…

Zitat:Und wie sage ich dem Schieberegister, dass es den Wert speichern soll?
Indem du ihn ins rechte Terminal schreibst. Wie gerade beschrieben…

So in etwa:
[attachment=61414]
Hallo GerdW,
ich probiere das am Montag mal aus. Wie gesagt, ich bin ein ziemlicher Laie in Labview. Danke für deine Geduld
So, ich habe deinen Vorschlag ausprobiert, GerdW und es funktioniert schon ganz gut. Ich kenne nur zwei deiner Blöcke nicht. Zum einen den orangen DBL Block oben rechts zwischen dem Select und dem Schieberegister. ist das dein Anzeigeelement im Frontpanel? Da habe ich keine mit Ein- und Ausgang. Ich glaube, dass er deswegen bei mir den Wert nicht speichert, weil ich mein Anzeigelement anders eingebaut habe.

Der andere ist der true/false Block in der Mitte mit der roten und grünen Lampe. Ist das auch einfach nur eine LED im Frontpanel, oder ist die wichtig?


Danke und viele Grüße


Nomier
Hier ist mein VI, hatte ich eben vergessen.
Hallo,

rechts oben ist ein ganz normales Anzeigeelement.
Das andere nennt sich Point-by-Point-BooleanCrossing, damit kann man boolsche Statewechsel detektieren.
Aber wie hast du das in Reihe geschaltet? Oder sieht das nur so aus?
Hallo Nomier,

Zitat:Aber wie hast du das in Reihe geschaltet? Oder sieht das nur so aus?
Das sieht nur so aus.
Das ist ein Draht, der von einer Funktion zu einem Indicator und einem Schieberegister führt…
Hallo GerdW,
ich habe deinen Vorschlag ausprobiert und es funktioniert aber noch nicht. Der Wert wird im Minusblock von einander abgezogen, aber in der Anzeige nicht gespeichert. Diese zählt dann immer runter, weil die Zeitdifferenz ja steigt.
Wie kann ich erreichen, dass der Wert im Anzeigeblock für eine Umdrehung konstant bleibt?

Danke und viele Grüße

Nomier
Seiten: 1 2
Referenz-URLs