Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Ich beschäftige mich gerade damit, wie ich mithilfe einer Labview-Karte eine PWM erzeugen kann, die wiederrum eine Leistungsstufe steuern soll. Es ist für mich ein Einstiegsprojekt, ich habe bisher meist nur kleine Datenerfassungsaufgaben mit Labview gelöst. Jetzt geht es jedoch nur zweitrangig um die Signalerfassung und hauptsächlich um die Erzeugung von hochfrequenten TTL Signalen.
Erstmal mein Vorhaben:
Ich möchte einen VI programmieren, das es mir ermöglicht, eine PWM aus 5V TTL Impulsen zu erzeugen. Die Impulsbreite ist pro Programmausführung konstant und die Impulsbreite soll über einen Drehregler in LabVIEW einstellbar sein. Wichtiges Kriterium ist die hohe Frequenz der PWM: Sie soll bis 20 kHz gehen, ein Duty Cycle soll also nur 50 us dauern und das kleinste erzeugbare Rechteck soll 1 us einen High-Pegel annehmen.
Zur Verfügung habe ich die schnelle PCIe Karte NI-PCIe 6351, deren interne Timer für diese Aufgabe schnell genug sein sollten.
Das Programm hat also keine allzugroße Komplexität, man stellt das Tastverhältnis ein und die PWM Frequenz und durch einen digitalen Trigger von aussen wird das Programm gestartet. Ein Durchlauf soll auf ein paar Sekunden begrenzt sein.
Ich habe in den Core 1 und 2 Kursen von NI, die ich als Student günstig bekommen habe, leider wenig mit Tasks und internen Countern gemacht und bisher versucht das NI Example anzupassen: siehe Anhang.
Leider habe ich keine Idee, wie ich an solche hohen Frequenzen herankomme. Ich muss ja auch die Verzögerung in der Schleife deaktivieren, da ein Raster von 1 ms zu groß ist.
Habt ihr eine Idee, wie ich an der Sache weitermachen kann?
Prinzipiell sieht das gut aus, Erzeugung des PWM über Counter.
Solange der User per Drehknopf/Schieberegler o.ä. die Eingaben zum Duty-Cycle per Hand macht, halte ich eine Reaktions- und Updaterate von 100 Hz ebenfalls für sehr gut.
Die 20 kHz Grundfrequenz erledigt der Counter für dich, ebenfalls das Verhältnis von High zu Low.
Ich kann somit deine Bedenken nicht ganz nachvollziehen.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Ich habe momentan die Karte nur simuliert und werde das Ganze jetzt bald mit einem Oszi mal testen. Ich will mit dem Programm dann später parallel auch noch bis zu 3 analoge Inputs (Ströme, transformiert auf den Messbereich von 0-10V) abtasten und kontinuierlich darstellen. Ist mein Programm bei einer PWM Frequenz von 20 kHz dann sehr leistungsfordernd, oder wird eine Abtastung mit ca. 10kS pro Kanal problemlos machbar sein?
Gerade baue ich an einem Programm herum, das ein Forenmitglied hier gebaut hat, hauptsächlich um den Umgang mit den Counter Signalen und den Tasks zu verstehen. Wie es aussieht kann ich so auch 3 Phasen mit verschiedenen Duty-Cycles betreiben.
Auf jeden Fall komme ich voran. Für Tipps / Links usw zu der Aufgabenstellung bin ich sehr dankbar, da mir die Erfahrung mit DAQmx fehlt
Im Anhang mal das VI, das ich mir anschaue und evtl erstmal an meine Bedürfnisse anpasse/verstehe.
30.08.2013, 12:29 (Dieser Beitrag wurde zuletzt bearbeitet: 30.08.2013 12:34 von GerdW.)
solange du möglichst viel Arbeit an den DAQmx-Treiber delegierst, wird dein Programm (im Rahmen der Möglichkeiten der Hardware) gut arbeiten. Also:
- AI-Kanäle mit Samplerate definieren und Messdaten mit sinnvoller Blockgröße abfragen (üblich sind 0,1s-Blöcke).
- AI-Kanälen kann man eine Skalierung zuweisen, so kannst du deine 0-10V gleich wieder in Stromwerte umrechnen lassen.
- Die PWM-Generierung läuft auch im Treiber oder direkt in der Hardware, belastet also kaum die CPU.
- Das Producer-Consumer-Schema vereinfacht fast immer den (Rechenzeit-)effizienten Umgang mit den Messdaten.
Ok, dann ist jetzt erstmal alles klar und ich kann mich an die Realisierung machen. Ich habe gerade die ganzen DAQmx Tuts auf der NI Seite gelesen und komme immer mehr hinter die Thematik. Ich werde jetzt mal mit einer Niederfrequenten PWM beginnen, diese über Counter der Karte generieren und dann mit Oszi oder einer LED testen.
Das Ganze soll später einen Umrichter auf 3 Phasen ansteuern, doch erstmal muss das TTL Signal sauber stehen. Der Tipp, die Karte selber möglichst viel machen zu lassen und der CPU wenig Arbeit zu machen ist auf jeden Fall super...
Hi Leute, also so langsam wirds mit der 3 Phasen-PWM. Ich hänge gleich mal ein Screenshot von meinem aktuellen Hauptprogramm an. Ich habe mich an einem anderen Thread und an dem offiziellen PWM Beispiel orientiert. Das Ausgangsbeispiel war 2 Phasig, ich habe dann einfach die lokale Variable und das VI, das das gemeinsame binäre Array erzeugt so erweitert, dass es nun eben auch noch einen Duty Cycle 3 gibt. Irgendwo muss ich aber auch noch der Taskerstellung der DAQmx Blöcke sagen, dass ich jetzt plötzlich 3 Duty Cycles habe.... wo finde ich das?
Ich hab dann auch noch die Generation der PWM angepasst: der Duty Cycle soll nicht mit dem High-Intervall anfangen, sondern mit einem Low- Intervall, dann die Einschaltzeit des High-Intervalls und dann nochmal der Rest der Aus-Phase in einem genauso großen Low-Intervall wie zu beginn, sodass die Duty Cycles immer zeitlich mittig sind. Ich zeige euch mal auch hier das VI. Vielleicht habt ihr noch Verbesserungsvorschläge, was Recheneffizienz angeht. Iche kenne mich nicht so aus, welche Array Operationen weniger und welche mehr Ressourcen brauchen.
Hier jetzt auch noch das Sub VI, das über Compound Arrithmetic eine multiples Duty Cycle Array bekommt... mit 2 Duty Cycle Arrays funktioniert das wunderbar, ich habe jetzt einfach das 3te Array hinzugefügt und dann eben den Shift auf 2 gesetzt. WObei mir noch nicht 100% ig klar ist, warum man das so löst und vor allem warum ein Ausgangsarray entsteht, das 1000 Werte hat, obwohl die 3 einzlenen Duty Cycle Arrays je 1000 bits besitzen.
Ich bereite mal eine ZIP vor und werde das komplette Programm hochladen.
05.09.2013, 16:07 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2013 16:09 von GerdW.)
Zitat:über Compound Arrithmetic eine multiples Duty Cycle Array bekommt... mit 2 Duty Cycle Arrays funktioniert das wunderbar, ich habe jetzt einfach das 3te Array hinzugefügt und dann eben den Shift auf 2 gesetzt. WObei mir noch nicht 100% ig klar ist, warum man das so löst und vor allem warum ein Ausgangsarray entsteht, das 1000 Werte hat, obwohl die 3 einzlenen Duty Cycle Arrays je 1000 bits besitzen
Du verwendest ein OR-Funktion bei der CompoundArithmetic: Hier werden Bits verknüpft. Deine Shift-operationen sorgen dafür, dass die Bits für jeden Kanal sich nicht "überlagern": der erste Kanal nutzt Bit0, der zweite Bit1 und der dritte nun Bit2...
Wenn du 3mal 1000 Werte per OR verrechnest, bekommst du als Ergebnis 1000 Werte. (Analog: wenn du 3mal 1000 Werte addierst, bekommst du ja auch 1000 Summen...)
Hey, danke für den hilfreichen Beitrag, jetzt habe ich das NI Beispiel so weit verändert, dass ich eine 3 Phasige PWM ausgebe und auch die Impulsform soweit stimmt. Das ist schonmal echt super.
Gerade hänge ich an einem wahrscheinlich einfacheren Problem fest. Wenn ich ich das Programm zur Erzeugung des Ausgangssignals nach zufälliger zeit über den Stop Button stoppe ( dieser befindet sich in der Event Struktur), dann ist es manchmal so, dass die DOs auf High und manchmal auf Low schalten. Kann ich irgendwie einstellen, dassbei jedem Durchlauf die gleiche Reaktion erzeugt wird?
Wie würdet ihr es machen, wenn das ganze programm aus den Screenshots als Sub VI betrieben werden soll, bei dem die einzelnen Tastverhältnisse der 3 Phasen automatisch verstellt werden sollen und bei dem auch die kontinuierliche PWM Generation irgendwann per STOp Button im neuen VI angehalten werden soll. ich habe einfach den STOP-Button als Input des VIs definiert und will mit einem neuen VI in der Lage sein, die PWM Generation zu stoppen... irgendwie scheitert das Vorhaben jedoch immer wieder.
(06.09.2013 12:19 )paddsen schrieb: Gerade hänge ich an einem wahrscheinlich einfacheren Problem fest. Wenn ich ich das Programm zur Erzeugung des Ausgangssignals nach zufälliger zeit über den Stop Button stoppe ( dieser befindet sich in der Event Struktur), dann ist es manchmal so, dass die DOs auf High und manchmal auf Low schalten. Kann ich irgendwie einstellen, dassbei jedem Durchlauf die gleiche Reaktion erzeugt wird?
Einfach selber programmatisch nach der While-Loop alle DOs auf Low setzen?!
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!