Ich kann die Frequenz mit Modulate zeitlich verschieben, aber ich konnte kein Beispiel zum Erstellen eines variierenden Tastverhältnisses finden, oder ein Tastverhältnis wird bei einer bestimmten Frequenz f in einem Zeitintervall von null auf 100 % verschoben.
Gibt es eine Möglichkeit / Problemumgehung, um den Arbeitszyklus in LTspice über die Zeit zu fegen?
Bearbeiten:
Ich habe die folgende Timer-Schaltung, die das tun kann. Aber das war nicht das, wonach ich gesucht habe, da diese Art von Lösung die Simulation stark verlangsamt. Ich habe mich gefragt, ob es einen schnellen Weg gibt, dies mit einer einzigen Spezialfunktion oder einem SPICE-Befehl zu tun.
Bitte klicken Sie mit der linken Maustaste auf das Diagramm unten, um es zu vergrößern und die Schwankungen des Arbeitszyklus zu sehen:
Ich bin mir nicht ganz sicher, ob Sie das wirklich wollen, aber versuchen wir es trotzdem. Zuerst erzeugen wir eine Sägezahnrampe mit einer bestimmten Frequenz, indem wir unsere selbst definierte Modulo-Funktion mit der Zeit verwenden (grüne Kurve):
.function mod(x,y) { (x/y)-int(x/y) }
Dann verwenden wir die tatsächliche Zeit und die if-Funktion als Grenzpunkt zum Erzeugen einer Rechteckwelle mit einer beliebigen Spannungsquelle:
V=if( (mod(time*10,1)) > time, 1, 0 )
Dies sollte Ihnen einen guten Ausgangspunkt bieten, um daran herumzubasteln und es an Ihre Bedürfnisse anzupassen.
Der beste Weg, sowohl simulativ als auch effizient, ist mit A-Geräten:
Damit können Sie nicht nur Ansteuerung und Träger nach Belieben separat variieren, sondern haben auch Zugriff auf vt
(Schwelle) und vh
(Hysterese) für den Komparator, Sie haben zeitliche Hilfsmittel wie Rout/Cout
, oder tau
, oder trise/tfall
(wählen Sie eine Option aus der drei), die auch zur Konvergenz beitragen, können Sie vhigh/vlow
auf beliebige Stufen einstellen, und es wird ohne Probleme so schnell wie möglich simuliert. Konvergenz ist garantiert.
Für die Signale empfehle ich, die Grundspannungsquelle zu verwenden, sofern sie nicht an anderer Stelle in der Schaltung dynamisch erzeugt werden.
Ich habe gerade festgestellt, dass @Bimpelrekkie ungefähr dasselbe vorgeschlagen hat, aber zu meiner Verteidigung habe ich ausdrücklich auf die zu verwendenden Elemente hingewiesen.
Ich bin kein LTspice-Benutzer, daher weiß ich nicht, ob die erforderlichen idealen Komponenten in LTspice verfügbar sind.
Aber vorausgesetzt, sie sind es, können Sie Ihr eigenes System dafür bauen, etwa so:
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Grundsätzlich vergleicht die Schaltung eine (schnelle) 1-MHz-Dreieckswelle mit einer (langsamen) Rampe von 100 ms. Wenn langsam 0,5 V beträgt, hat der Ausgang des Komparators ein Tastverhältnis von 50 %, da die Dreieckswelle die Hälfte der Zeit unter 0,5 V und die andere Hälfte der Zeit über 0,5 V liegt.
Sie können einen idealen Komparator herstellen (wenn er nicht verfügbar ist), indem Sie eine VCVS (Voltage Controlled Voltage Source) mit einer Verstärkung von beispielsweise 1000 und begrenzten Ausgangswerten verwenden, beispielsweise 0 und 1 V.
A-devices
wann immer möglich über alles Schalten in der Natur. Ihr Verhalten ist viel besser und sie ermöglichen auch eine feinkörnige Steuerung ( vt/vh
, td
, tau/Cout,Rout/trise,tfall
, ...).Dies ist keine vollständig perfekte Antwort, sollte Ihnen aber einen guten Ausgangspunkt geben (hoffe ich).
Was ich versucht habe, ist die Verwendung einer willkürlichen Verhaltensspannungsquelle.
Das ist meine Netzliste:
B1 NC_01 0 V=if((time/{period})-int(time/{period})<time*{ontime},{Von},{Voff})
.param period 1
.param ontime=1/100
.param Von 3
.param Voff 0
.tran 100
.backanno
.end
Und der Screenshot mit dem Ergebnis:
Aufschlüsselung der Verhaltensspannungsquellenfunktion:
Beachten Sie zunächst, dass Verhaltensspannungsquellen Zugriff auf die Simulationszeit haben, indem sie time
als Parameter für Funktionen verwendet werden. .param
Dies ist in Anweisungen nicht verfügbar .
Zuerst brauchen wir eine Funktion, die es uns ermöglicht, eine PWM-Funktion basierend auf der aktuellen Zeit zuzulassen. Hierfür if(x,y,z)
ist das Konstrukt hilfreich. Aber ein einfacher if(time<{ontime},3,0)
wird kein wiederkehrendes Signal erzeugen, sondern nur einen Impuls am Anfang.
Hier kommen die nächsten Konstrukte ins Spiel: (time/{period})-int(time/{period})
Dies ist im Grunde nur Zeitmodulperiode, aber es gibt keinen Modulusoperator, also muss ich den Weg gehen, um den ganzzahligen Teil der Zeit dividiert durch Periode von der Division von Zeit und Periode zu subtrahieren. Duh.
Dann müssen Sie die Einschaltzeit zeitlich variieren. In diesem Beispiel habe ich einfach die Zeit mit einem Faktor von 1/100 verwendet. ...<time*{ontime}
Nun, das ontime
ist wahrscheinlich nicht der beste Name für diesen Parameter - es ist eher ein Skalierungsfaktor.
Ich habe es mit einer Verhaltensspannungsquelle gemacht. Das Ergebnis ist dasselbe wie bei Verwendung des Komparators, die Änderung des Arbeitszyklus erfolgt durch V2:
Hier ist der .asc-Code:
Version 4
SHEET 1 880 680
WIRE 32 144 -48 144
WIRE 80 144 32 144
WIRE 272 144 144 144
WIRE 48 176 32 176
WIRE 80 176 48 176
FLAG 32 256 0
FLAG -48 224 0
FLAG 48 176 t1
FLAG 32 144 t2
FLAG 352 224 0
FLAG 352 144 u2
FLAG 272 144 u1
SYMBOL Digital\\diffschmitt 80 96 R0
WINDOW 3 8 32 Left 2
SYMATTR InstName A1
SYMATTR Value vt=0 vh=0 vhigh=3.3
SYMBOL voltage 32 160 R0
WINDOW 3 24 96 Left 1
WINDOW 123 0 0 Left 0
WINDOW 39 0 0 Left 0
SYMATTR InstName V1
SYMATTR Value PULSE(0 3.3 1p {0.5/freq} {0.5/freq} 1p {1./freq})
SYMBOL voltage -48 128 R0
WINDOW 3 24 96 Left 1
WINDOW 123 0 0 Left 0
WINDOW 39 0 0 Left 0
SYMATTR InstName V2
SYMATTR Value SINE(01.65 1.65 {freq2})
SYMBOL bv 352 128 R0
SYMATTR InstName B1
SYMATTR Value V=if(V(t2)>V(t1),3.3,0)
TEXT 296 64 Left 2 !.param freq=2khz freq2=freq/20
TEXT 16 72 Left 2 !.tran {25/freq}
TEXT -72 280 Left 1 !.OPTIONS METHOD=GEAR ABSTOL=1e-6 CHGTOL=1e-12 GMIN=1e-9 ITL1=1000 ITL2=1000 ITL4=1000 ITL6=1000 RELTOL= 0.001 VNTOL=1e-3 NOOPITER
PlasmaHH
Benutzer16307