SelfDef-Script's für Signal-Quellen vom Typ LaplaceCurrents erstellen

Eine Spannungs-Quelle kann mit einer Ersatz-Schaltung aus Parallelschaltung von Stromquelle
und Widerstand dargestellt werden:

Mit der Pin-Spannung U = U1 - U2 ergibt sich für die Pin-Ströme:

I1 = Gi*U - Igen,   mit  Igen = Gi*E(t)
I2 = -I1

E(t) ist die gewünschte Spannungs-Funktion, die bei Leerlauf (offene Pins), an den Pins ausgegeben
werden soll.

Sinus-Generator:

Wir wollen nun einen Sinus-Generator erstellen und setzen:

E(t) = U0*sin(2pi*f*t),   und damit: Igen = Gi*U0*sin(2pi*f*t) = Imax*sin(2pi*f*t)

Wir setzen Imax = Gi*U0 um etwas Rechenzeit zu sparen.

Nun tragen wir diese Erkenntnisse in den Script ein:

#VarsAndConstants
GI = 1/RI
Imax = GI*U0
omega = c_2pi*Freq
#End

#Volts
u = u1 - u2
#End

#LaplaceCurrents
Igen = Imax*sin(omega*g_time)
i1 = GI*u - Igen
<i2 = -i1>
#End

Der vollständige Script SineVoltage.selfdef ist hier zu sehen.

Es wird der Term-Typ 0 (X = Igen) und der Term-Typ 1 (beta = GI) benutzt. Der Typ 0 repräsentiert eine
Zeitfunktion, die durch die PreFormel (Igen=) definiert wird. Für die fortlaufende Analyse-Zeit steht die
globale Variable g_time zur Verfügung.

Recheck-Generator:

Mit Tp als Periodendauer und der Low-Zeit tlow schreiben wir für Igen nun folgende Formeln:

ta     = {g_time < ta+Tp ? ta : ta+Tp}
Igen = {g_time-ta < tlow ? 0 : Imax}

Wir verwenden hier sogenannte Relations-Funktionen um auf Bedingungen zu reagieren.
ta steht immer auf dem Anfang der aktuellen Periode. Ist g_time innerhalb dieser Periode, bleibt ta unverändert
(ta = ta). Erreicht g_time das Ende der aktuellen Periode, springt ta um Tp (ta = ta+Tp). Die Zeit g_time - ta ist
dann die Modulo-Zeit, die für jede Periode von 0 bis Tp läuft.
Mit Hilfe der Modulo-Zeit kann nun eine Zeitfunktion für Igen implementiert werden, ohne auf die Periodizität
achten zu müssen (hier eine einfache Rechteck-Funktion).
Die PreFormel ta=... läßt sich also überall dort verwenden, wo Periodizität hineingebracht werden soll.

Im Script steht folgendes:

#Volts
u = u1 - u2
#End

#StateVars
ta = 0
#End

#LaplaceCurrents
ta     = {g_time < ta+Tp ? ta : ta+Tp}
Igen = {g_time-ta < tlow ? 0 : Imax}
i1     = GI*u - Igen
<i2 = -i1>
#End

Der vollständige Script RectangleVoltage.selfdef ist hier zu sehen.

Wir dürfen den uns noch unbekannten Block #StateVars begrüßen. Hier müssen Variable definiert werden, die in
#LaplaceCurrents auf der rechten Seite einer Formel auftauchen, ohne vorher definiert worden zu sein. Deswegen
sind Sie auch mit einem Wert zu initialisieren. Man spricht hier auch von einer sogenannten unabhängigen Variable.
StateVars bitte nicht mit VarsAndConstants verwechseln. StateVars können sich innerhalb von LaplaceCurrents
von einem Zeitschritt zum Nächsten ändern. VarsAndConstants bleiben dagegen immer konstant.

Voltage Controlled Oszillator (VCO):

Der VCO besteht aus einem Sinus-Spannungs-Generator mit dem Innenwiderstand Rout am Ausgang, sowie einem
Steuer-Eingang gegen Masse mit dem Eingangswiderstand Rctrl:

Mit den Pin-Spannungen:  Uctrl = U3 - U0,   Uout = U1 - U2

können wir für die Pin-Ströme schreiben:

I1 = (Uout - E)/Rout  =  Gout*Uout - Gout*E
I3 = Uctrl/Rctrl          =  Gctrl*Uctrl
I2 = -I1
I0 = -I3

Die Masse (Earth) wird wie ein InnerPin mit der Nummer 0 behandelt (wurde ja schon besprochen).
Jetzt müssen wir noch herrausfinden, wie die Sinus-Funktion E(t) implementiert werden muß, deren Frequenz
mit Uctrl gesteuert wird.

Wir setzen also an:

Umax ist die Amplidute des Sinus-Signals, Phi ist die gleitende Phase und w die gesteuerte Kreisfrequenz.
Für die numerische Integration von w  muß also folgendes implementiert werden:

für t = 0:   Phi = 0
für t > 0:   Phi = Phi + w*dt             dt - aktuelle Zeitschritt-Weite

w wird linear von Uctrl gesteuert:

w = w0 + Kw*Uctrl,   mit: w0 - Basis-Frequenz (bei Uctrl=0), Kw - Steuerfaktor

In den Script können wir nun endlich schreiben:

#Volts
uctrl= u3 - u0
uout = u1 - u2
#End

#StateVars
Phi = 0
#End

#LaplaceCurrents
w    = w0 + Kw*_uctrl                                         ; _uctrl: uctrl for a timestep before
Phi = {g_time > 0 ? Phi + w*g_timestep : 0}     ; _uctrl & w: not defined at t=0
iout = Gout*Umax*sin(Phi)

i1 = Gout*uout - iout
i3 = Gctrl*uctrl

<i2 = -i1>
<i0 = -i3>
#End

Um die Sache stark zu vereinfachen, benutzen wir statt uctrl die sogenannte PinOld-Spannung _uctrl.
Das ist die Pin-Spannung einen Zeitschritt vorher, die Gleichungen werden dadurch nicht nichtlinear.
Die Steuerspannung wirkt also um einen Zeitschritt verzögert. Bei genügend kleiner Zeitschritt-Weite
spielt das aber keine Rolle.
Für dt benutzen wir die globale Variable g_timestep. Diese repräsentiert immer die aktuelle Schrittweite
während der Analyse-Session. g_time repräsentiert die aktuelle Zeit t.

Um die Frequenz-Variation für die DynChart-Ausgabe verfügbar zu machen, benötigen wir noch die
aktuelle mittlere Frequenz.
Für den gleitenden Mittelwert der Kreisfrequenz setzen wir an:

Die eigentliche Frequenz-Variation ergibt sich dann zu:

Wir erweitern den Script entsprechend:

#LaplaceCurrents
w    = w0 + Kw*_uctrl                                         ; _uctrl: uctrl for a timestep before
Phi = {g_time > 0 ? Phi + w*g_timestep : 0}     ; _uctrl & w: not defined at t=0
iout = Gout*Umax*sin(Phi)
wav = {g_time > 0 ? phi/g_time : w0}    ; Average Frequency

i1 = Gout*uout - iout
i3 = Gctrl*uctrl

<i2 = -i1>
<i0 = -i3>
#End

#DefineDynCharts
Uctrl = Voltage Ctrl, V, uctrl
Uout = Voltage Out, V, uout
Iout = Current Out, A, i1
Freq = Frequency, Hz, w/c_2pi
dFreq = Frequency Variation, Hz, (w-wav)/c_2pi
#End

Der vollständige Script VCO.selfdef ist hier zu sehen.
Die Frequenz-Variation macht z.Bsp. erst richtig Sinn bei einer PLL-Schaltung. (siehe DocSamples/PLC2.circ)

Ich muß hier leider zu geben, dass immer wenn StateVars (Symbol ist auf der linken sowie rechten Seite
einer Gleichung) benutzt werden, die Schrittenweiten-Steuerung nicht richtig funktioniert. Also bitte
bei Analyser-Settings StepControl ausschalten.

Simulation des VCO:

Bitte die Schaltung DocSamples/VCO_Test.circ öffnen:

Der Sinus-Generator ist der hier besprochene. Ich habe die DynCharts Sig2:VoltageOut und Sig2:Frequency gewählt.
Nach Dyna öffnen sich die Charts:

Es wird hier quasi ein frequenz-moduliertes Signal erzeugt. Die VCO-Frequenz schwankt sinusförmig von 500Hz
bis 1.5kHz um die Basis-Frequenz (f0 = 1kHz) mit einer Frequenz von 250Hz.

Alle Signal-Quellen sind unter dem Verzeichniss Data/SignalSources zu finden. Auch eine Konstant-Stromquelle
ist dort zu finden.

Zurück zur Hauptseite