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!
08.08.2007, 10:17 (Dieser Beitrag wurde zuletzt bearbeitet: 08.08.2007 10:22 von draluz02.)
Will ein PWM-Signal an einem digitalen ausgang (5V TTL) am NI9403 Modul mit dem cRIO-9012 realisieren. Will dazu über ein host-VI die frequenz in Hz und die PWM in % vorgeben, anschließend die periodendauer über die frequenz ausrechnen & die zeit in der der ausgang log. high ist über die % und die zuvor ermittelte periodendauer ausrechnen & diese dann an das FPGA VI übergeben und mittels timer (loop timer) den ausgang dementsprechend schalten.
das ganze sollte dann wie folgt ablaufen:
1.) TimerPeriode & TimerHigh starten; DO0 = high
2.) TimerHigh läuft ab; DO0 wird low gesetzt
3.) TimerPeriode läuft ab; DO0 wird high gesetzt & beide Timer starten wieder von vorne
Mein problem bei der sache ist jetzt, dass ich nicht weiß wie ich den ausgang alternieren soll, weil ich so eine dementsprechende fkt. noch nicht gefunden habe!
oder habt ihr vl eine bessere idee wie ich diese aufgabenstellung realisieren soll? womöglich ohne timer?
@Lurx: dieses PWM-Generation VI ist ja nur für das NI9505 Modul, oder? war für mein bescheidenes LV-Wissen etwas zu hoch. wie hast du es konkret verwendet?
@i2dx: danke für den tipp! hab das jetzt auch schon umgesetzt nur funktioniert es bei mir trotzdem noch nicht! Tges wird vom host vorgegeben (zwischen 200 und 1000); getimed wird die while schleife im FPGA mit 10µs! vielleicht hast du zeit dir das VI im anhang kurz durchzudenken... wär dir wirklich dankbar!
' schrieb:@i2dx: danke für den tipp! hab das jetzt auch schon umgesetzt nur funktioniert es bei mir trotzdem noch nicht! Tges wird vom host vorgegeben (zwischen 200 und 1000); getimed wird die while schleife im FPGA mit 10µs! vielleicht hast du zeit dir das VI im anhang kurz durchzudenken... wär dir wirklich dankbar!
mfG, lukas
dann schließ mal die Drähte richtig an, dann funktioniert der Teiler auch richtig:)So wie du das verkabelt hast wird der bei jedem Schleifendurchlauf zurückgesetzt bzw. das Signal getoggelt.
andererseits, so richtig als PWM taugt das eh nicht, ich hab dir mal was angehängt, dass auf dem FPGA auf jeden fall als PWM laufen sollte. Wie man nun das Timing umrechnet musst du selber rausfinden
habs jetzt derweil einmal i2dx's version probiert. funktioniert prima! stell im host VI die relevanten parameter ein, rechne diese um und übergib sie alle 10ms an das FPGA VI wo im 10µs takt hinaufgezählt wird. habs am oszi kontolliert und funktioniert echt super.
einziges manko vl: wenn ich 100% bei der PWM einstell, hab ich trotzdem 10µs low pegel am DO dazwischen! macht jetzt bei dieser anwendung zwar nur einen max. Fehler von 0,5%, aber in zukunft hatte ich vor ein 180kHz signal pulsweitenmoduliert am DO auszugeben und da ist die kleinste periodendauer nur mehr 5.56µs... !!!
hab auch schon probiert die zeit des timers im FPGA VI runter zu stellen, aber es funktioniert bis max. 7µs, dann stimmt die freuquenz nicht mehr überein, weil ja der FPGA länger zum abarbeiten braucht als der timer braucht!
welche lösung wäre daher für die 180kHz am geeignetsten?
' schrieb:einziges manko vl: wenn ich 100% bei der PWM einstell, hab ich trotzdem 10µs low pegel am DO dazwischen! macht jetzt bei dieser anwendung zwar nur einen max. Fehler von 0,5%, aber in zukunft hatte ich vor ein 180kHz signal pulsweitenmoduliert am DO auszugeben und da ist die kleinste periodendauer nur mehr 5.56µs... !!!
hab auch schon probiert die zeit des timers im FPGA VI runter zu stellen, aber es funktioniert bis max. 7µs, dann stimmt die freuquenz nicht mehr überein, weil ja der FPGA länger zum abarbeiten braucht als der timer braucht!
welche lösung wäre daher für die 180kHz am geeignetsten?
mfG
Lösung für 180 kHz --> nimm ein anderes Modul, das 9403 schafft nur max. 7µs gem. Spezifikation
Du hast bei 100% einen Low-Pegel "dazwischen", weil da noch ein Bug im Code war--> berichtigte Version liegt bei. Du musst übrigens nicht ständig die Controls in dem FPGA-VI beschreiben, es reicht, die Werte zu setzen, wenn sich etwas ändert.
Ich hab dann nochmal per SCTL alles an Performance rausgequetscht, was geht, bringen tut's freilich nix, weil der Code vorher schon schneller war, als das Modul schalten kann.
' schrieb:das 9403 schafft nur max. 7µs gem. Spezifikation
Aber in dem "Operating instructions and specifications" pdf-File wird unter "Timing" ein "propagation delay" von max. 330ns und ein "channel-to-channel skew" von max. 265ns versprochen! wie kann dann ein fehler von 7µs entstehen?
Wegen dem dauernden schreiben der controls an das fpga war meine überlegung, dass ich eine zeitgesteuerte while-schleife von 10ms im host laufen lasse, sodass ich sicher gehen kann das der wert der controls nur alle 10ms abgefragt wird und dann übergeben wird, weil ich verhindern will das in undefinierten zeitabständen die controls an das fpga übergeben werden. so kann ich sicher sein, dass auch wenn sich innerhalb der 10ms der zustand der controls ändert - zB. nach 5ms - der wert erst nach ablaufen der 10ms übergeben wird.