LabVIEWForum.de - Drehzahlmessung im FPGA über IO

LabVIEWForum.de

Normale Version: Drehzahlmessung im FPGA über IO
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Leute,

ich möchte mit dem FGPA eine Drehzahl messen, welche ich über Digitale I/O 's bekomme (TTL). Wie kann ich das machen? Das eine Beispiel was ich gefunden habe funktioniert nicht, weil das aussieht als wäre es auf dem RT programmiert, wie ist es sonst möglich, das ein IO Modul in einer Zeitgescheuerten Schleife ist. Und dort ist auch ein CPU-Kern anzugeben, das geht nicht im FPGA.

Hat jemand ein VI oder kann mir erklären, wie ich vorgehen muss, dass ich von mehreren IO's jeweils einzeln dann, die Drehzahl des Motors raus bekomme??

Später muss es für ingesammt 6 einfachen und 6 weiteren Motoren mit Signal A und B funktionieren (Gleichzeitig) und 6 weitere Flankenzälungen.

Vielen dank schonmal im Vorraus.
Hallo R.,

Zitat:Das eine Beispiel was ich gefunden habe funktioniert nicht, weil das aussieht als wäre es auf dem RT programmiert, wie ist es sonst möglich, das ein IO Modul in einer Zeitgescheuerten Schleife ist. Und dort ist auch ein CPU-Kern anzugeben, das geht nicht im FPGA.
Hast du das VI einfach mal auf deinem FPGA ausprobiert? Der IO-Zugriff ist doch ein FPGA-IO-Node…

Du kannst das Problem wie im gezeigten Snippet lösen: die Zeitdifferenz zwischen zwei Pulsen/Flanken bestimmen.
Ich mache das meist einfacher und zähle einfach die Anzahl der Schleifendurchläufe zwischen zwei steigenden Flanken. Im RT-Host wird diese Angabe dann skaliert (mit Anzahl Flanken pro Umdrehung und der vorgegebenen Zeit pro Iteration)…

Zitat:Später muss es für ingesammt 6 einfachen und 6 weiteren Motoren mit Signal A und B funktionieren (Gleichzeitig) und 6 weitere Flankenzälungen.
Du brauchst also ein (notfalls reentrantes) subVI für einfache Pulsgeber und ein weiteres für AB-Geber. Wie oft du die dann später benutzt, wird nur durch die FPGA-Größe eingeschränkt…
Ich habe das Beispiel in LV nicht gefunden. Habe es selber macl versucht zu programmieren, aber da kam immer die Meldung das das einlesen des IO's zu viele ticks benötigt.

Gibt da schon VI's für diese Zählungen? Ich verstehe nämlich gerade nicht, wie du das meistn, mit dem:

'Ich mache das meist einfacher und zähle einfach die Anzahl der Schleifendurchläufe zwischen zwei steigenden Flanken. Im RT-Host wird diese Angabe dann skaliert (mit Anzahl Flanken pro Umdrehung und der vorgegebenen Zeit pro Iteration)…'
Hallo R.,

Zitat:da kam immer die Meldung das das einlesen des IO's zu viele ticks benötigt.
Nicht jedes DIO-Modul ist schnell genug für den Einsatz in einer SCTL!
Ich benutze meist die 9403, die erlaubt z.B. max. 140kHz und ich nutze meist (einfache While-)Schleifen mit 100kHz (oder 10µs Wartezeit, rechnet sich einfacher)!

Zitat:Ich verstehe nämlich gerade nicht, wie du das meistn,
vereinfachter Pseudocode:
Code:
count := 0
WHILE
  IF steigende Flanke(DIO) THEN
    output := count
    count := 0
  ELSE
    count++
  ENDIF
WEND
Lässt du diesen Code im RT oder auf dem FPGA laufen?

Ich möchte ja die Digitalen IO' im FPGA aufnehmen. Und dann am liebsten über ein FIFO mir nur die aktuelle Drehzahl im RT anziegen lassen. Diese Soll immer 0 sein, wenn sich der Motor nicht bewegt und n wenn er sich bewegt.
Hallo R.,

der Code läuft im FPGA!

Nur die Auswertung mit "0 wenn der Motor steht" erfordert etwas Sonderbehandlung: normalerweise würdest du ja "unendlich" auf den nächsten Puls warten…
Hallo Gerd,


(02.06.2016 16:33 )GerdW schrieb: [ -> ]Nur die Auswertung mit "0 wenn der Motor steht" erfordert etwas Sonderbehandlung: normalerweise würdest du ja "unendlich" auf den nächsten Puls warten…

Genau das ist das Problem an dem Ich gerade hänge. Auch das der FiFo leer ist, wenn ich nicht verfahre, oder die Impulse zu lage auseinander sind. Ich bekomme also nicht dauerhaft die richtige Drehzahl. Bahn


Ich habe es mitlerweile soweit, dass ich in meinem FIFO die aktuelle Drehzahl (Schleifendurchläufe bis Impuls) bekomme, aber mit sehr großen Zeitdifferenzen. Heißt, ich lasse mein Antreib drehen und erst 5sek später bekomme ich in einem RT-Progamm im Fifo einen Wert, der ungleich 0 ist.

Gibt es denn irgendwie eine andere Möglichkeit die Drehzahl im FPGA zu ermitten über Impulse? Das Problem ist doch bestimmt schon öfters bearbeitet wurde, da werde ich doch nicht der erste sein?

Mfg
Hallo R.,


Zitat:Gibt es denn irgendwie eine andere Möglichkeit die Drehzahl im FPGA zu ermitten über Impulse? Das Problem ist doch bestimmt schon öfters bearbeitet wurde, da werde ich doch nicht der erste sein?
Nein, du bist nicht der erste.
Das Problem ist: wenn dein Motor steht, kommen keine Encoderpulse. Ohne Impulse aber keine neue Drehzahlberechnung. Das hast du ja selbst erkannt:
Zitat:Genau das ist das Problem an dem Ich gerade hänge. Auch das der FiFo leer ist, wenn ich nicht verfahre, oder die Impulse zu lage auseinander sind. Ich bekomme also nicht dauerhaft die richtige Drehzahl.

Lösung in Pseudocode, als Ergänzung zum obigen Code-Vorschlag:
Code:
IF count >= max_count THEN
  output := max_count+1
  count := 0
ENDIF
Wenn der Zähler ein Maximum erreicht, geht die Routine von einem stehenden Motor aus. Dann gibt man eben einen Wert in den FIFO, der dem RT-Host eben diesen stehenden Motor signalisiert…

Eine Drehzahlbestimmung über Pulse hat immer zwei Messbereichsgrenzen:
- die maximale Drehzahl wird durch Anwendung von Nyquist auf deine Samplerate bestimmt
- die minimale Drehzahl wird (in meiner Methode) durch den Maximalwert des Counters bestimmt - und ist eben dadurch größer als Null…

Zu deinem Bild:
Was machst du da eigentlich in diesem VI? Warum wird der DIO-Pin an zwei Stellen abgefragt? Wo kommt die lokale Variable "Timeout" her?
Einfach mal Ctrl-U benutzen und gelegentlich Kommentare im BD verteilen würde hier sehr helfen…
Richtig,

Ich habe mein oberen Beitrag gerade verändert, da ich schon ein Schritt weiter gekommen bin.
(03.06.2016 11:10 )GerdW schrieb: [ -> ]Zu deinem Bild:
Was machst du da eigentlich in diesem VI? Warum wird der DIO-Pin an zwei Stellen abgefragt? Wo kommt die lokale Variable "Timeout" her?
Einfach mal Ctrl-U benutzen und gelegentlich Kommentare im BD verteilen würde hier sehr helfen…

Also Ich habe es mir so gedacht, dass ich Eben immer ein Flankenwechsel abfrage, wenn 5000 Schleifendurchläufe keine Flanke kam, geht er in Timeout. Und wartet dort solange, bis wieder ein Impul kommt, das ist dann der erste impuls der neuen Bewegung, und ab da wird wieder gemessen.
Hallo R.,

Zitat:Heißt, ich lasse mein Antreib drehen und erst 5sek später bekomme ich in einem RT-Progamm im Fifo einen Wert, der ungleich 0 ist.
Dann hast du wohl einen Fehler bei der Verwaltung des FIFOs gemacht, wenn du Werte erst verzögert aus dem FIFO liest!
Entweder schaust du selbst nach - oder hängst mal VIs hier an…
Referenz-URLs