LabVIEWForum.de - Servomotor regeln

LabVIEWForum.de

Normale Version: Servomotor regeln
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich muss für eine Arbeit an der Uni die Regelung eines Servomotors programmieren. Ich hab aber die Ansteuerung von Geräten noch nie gemacht über Labview und wäre dankbar, wenn jemand von euch über meinen Programmentwurf schaun könnte, ob das so funktionieren könnte!

Folgende Problemstellung:
Ich erfasse über eine Lichtschranke (Diode) die Geschwindigkeit meines Motors. Diese gibts mir ein digitales Signal zurück (High wenn belichtet). Ich würde dann gerne kontinuierlich die Pulsdauer von den Highs erfassen und daraus dann mittels eines PID - Reglers den neuen Stellwert für den Motor errechnen. Der Motor soll dann über PWM angesteuert werden.

Als Messkarte steht mir eine NI PCI 6025 E zur Verfügung.

Wie gesagt, ich hab in der Hinsicht in Labview noch keine Erfahrung und die Hardware steht mir noch nicht zur Verfügung um sie zu testen. Ich würde gerne mein Programm schon im Groben fertig haben, damit die Anpassung für das Programm nachher nicht mehr so lang dauert wenn die Hardware dann da ist.
Lv80_img[attachment=30901]
Auf den ersten Blick würde ich sagen, das könnte so klappen.

Aber natürlich habe ich ein paar Ideen zur Verbesserung:
Wieso misst Du die Pulsweite? Wäre es nicht besser die Frequenz oder die Periodendauer zu messen? Ich vermute, dass damit bessere Ergebnisse herauskämen, insbes. falls der Motor unruhig läuft. Wenn Du nur die High-Zeiten betrachtest, berücksichtigst Du ja nur die Hälfte des Signals.

Ich würde hier keine zwei parallelen Schleifen verwenden, sondern eine. In dieser wird dann pro Durchlauf ein kompletter Regelzyklus durchgeführt (also Input - Berechnung - Output). Dann kannst Du Dir die lokalen Variablen sparen, was deutlich saubereren LV-Code ergibt.

Falls Du unbedingt die zwei Schleifen beibehalten willst, dann pack wenigstens ein Timing in die Schreib-Schleife. In der aktuellen Form lastet die einen CPU-Kern zu 100% aus. Ich glaube nicht dass Du das möchtest.

Was ich noch garnicht verstehe ist, was Du mit den ineinander verschachtelten Schleifen erreichen willst.
In der aktuellen Fassung gibt es hier zwei "Modi":
Motor = TRUE: Die Tasks werden initialisiert und es wird dauerhaft immer wieder gelesen und geschrieben.
Motor = FALSE: Die Tasks werden initialisiert, es wird je einmal gelesen und geschrieben, dann werden die Tasks sofort wieder gelöscht, um anschließend sofort wieder initialisiert zu werden.
Vermutlich ist auch das nicht ganz das gewünschte Verhalten.
Evtl. fehlt Dir nur noch eine Case-Struktur, die auf "Motor" reagiert zu Deinem Glück?
Referenz-URLs