Erstellung einer SelfDef-Datei vom Typ RealCurrents am Beispiel einer Diode erklärt

Mittels der SelfDef-Datei vom Typ RealCurrents kann ein Modell für ein im Allgemeinen
nichtlineares Bauelement erstellt werden. Dabei müssen die I(U)-Funktionen bekannt sein.

Für ein beliebiges Element mit n Pins gilt:

I1    = f1(Ux, Uy, ...)
I2    = f2(Ux, Uy, ...)
...
In-1 = fn-1(Ux, Uy, ...)
In    = -(I1+I2+...+In-1)

Die I1, I2, ... sind die sogenannten Pin-Ströme.
Die Ux, Uy, ... sind Spannungen zwischen 2 Pins (Pin-Spannungen).
Alle I(U)-Funktionen müssen unbedingt stetig sein, die 1.Ableitung mindestens definiert in allen Punkten,
sonst kann es zu Konvergenz-Problemen kommen. (siehe: segmentierte Funktionen)

Erstmal sollte man sich eine Skizze machen und Ströme, Spannungen, Pins einzeichnen.
Für die Diode sieht das so aus:

Die Pin-Nummern müssen natürlich mit Denen des MBitmaps identisch sein. Alle Pin-Ströme müssen in das
Element hinein fließend dargestellt werden.
Da bei der Diode nur 2 Pins vorhanden sind, muß nach obigen Gleichungen auch nur ein Pin-Strom und eine
Pin-Spannung definiert werden.

Als Pin-Spannung definieren wir: Ud = U1 - U2
Ud
ist also die Differenz zwischen dem Pin1-Potential und dem Pin2-Potential.

Die I(U)-Funktion für den Pin1-Strom der Diode lautet dann:

Kommen wir nun zum Script. Die meisten Blöcke sind ja schon vom Modul-Script her bekannt.
Die Blöcke #Volts und #RealCurrents beinhalten folgendes:

#Volts
ud = u1 - u2
#End

#RealCurrents
i1 = IS0*(exp(ud/UT) - 1) + Giso*ud     ; Giso*ud erzeugt Isolations-Strom
<i2 = -i1>
#End

Bei #Volts schreiben wir die Pin-Spannungen hin. Hier müssen links immer das Pin-Spannungs-Symbol und rechts
die Differenz zweier Pin-Potentiale stehen. Für die interne Masse ist das Symbol U0 reseviert.
Der Block #RealCurrents legt den eigentlichen Modelltyp fest und beinhaltet die Definitionen der Pin-Ströme.
Zusätzlich muß dieser Block noch eine sogenannte Bilanz-Strom-Gleichung enthalten. Diese Gleichung wird in
Brackets (<>) eingeschlossen. Auf der linken Seite steht der noch fehlende Pin-Strom In (hier I2), auf der rechten
Seite muß die negative Summe aller anderen Pin-Ströme stehen (hier nur I1). Diese Gleichung besagt auch, dass
der Pin-Strom I1 aus dem Pin2 herausfließt. Die Summe aller Ströme ergibt somit immer 0 (Kirchhof-Gesetz).

Aus numerischen Gründen habe ich der Diode noch einen Isolationswiderstand Riso parallel geschaltet.

Die Blöcke #Parameter und #VarsAndConstants beinhalten erst einmal folgendes:

#Parameter
IS0 = IS0(A), 7f
Temp= Temp(°C), 20
#End

#VarsAndConstants
UT = 8.6e-5*(273+Temp)
Riso = 10e6
Giso = 1/Riso
#End

Bei #Parameter legen wir die Eingabe-Parameter IS0 sowie Temp fest.
Bei #VarsAndConstants tragen wir alle Größen ein, die sich bei Parameter-Änderung verändern, aber während
einer Analyse-Session konstant bleiben. Hier berechnen wir also die Temp.-Spannung UT, legen Riso als
Konstante fest, und berechnen den Leitwert Giso (für Iso-Strom).

Wichtig ! Für Zahlen dürfen nur im Parameter-Block (Default-Wert) SI-Einheiten-Kürzel verwendet werden.

Das Dioden-Element wäre damit erst einmal fertig. Es entspricht dem internen Modell von ToneCirc ohne parasitäre
Kapazitäten, nur das im internen Modell der differentielle Widerstand durch den Parameter Rb begrenzt wird.

Desweiteren ermöglicht das RealCurrent-Modell ein Anschalten von (i.A.) nichtlinearen Kapazitäten und Leitwerten
an jeweils 2 Pins.
Für die parasitären PN-Kapazitäten der Diode gelten die Gleichungen:

Dabei ist CD die Diffusions-Kapazität und CS die Sperrschicht-Kapazität. Die Definitionen für K1 und K2 lasse ich
hier mal weg, die stehen im Script bei #VarsAndConstants.

Die Blöcke #Parameter und #VarsAndConstants beinhalten komplettiert folgendes:

#Parameter
IS0 = IS0(A), 7f
T0 = T0(s), 0.41n
CS0 = CS0(F), 11p
UDIFF = Udiff(V), 0.5
MS = ms, 0.67
FS = fs, 0.5
Temp= Temp(°C), 20
#End

#VarsAndConstants
UT = 8.6e-5*(273+Temp)
ISDUT = IS0/UT
K1 = CS0*(1-FS*(1+MS))/(1-FS)^(1+MS)
K2 = CS0*MS/UDIFF/(1-FS)^(1+MS)
UFSDiff = FS*UDIFF
Riso = 10e6
Giso = 1/Riso
#End

Ich denke, das muß nicht weiter erklärt werden.

Dem Script wird nun hinzugefügt:

#SetCapacitor
Token = Cd
CD = T0*ISDUT*exp(ud/UT)
CS = {ud < UFSDiff ? CS0/(1-ud/UDIFF)^MS : K1+K2*ud}
Param = CD + CS
Pin1 = 1
Pin2 = 2
#End

Mit dem #SetCapacitor-Block wird eine Kapazität definiert. Zuerst muß ein Token-Kürzel festgelegt werden
(hier Cd). Dann folgen sogenannte PreFormeln, wo Vorberechnungen durchgeführt werden können. Hier
legen wir die Diffusions-Kap. CD und die Sperrschicht-Kap. CS fest. Diese Formeln können Parameter, Variable,
Konstanten sowie Pin-Spannungen enthalten. Die Symbole links vorm '=' sind ebenso Variable, die wiederum
in einer nachfolgenden PreFormel benutzt werden können.
Beim Param-Key weist man die eigentliche Kapazität zu (hier die Summe von CD und CS, da beide parallel liegen).
Man könnte auch die PreFormeln weglassen und dafür hinter Param= die komplette Formel schreiben.
Für CS wird eine sogenannte segmentierte Funktion verwendet. Das heißt Sie besteht aus 2 Teilen, die je nach
Bedingung eingesetzt werden. Solch eine Funktion wird mittels der Relations-Funktion dargestellt (siehe hier).
Bei Pin1= und Pin2= müssen nun nur noch die Anschluss-Pin-Nummern dieses Kondensators festgelegt werden.

Wichtig: Die Gleichung für die Kapazität muß in der Summe stetig (1. Ableitung in allen Punkten definiert) sein.
Vor allem bei der Relations-Funktion ist darauf zu achten, dass am Übergang zwischen den beiden Funktions-Teilen
keine 'Kante' oder gar ein Sprung entsteht.
Manchmal ist es unmöglich eine Gleichung so zu formulieren. Dann kann man den Key CalcType = Simple unter
dem Token einfügen, um eine Näherungs-Berechnung zu erzwingen. Diese Näherung ignoriert die differentielle
Kapazität und führt während der Iteration zu einem konstanten Wert. Beim MosFet habe ich das mal nur so gemacht.

Die eigentlich wirksame Kapazität ist nämlich die dynamische Kapazität:

Der 1. Term ist die statische Kapazität, der 2. Term die differentielle Kapazität. Die diff. Kap. ist für die Dyna als auch
für die LSA sehr wichtig, da diese Kapazität, insbesondere im Durchlass-Bereich eines PN-Überganges, sehr viel
größer als die stat. Kap. werden kann. Bitte Cd nicht mit CD verwechseln, Cd ist Gesamt-Dioden-Kap. !

Beim ohmschen Widerstand der Diode wird analog der statische und der differentielle Widerstand unterschieden:

Für die LSA ist nur Rdiff von Bedeutung.

Zum Abschluss schauen wir uns noch die Definitionen für die Ausgaben an:

#DefineStaticInfoText
Ud = <ud>V, Id = <i1>A
Rd_stat = <ud/i1>, Rd_diff = <1/di1_dud>Ohm
Cd_stat = <Cd>F, Cd_dyn = <Cd + dCd_dud*ud>F
#End

#DefineDynCharts
Ud = Voltage, V, ud
Id = Current, A, i_o1
Rdiff = Diff. Resist, Ohm, 1/di1_dud
Cdyn = Dyn. Cap, F, Cd + dCd_dud*ud
#End

Ansich das Selbe wie beim Modul-Script. Nur kann man hier noch sogenannte partielle Ableitungs-Symbole (kurz PDiff's)
verwenden. Diese beschreiben die Ableitung eines Pin-Stroms nach einer Pin-Spannung (di1_dud) bzw. die Ableitung einer
Kapazität nach einer Pin-Spannung (dCd_dud). Das Partial-Operator-Zeichen ersetzt man durch ein 'd', den Bruchstrich
durch ein '_'. Als Kapazitäts-Symbol muß das Token-Symbol verwendet werden. Für In ist kein PDiff-Symbol definiert.
In den Formeln können all jene Symbole verwendet werden, die irgendwo im Script auf der linken Seite auftauchen (also
definiert worden sind).
Zu beachten ist noch, dass bei Id nicht i1 sondern i_o1 verwendet wird. i_o1 stellt den Außen-Strom dar, also die Summe
aus i1 und dem Strom der Kapazität. i1 repräsentiert ja nur den RealCurrent-Strom.

Dieses Script kann man als Vorlage benutzen für alle 2-poligen nichtlinearen Elemente. Man darf nur nicht vergessen die
GUID am Anfang des Scripts zu löschen, da eine Neue zugewiesen werden muß (neues Element = neue GUID).

Der vollständige Script ist hier zu sehen. Der Script ist unter Data\Transistors_Diodes\Diode.selfdef zu finden.
Das MBitmap diode.mbmp ist natürlich schon vorhanden.
Auch eine Datenbank für Dioden habe ich schon mal vorbereitet (zu finden unter DataBase\Diode.txtdb). Die Struktur
einer solchen Datenbank ist sehr einfach und erschließt sich daher von selber.

Analyse Dynamisches Verhalten:

Nun testen wir noch das dynamische Verhalten unsrerer Diode.
Bitte die Schaltung DocSamples\Test_Diode_Dynamic.circ öffnen:

Wir führen Dyna durch und erhalten diese Charts:

Nach dem Einschalt-Sprung wird die PN-Kapazität schnell aufgeladen auf ungefähr 600mV. Nach dem Ausschalt-Sprung
bleibt die Dioden-Spannung noch ungefähr 100ns fast konstant. Das liegt daran, dass die statische Kapazität linear sinkt
und dabei ihre Ladung als konstanten Strom (siehe Current D1) abgibt. Dieser Effekt wird so ähnlich auch beim
dynamischen RAM ausgenutzt.

Zurück zur Hauptseite