Dauerlauf eines DC-Motors - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Datenerfassung (DAQ) (/Forum-Datenerfassung-DAQ) +---- Thema: Dauerlauf eines DC-Motors (/Thread-Dauerlauf-eines-DC-Motors) |
RE: Dauerlauf eines DC-Motors - ck1984 - 09.07.2014 13:37 Hallo Kollegen, danke für die Tipps mit dem OP. NI hat mir zugesichert das mit meiner Hardware ich die Impulse nicht messen kann. Da Sie außerhalb des Bereichs liegen. Stattdessen haben Sie mir empfohlen die Flankenzählung softwaremäßig zu programmieren. Dies hab ich auch bereits gemacht. Hier das VI. Nun kann ich zwar die Impulse zählen aber es werden immer zu wenig Impulse gezählt. Wenn ich die Samplerate und Sampleanzahl verändere, zählt er praktisch zu viele Flanken. Mein Zähler funktioniert nach folgendem Prinzip. Immer wenn die Spannung über 4 ist, wird einmal hochgezählt. Ich möchte aber das nur einmal hochgezählt wird wenn eine Steigende Flanke erkannt wird. Mit dem Modul "Trigger und Gate" passiert ebenfalls das gleiche. Ich vermute da das Signal nicht optimal glatt ist und eine wenig Rauschen beinhaltet, erkennt er jede Abtastung über 4 und zählt falsch. Wie kann ich das Problem beheben? Das er nur die Zählung nur auf die steigende oder fallende Impulse reagiert??? bzw. was muss als Samplerate und Sampleanzahl einstellen wenn ich max. 150 Hz habe. Die Steilheit der Impulse ist fast perfekt. Besten Dank Leute. Gruss -ck- hat schon längst ausgedient RE: Dauerlauf eines DC-Motors - GerdW - 09.07.2014 13:46 Hallo ck, Zitat:Immer wenn die Spannung über 4 ist, wird einmal hochgezählt. Ich möchte aber das nur einmal hochgezählt wird wenn eine Steigende Flanke erkannt wird.Du möchtest nur auf steigende Flanken reagieren, programmierst aber eine Reaktion auf High-Level? Es gibt da ein VI namens PtByPt-BooleanCrossing, mit dem man Flanken erkennen kann… (Häng doch dein VI mal in LV2011 an.) RE: Dauerlauf eines DC-Motors - ck1984 - 10.07.2014 12:23 Hallo Gerd, danke erstmal für deinen Wertvollen Hinweis. Ist echt goldwert und zeigt deine Klasse. Ich das VI BooleanCrossing mal ausprobiert in einem Test Programm(siehe Anhang). Siehe da wunderbar; genau das was ich will. Immer wenn eine HI Flanke kommt wird eins hochgezählt, egal welchen Pegel das Signal hat. Für meine Software wo ein Signal Analog eingelesen wird, habe ich das aller gleiche Programmiert und seltsamer Weise gar keine Hi Flanke erkannt??? Hängt das vielleicht am Signal, das der Null Pegel nie erreicht wird? Auch wenn der Motor nicht dreht, liegt eine Spannung am Hallsensor. Diese Unterliegt auch starkem Rauschen. Habt ihr eine Idee? Ich hab mit Sicherheit einige Anfängerfehler in meiner Programmierung. Ihr könnt mich ruhig darauf aufmerksam machen, wie man das ganze besser programmieren kann Hochgeladen [attachment=50240] [attachment=50241] RE: Dauerlauf eines DC-Motors - GerdW - 10.07.2014 12:30 Hallo ck, Zitat:Für meine Software wo ein Signal Analog eingelesen wird, habe ich das aller gleiche Programmiert und seltsamer Weise gar keine Hi Flanke erkannt???Da sieht man mal wieder, das man eben nicht alles mit ExpressVIs erschlagen kann… Was soll denn bitte herauskommen, wenn du eine Waveform mit 1000 Samples in einen skalaren boolschen Wert umformen lässt? Wenn du Flanken entdecken willst, musst du schon alle Samples begutachten… Deine While-Loops bei den DO-Tasks sind auch hochgradig am DATAFLOW vorbei programmiert! Was soll der Stopp-Button außerhalb der Loops? THINK DATAFLOW! Auch immer wieder bei Anfängern beliebt: Das Label eines Controls wegzulöschen… Wieso hat dieser Stopp-Button kein Label? Würdest du in einer textbasierten Programmiersprache etwa so programmieren: Code: "" := "" + "" Labels kann man verstecken (auf dem FP), aber sollte man nie löschen! Und auf dem BD sollte man sowieso immer den Namen eines Controls sehen! RE: Dauerlauf eines DC-Motors - ck1984 - 10.07.2014 13:54 Hab dem Stopp Button wieder einen Namen gegeben. Ich möchte das sich die DO abwechselnd schalten. Dafür habe ich noch ein Paar Sachen die ich momentan nicht benötige eingefügt. Das große Problem ist noch das zählen. Heist dass das ich mit den Express VI die Flanken nicht zählen kann??? Das wäre eine Katastrophe da NI zugesichert hat, dass es geht! In welchen Wert muss ich den die Waveform umwandeln damit ich die Case- Struktur schalten kann? Ich hab den skalar Boolschen Wert nur gewählt, weil das VI "BooleanCrossing" nur diese konvertierung annimmt. Sorry ich weis, dass ich viel frage aber ich schaff das nicht alleine. Danke für Hilfe RE: Dauerlauf eines DC-Motors - GerdW - 10.07.2014 14:13 Hallo ck, für den Anfänger gibt es ja die ganzen Tutorials, auf die ich in meiner Signatur verlinkt habe… Und aktuell den "Summer of Webcasts" bei NI! Schau mal hier: [attachment=50245] Zitat:In welchen Wert muss ich den die Waveform umwandeln damit ich die Case- Struktur schalten kann?Wozu eine Case-Struktur zum Flankenzählen? Zitat:Ich hab den skalar Boolschen Wert nur gewählt, weil das VI "BooleanCrossing" nur diese konvertierung annimmt.Manchmal muss man sich schon überlegen, was man wirklich haben will… Zitat:Heist dass das ich mit den Express VI die Flanken nicht zählen kann??? Das wäre eine Katastrophe da NI zugesichert hat, dass es geht!Ja, es wird auch mit ExpressVIs gehen. Aber halt nicht so, wie du es programmiert hast… NI wird halt nicht müde, die großartigen ExpressVIs als Wunder-Allheil-Mittel anzupreisen - irgendwie muss man ja die Programmier-Anfänger (und die "Key-Account-Manager" dahinter) ködern. (Diese Aussage ist nicht gegen dich gerichtet, sondern gegen NI.) RE: Dauerlauf eines DC-Motors - ck1984 - 15.07.2014 08:44 Hallo Leute, Hallo Gerd, ich habs endlich geschafft einen optimalen Zähler für die Hallimpulse zu programmieren und zwar ohne einen Hardware Counter; rein Softwaretechnisch, der jeden Impuls zählt wenn man die passende Schaltschwelle einstellt. Ich möchte euch meine Lösung natürlich nicht vorenthalten. Da ich gesehen habe das viele einen Zähler Softwaretechnisch suchen. Erstmal herzlichen Dank an Gerd, ohne dich hätte ich das nicht geschafft. Allerdings habe ich den Zähler etwas anders realisiert. Da deine Version Gerd nicht hochgezählt hat sondern nur die Summe der abgetasteten Impulse pro Sekunde angezeigt hat. Aber egal jetzt gehts. Ich glaub ich hab schon ein bisschen was gelernt aber nur ein wenig So nächstes Problem: Ich würde gerne den Zähler verwenden um die Drehrichtung des Motors zu ändern. Also irgendwie die Buttons "Rechtslauf und Linkslauf" weglassen und automatisiert starten. Wenn eine 50 mal gezählt wird soll der Motor Links - dann Zähler Reseten - dann Motor Rechts - dann Zähler Reset usw. Das Ganze packe ich in eine For-Schleife und gebe ihm vor wie oft er diesen Prozess wiederholen soll. Fragen: 1. Wie kann ich den Zähler zum starten der Digitalen Ausgabe Module verwenden? 2. Wie kann ich den Zähler Reseten? [attachment=50262] Bin für jeden Tip dankbar, sonst häng ich da wieder Wochen alleine dran. Die Lösung werde ich natürlich präsentieren. hilft nicht immer RE: Dauerlauf eines DC-Motors - GerdW - 15.07.2014 09:12 Hallo ck, dein DAQAssi nimmt jeweils 10 Samples bei 1kS/S Samplerate auf. Von diesen 10 Samples wertest du immer nur das erste für deinen Pulszähler aus: mir wäre das zu unsicher, wenn ich wirklich alle Pulse sicher erkennen wollte… Zitat:Da deine Version Gerd nicht hochgezählt hat sondern nur die Summe der abgetasteten Impulse pro Sekunde angezeigt hatAuch die Pulse/s kann man ja leicht aufaddieren… 1. "IF Zähler>= 50 THEN Output DO" 2. "IF Zähler >= 50 THEN Zähler := 0" Ansonsten: - Du hast für die DOs jetzt schon mit den DAQmx-Funktionen gearbeitet. Warum dann nicht auch beim AI (statt des DAQAssi)? - Du gibst bei den DOs ungebremst Werte aus. Dies ist recht uneffektiv und sehr CPU-lastig. Warum nicht eine kleine Wartezeit in diesen Schleifen? RE: Dauerlauf eines DC-Motors - ck1984 - 15.07.2014 10:58 Hi Gerd, ich nehm jetzt die ersten 5 Werte zum zählen der Impulse, ist ein bisschen sicherer Deine Ratschläge sind top! Habe sie alle umgesetzt. Wartezeit 50 ms eingefügt. Und den DAQ Assi wollte ich sowieso durch die DAQmx Funktionen ersetzen. 1. "IF Zähler>= 50 THEN Output DO" 2. "IF Zähler >= 50 THEN Zähler := 0" Der C-Code ist mir klar aber wie kann ich das in Labview umsetzen? Kann ich einfach eine abfrage an den Zähler setzen, wenn dieser 50 überschreitet, soll es einen DO0 Ausgang setzen? Aber wie kann ich dann danach den DO1 setzen? In einer Sequenz und um diese Sequenz eine FOR-Schleife? Wenn ich eine For-Schleife um die DAQmx-Lesen setze, ensteht ein Daten Fehler. "Ein 1D-Array wird in ein Skalar gewandelt". Wie kann ich das lösen? -Beste Grüße- RE: Dauerlauf eines DC-Motors - GerdW - 15.07.2014 11:49 Hallo ck, so langsam könntest du auch über eine State-Machine und das Producer-Consumer-Schema nachdenken… Du hast eine Datenquelle (AI), die du nachfolgend analysierst und auswertest. Mit dem Ergebnis der Auswertung wählst du einen aktuellen Systemstatus (links/rechts drehen, etc.). Die passenden Steuerwerte (DOs) gibst du dann an einen Consumer (die DAQmx-Schleifen) weiter… Zitat:Der C-Code ist mir klarIF-THEN-ELSE ist in LabVIEW eine Case-Struktur… |