Zum Inhalt

🚀 SPICE

Die Simulation elektronischer Schaltungen wird häufig mit dem "Simulation Program with Integrated Circuit Emphasis", kurz SPICE, durchgeführt. SPICE ist ein leistungsfähiges Tool aus den 1970er Jahren, das sich zu einem Industriestandard für die Simulation von analogen und digitalen Schaltungen entwickelt hat. Dadurch wird es möglich, das Verhalten einer Schaltung zu analysieren, ohne sie aufzubauen, wodurch Zeit, Kosten und Ressourcen im Entwicklungsprozess eingespart werden können. Die Funktionsweise von SPICE basiert auf der Beschreibung der Schaltung in Form einer Netzliste, welche anschließend auf ihr zeitliches Verhalten, ihre Frequenzabhängigkeit oder ihre Abhängigkeit von einem Bauteilwert untersucht wird.

Was ist eine Netzliste?

Beim Zeichnen einer elektronischer Schaltung verwenden wir gerne abstrahierte Schaltpläne zur Darstellung der Schaltung. Schaltpläne sind vereinfachte Visualisierungen, bei denen die Funktion der Schaltung im Vordergrund steht. Alle in der Schaltung enthaltenen Bauteile und ihre Verbindungen untereinander werden in einer vereinfachten Form dargestellt sodass auf den ersten Blick erkennbar wird, welche Funktion die Schaltung erfüllt. Informationen über die wahre Geometrie der Schaltung werden dabei vernachlässigt: Aus dem abstrahierten Schaltplan lässt sich z.B. nicht abschätzen, wie groß die Bauteile sind, wie sie auf einer Platine angeordnet werden oder wie die Kupferleitungen zwischen den Bauteilen verlaufen.

Schaue wir uns dazu ein Beispiel an, indem wir aus dem Versuch Signale in Leitungen den Tiefpass-Filter betrachten. In Abb. 1 ist der Schaltplan des Tiefpass-Filters zu sehen, welcher nach dem gewohnten Schema gezeichnet ist. Dabei sind die Verbindungen von Eingangssignal zum Widerstand R1 sowie die Verbindung vom Widerstand R1 zum Kondensator C1 als auch zum Ausgangssignal absichtlich als durch linken dargestellte Leitungen dargestellt, wie es in einem Schaltplan üblich ist. Im Vergleich zu einer realen Schaltung sind diese Verbindungen aber idealisiert: Wir nehmen an, dass die Leitungen keinen Widerstand, keine Induktivität und keine Kapazität besitzen und sich nicht auf das Verhalten der Schaltung auswirken.


Abb. 1

Abb. 1: Konventioneller Schaltplan eines Tiefpass-Filters, bestehend aus einem Widerstand R1 und einem Kondensator C1. Die Leitungen sind idealisiert und besitzen keinen Widerstand, keine Induktivität und keine Kapazität.


Eine Leitung ist in einer Simulation nichts weiteres als eine Verbindung zwischen Bauteilen, die alle auf demselben elektrischen Potential liegen. Daher lassen sich die Leitungen in einer Simulation auf ein Minimum reduzieren, da sie keine weiteren Eigenschaften besitzen. Stattdessen verwenden wir zur Beschreibung der Schaltung lieber einen Punkt, an dem alle an eine Leitung angeschlossenen Bauteile miteinander zu verbunden sind und geben diesem Punkt einen Namen. Dieser Punkt wird als Knotenpunkt bezeichnet.

Abb. 2 stellt dieselbe Schaltung aus Abb. 1 dar, jedoch mit einer Beschreibung der Knotenpunkte. Auf die Darstellung von Leitungen wurde in der Skizze verzichtet, um die Knotenpunkte besser hervorzuheben. Alle Knotenpunkte sind mit einer Bezeichnung \(V_\text{xxx}\) versehen, da an jedem Knotenpunkt zu jedem Zeitpunkt eine Spannung \(V_\text{xxx}\) anliegt.


Abb. 2

Abb. 2: Der gleiche Tiefpass-Filter wie in Abb. 1, jedoch in einer anderen Anordnung der Bauteile und mit Beschrifteten Knotenpunkten. Die "Leitungen" wurden weggelassen, um die Knotenpunkte besser hervorzuheben. An allen Knotenpunkten liegt zu jedem Zeitpunkt eine bestimmte Spannung \(V_\text{xxx}\) an. Das Ausgangssignal des Tiefpass-Filters wird zwischen den Knoten \(V_\text{out}\) und \(V_\text{GND}\) abgegriffen.


Hinweis

Es ist nicht zwingend erforderlich, die Knotenpunkte nach dem hier verwendeten Schema zu benennen. In diesem Beispiel wurde die Bezeichnung \(V_\text{xxx}\) gewählt, um die Spannung an den Knotenpunkten zu verdeutlichen. In der Praxis werden Knotenpunkte häufig mit einfachen Zahlen oder Buchstaben bezeichnet, z.B. 1, 2, 3 oder A, B, C. Alternativ können auch Namen verwendet werden, mit denen die Bedeutung eines Knotenpunktes in der Schaltung beschrieben wird, z.B. \(V_\text{out}\). Wichtig ist wiederum, dass jeder Knotenpunkt einen eindeutigen Namen erhält.

Um die Schaltung in einer Simulation zu beschreiben, werden nun alle verwendeten Bauteile in einer sog. Netzliste beschrieben, die folgende Informationen über die Schaltung enthält:

  • Welche Bauteile werden in der Schaltung verwendet?
  • An welchen Knotenpunkten sind die Bauteile miteinander verbunden?

Das hier verwendete Beispiel wurde bewusst einfach gehalten. Im weiteren Verlauf dieser Einführung werden die Beispiele kompliziertere Schaltungen beschreiben, bei denen die Knotenpunkte zu verbindungssträngen von mehr als zwei Bauteilen werden. Davor ist es sinnvoll, zu verstehen, wie die Syntax einer Netzliste aufgebaut ist.

Wie werden Bauteile in eine Netzliste eingetragen?

Bei einer Netzliste handelt es sich um eine Textdatei mit der Dateiendung .cir, die in einem Texteditor bearbeitet werden kann. Jedes Bauteil wird in einer eigenen Zeile instanziiert, wobei die Bauteilbezeichnung mit einem Buchstaben beginnt und anschließend den Bauteilnamen vervollständigt. Bei den Beispielen R1, C1, L1 und V1 handelt es sich um einen Widerstand, einen Kondensator, eine Spule und eine Spannungsquelle. Der Tiefpassfilter aus Abb. 2 wird über die zwei Widerstände R1 und R2 beschrieben. Eine grobe Übersicht über die wichtigen Bauteile ist in Tab. 1 zu sehen.


Bauteil Bauteilbezeichnung
Widerstand R
Kondensator C
Spule L
Spannungsquelle V
Stromquelle I
Diode D

Tab. 1: Wichtige Bauteile in SPICE und ihre Bezeichnungen. Die Bezeichnung eines Bateils beginnt mit einem Buchstaben, der das Bauteil beschreibt, gefolgt vom restlichen Namen, der das Bauteil eindeutig identifiziert. In der Netzliste werden ale Bauteile in jeweils einer eigenen Zeile instanziiert.


Bei der Instanziierung der Bauteile werden anschließend die Knotenpunkte angegeben, an denen das Bauteil angeschlossen ist. Die dabei verwendeten Knotenpunkte müssen nicht vorher instanziiert werden, sie werden automatisch erstellt sobald sie in der Netzliste verwendet werden. Für die Schaltung in Abb. 2 greifen wir auf die fiktiven Knotenpunkte Vsource, Vout und 0 zurück, wobei die 0 unseren Ground darstellt.

Hinweis

In SPICE wird der Ground-Knotenpunkt immer mit der Zahl 0 bezeichnet. Es ist nicht möglich, einen anderen Namen für den Ground-Knotenpunkt zu verwenden. Die Angabe dieses Knotenpunktes ist zwingend erforderlich, da in SPICE alle Spannungen relativ zu Ground angegeben werden.

Zum Schluss müssen wir noch angeben, welchen ** Wert** das Bauteil besitzt. Dafür ist der letzte Parameter bei der Instanziierung des Bauteils vorgesehen. Eine Netzliste für den Tiefpassfilter aus Abb. 2, mit einem Widerstand von R1 = 1 kΩ und einem Kondensator von C1 = 0.1 μF, würde wie folgt aussehen:

Tiefpassfilter.cir
1
2
3
4
5
6
7
8
* Tiefpassfilter
* Instantiierung eines Widerstandes:
* Bauteilbezeichnung | Knotenpunkt 1 | Knotenpunkt 2 | Wert
R1 Vsource Vout 1k

* Instantiierung eines Kondensators:
* Bauteilbezeichnung | Knotenpunkt 1 | Knotenpunkt 2 | Wert
C1 Vout 0 0.1u

Bei der Angabe der Bauteilwerte kann auf folgende Abkürzungen zurückgegriffen werden:

  • k für Kilo
  • M für Mega
  • G für Giga
  • m für Milli
  • u für Mikro
  • n für Nano
  • p für Pico

Die Angabe der Einheiten (Ohm, Farad, Henry, Volt, ...) ist nicht erforderlich, da SPICE die Einheiten implizit aus der Bauteilbezeichnung ableitet. Die in diesem Abschnitt erklärte Netzliste reicht aber noch nicht aus, um eine Simulation durchzuführen. Dazu müssen wir noch äußere Parameter angeben, die die von außen anliegenden Eingangssignale, die Art der Simulation und die zu untersuchenden Größen beschreiben.

Spannungs- und Stromquellen

Wenn äußere Spannungs- oder Stromquellen in einer Schaltung verwendet werden, müssen diese ebenfalls in der Simulation angegeben werden. Eine konstante Spannungsquelle wird, ähnlich wie die im vorherigen Abschnitt beschriebenen passiven Bauteile, mit der Bauteilbezeichnung V instanziiert:

DC-Spannungsquelle.cir
1
2
3
* Spannungsquelle
* Bauteilbezeichnung | Knotenpunkt 1 | Knotenpunkt 2 | Typ | Wert
V1 Vsource 0 DC 5

In diesem Beispiel ist die Spannungsquelle mit den Knotenpunkten Vsource und 0 verbunden. Im Vergleich zu passiven Bauteilen ist hier die Reihenfolge der Knotenpunkte relevant, da ansonsten die Spannung in die andere Richtung anliegt. Das Ausgangssignal ist eine DC Gleichspannung von 5 V.

Interessanter sind für uns aber die zeitlich veränderlichen Signale, z.B. Sinusförmige Signale. Diese können mit der SIN-Funktion beschrieben werden. Diese nimmt eine Reihe von Parametern entgegen, die die Eigenschaften des Sinussignals beschreiben. Die Syntax lautet:

SIN(Voffset Vamplitude Vfrequency [Td] [Theta] [Phi] n)

Alle Parameter, die in eckigen Klammern angegeben sind, sind optional. Die Parameter erfüllen folgende Funktionen:

  • Voffset beschreibt die Gleichspannung, die auf das Signal aufaddiert wird.
  • Vamplitude beschreibt die Amplitude des Sinussignals.
  • Vfrequency beschreibt die Frequenz des Sinussignals.
  • Td beschreibt die Zeitverzögerung, mit der das Signal startet.
  • Theta beschreibt die Dämpfung des Signals.
  • Phi beschreibt die Phasenverschiebung des Signals.
  • n beschreibt die Anzahl der Perioden, die simuliert werden sollen.

Häufig werden nur die ersten drei Parameter verwendet, um ein einfaches Sinussignal zu erzeugen. Ein Beispiel für eine Sinus-Spannungsquelle mit einer Amplitude von 9 V und einer Frequenz von 1 kHz ist in der folgenden Netzliste zu sehen:

AC-Spannungsquelle.cir
1
2
3
* Spannungsquelle
* Bauteilbezeichnung | Knotenpunkt 1 | Knotenpunkt 2 | Typ | Wert
V1 Vsource 0 SIN(0 9 1k)

Für die Simulation von Dreieck- und Rechtecksignalen kann die PULSE-Funktion verwendet werden. Wenn wir der Simulation des Tiefpassfilters aus Abb. 2 eine Rechteck-Spannungsquelle mit einer Amplitude von 9 V und einer Frequenz von 1 kHz hinzufügen, sieht die Netzliste wie folgt aus:

Tiefpassfilter.cir
* Eingangssignal
* Die PULSE Funktion nimmt folgende Parameter entgegen:
* V1 (=0) | V2 (=9) | Td (=0) | Tr (=1u)
* | Tf (=1u) | Ton (=500u) | Tperiod (=1m)

V1 Vsource 0 PULSE(0 9 0 1u 1u 500u 1m)

* Tiefpassfilter
* Widerstand R1
R1 Vsource Vout 1k
* Kondensator C1
C1 Vout 0 0.1u

Die PULSE-Funktion nimmt der Reihe nach die folgenden Parameter entgegen:

  • V1 beschreibt die untere Spannung des Rechtecksignals.
  • V2 beschreibt die obere Spannung des Rechtecksignals.
  • Td beschreibt die Zeitverzögerung, mit der das Signal startet.
  • Tr beschreibt die Anstiegszeit des Signals ("Rise Time") und Tf beschreibt die Abfallzeit des Signals ("Fall Time").
    • Diese werte dürfen nicht Null sein, da sonst die Simulation fehlschlägt. Stattdessen wird ein kleiner Wert verwendet, der sich mehrere Größenordnungen unterhalb der Periodendauer des Signals befindet, z.B. 1 μs.
  • Ton beschreibt die Zeit, die das Signal auf der oberen Spannung verweilt.
  • Tperiod beschreibt die Periodendauer des Signals.
  • optional: Ncycles beschreibt die Anzahl der Perioden, die simuliert werden sollen.

Die Anzahl der Parameter für die PULSE-Funktion ist größer als bei der SIN-Funktion, um die Beschreibung komplizierterer Signale zu ermöglichen. Dieselben Funktionen können auch bei der Instanziierung von Stromquellen verwendet werden, indem der Bauteilbezeichner I angegeben wird. Für die Durchführung der Simulation fehlt nur noch die Angabe des Simulationstyps und der zu untersuchenden Größen.

Transiente Simulation

Bei einer Transienten Simulation wird das zeitliche Verhalten der Schaltung untersucht. Dazu muss abschließend die .tran Direktive angegeben werden, die die Parameter für die Simulation entgegennimmt. Die Syntax lautet:

TRAN-Direktive.cir
1
2
3
4
* Transiente Simulation
* Die .TRAN Direktive nimmt folgende Parameter entgegen:
* Tstep (=10n) | Tstop (=2m)
.tran 10n 2m

Die interessanten Ergebnisse der Simulation ist im Falle des Tiefpassfilters aus Abb. 2 die Spannung am Ausgangsknotenpunkt Vout. Um als Ausgabe der Simulation den zeitlichen Verlauf der Spannung am Ausgangsknotenpunkt zu erhalten, müssen ein paar zusätzliche Kontroll-Direktiven zwischen .control und .endc angegeben werden:

Simulations-Direktiven.cir
* Simulations-Direktiven
* Transiente Simulation
.tran 10n 2m

* Beginn der Kontroll-Direktiven für ngspice
.control

* Führe die Simulation aus
run

* Ausgabe der Spannung am Eingangssignal Vsource und Ausgangsknotenpunkt Vout
plot V(Vsource) V(Vout) title "Eingangs- und Ausgangssignal des Tiefpassfilters"

.endc

* Ende der Netzliste
.end

Eine Netzliste wird abschließend immer mit einer .end Direktive abgeschlossen. Es ist möglich, mehrere Plots zu erstellen, die anschließend in separaten Diagrammen dargestellt werden. Die vollständige Netzliste für die Simulation des Tiefpassfilters aus Abb. 2 sieht wie folgt aus:

Tiefpassfilter.cir
* Eingangssignal: Rechteck
V1 Vsource 0 PULSE(0 9 0 1u 1u 500u 1m)

* Widerstand R1
R1 Vsource Vout 1k
* Kondensator C1
C1 Vout 0 0.1u

* Simulations-Direktiven:
* Transiente Simulation
.tran 10n 2m

* Beginn der Kontroll-Direktiven für ngspice
.control

* Führe die Simulation aus
run

* Ausgabe der Spannung an Vsource und an Vout
plot V(Vsource) V(Vout) title "Eingangs- und Ausgangssignal des Tiefpassfilters"

.endc

* Ende der Netzliste
.end

Ausführen der Simulation

Zuerst muss das Programm ngspice installiert werden. Die zu simulierende Netzliste wird hier beispielsweise in der Datei Tiefpassfilter.cir gespeichert. Anschließend kann die Simulation über die Kommandozeile gestartet werden:

ngspice Tiefpassfilter.cir

Nachdem die Berechnung abgeschlossen wurde, sollte ein Fenster mit dem Diagramm der Spannungen am Eingangssignal Vsource und Ausgangsknotenpunkt Vout erscheinen. Das Diagramm zeigt den zeitlichen Verlauf der Spannungen, wobei das Eingangssignal als Rechtecksignal dargestellt wird und das Ausgangssignal die charakteristische Dämpfung des Tiefpassfilters aufweist.

Hinweis für Linux-Nutzer

Unter Linux kann es vorkommen, dass das Speichern des Diagramms als Bild nicht funktioniert, da der Ordner ~/tmp nicht existiert. In diesem Fall kann der Ordner mit dem Befehl mkdir ~/tmp erstellt werden, bevor die Simulation gestartet wird.

Das Diagramm kann als Bild gespeichert werden und ist in Abb. 3 zu sehen. Weiterhin stellt ngspice auch eine Cursor-Funktion mit der Maus zur Verfügung, mit der die Spannungen an den Knotenpunkten zu einem bestimmten Zeitpunkt abgelesen werden können. In der Kommandozeile kann ngspice mit dem Befehl exit beendet werden. Falls die Eingabe von exit nicht möglich ist, kann mit der Tastenkombination CTRL + C die Eingabezeile zurückgesetzt werden.


Abb. 3

Abb. 3: Simulation des Tiefpassfilters aus Abb. 2. Das Eingangssignal ist ein Rechtecksignal mit einer Amplitude von 9 V und einer Frequenz von 1 kHz. Das Ausgangssignal zeigt die charakteristische Dämpfung des Tiefpassfilters.


Anmerkung d. Redaktion

Die Bilder sind initial nicht gut für die Weiterverwendung geeignet. Daher werden sie im Verlauf dieses Dokumentes vorher in Inkscape für eine bessere Darstellung nachbearbeitet.

Komplexes Beispiel

Als Beispiel für die Simulation eines größeren Aufbaus wird im Folgenden ein Frequenzkompensierter Spannungsteiler mit Offset-Spannung betrachtet. Der Schaltplan ist in Abb. 4 zu sehen.


Abb. 4

Abb. 4: Schaltplan eines frequenzkompensierten Spannungsteilers mit Offset-Spannung.


Die Netzliste für die Simulation sieht wiefolgt aus:

Offset-Addition.cir
* Eingangssignal: 100KHz Sinus mit 9V Amplitude
Vsource Vsource 0 SIN(0 9 100k 0 0 0 100)

* Widerstand R1 zwischen Vsource und Vout (=Mitte d. Spannungsteiler)
R1 Vsource Vout 11500
* Widerstand R2 von Vout zu Voff (Offset-Spannung)
R2 Vout Voff 2260
* Es folgen die Kondensatoren
C1 Vsource Vout 47p
C2 Vout Voff 470p
* Trimmer: Parallel zu C2, 50pF
Ctrim Vsource Vout 50p
* C2
* Eingangsimpedanz des Oszilloskops
Cosc Vsource Voff 15p
Rosc Vsource Voff 1000k

* Offset-Spannung: DC 1,8V
Voff Voff 0 DC 1.8V

* Simulations-Parameter:
* Transiente Analyse in 0.1ns Schritten für eine
* Gesamtdauer von 20µs
.tran 0.1n 20u

* Simulation ausführen und Ergebnisse Plotten
.control
run
* Ausgabe von Vsource, Voff und Vout
plot v(Vsource) v(Voff) v(Vout) title "input and output voltage"
.endc
.end

Das Ergebnis der Simulation ist in Abb. 5 zu sehen.


Abb. 5

Abb. 5: Simulation des frequenzkompensierten Spannungsteilers mit Offset-Spannung aus Abb. 4.


Bauteil-Bibliotheken

Bauteile, die kompliziertere Eingenschaften besitzen, wie z.B. Dioden, Transistoren oder Operationsverstärker, können nicht mehr mit einer einfachen Bauteilbezeichnung instanziiert werden. Häufig sind diese Parameter nur den Herstellern bekannt und können nicht einfach in der Netzliste angegeben werden. Für Dioden ist der Parameterraum noch überschaubar, sodass die Definition der Bauteile von den Herstellerwebseiten kopiert werden kann. Andernfalls stellen die Hersteller häufig Bauteil-Bibliotheken zur Verfügung, die eingebunden werden können.

Als Beispiel wird hier wieder der Frequenzkompensierte Spannungsteiler mit Offset-Spannung betrachtet. Jedoch wird die Offset-Spannung nicht mehr über eine Spannungsquelle, sondern über einen Spannungsteiler und einen Impedanzwandler erzeugt. Der Schaltplan ist in Abb. 6 zu sehen.


Abb. 6

Abb. 6: Schaltplan eines frequenzkompensierten Spannungsteilers mit Offset-Spannung, der einen Impedanzwandler mit einem Operationsverstärker verwendet, um die Offset-Spannung zu erzeugen.


Für die Simulation wird ein Modell des Operationsverstärkers vom Typ LM358 benötigt, welches auf der Webseite des Hersteller heruntergeladen werden kann. In diesem Beispiel wurde die Datei unter dem Namen LM358.cir gespeichert. Die Netzliste für die Simulation sieht wiefolgt aus:

Offset-Addition-OpAmp.cir
* SPICE-Model für den OPV einbinden
.include LM358.lib

* Eingangssignal: 100KHz Sinus mit 9V Amplitude
Vsource Vsource 0 SIN(0 9 100k 0 0 0 100)

* Widerstand R1 zwischen Vsource und Vout (=Mitte d. Spannungsteiler)
R1 Vsource Vout 11500
* Widerstand R2 von Vout zu Voff (Offset-Spannung)
R2 Vout Voff 2260
* Es folgen die Kondensatoren
C1 Vsource Vout 47p
C2 Vout Voff 470p
* Trimmer: Parallel zu C2, 50pF
Ctrim Vsource Vout 50p
* C2
* Eingangsimpedanz des Oszilloskops
Cosc Vsource Voff 15p
Rosc Vsource Voff 1000k

* Offset-Spannung erzeugen
* Dazu wird die ± 12 V Versorgungsspannung für
* den OPV benötigt
V12 V12 0 DC 12
Vn12 Vn12 0 DC -12

* Spannungsteiler für die Offset-Spannung
Rref1 V12 Voffout 16.2k
Rref2 Voffout 0 2.87k

* Instantiiere den OPV
* Alle integrierten Bauteile haben einen Bezeichner,
* der mit "X" beginnt
* Anschlüsse: non-inverting input
*             |   inverting input
*             |   |    positive power supply
*             |   |    |   negative power supply
*             |   |    |   |    output
*             |   |    |   |    |    Instantiiere den OPV Typen
*             |   |    |   |    |    |
XOP1      Voffout Voff V12 Vn12 Voff LM358


* Simulations-Parameter:
* Transiente Analyse in 0.1ns Schritten für eine
* Gesamtdauer von 20µs
.tran 0.1n 20u

* Simulation ausführen und Ergebnisse Plotten
.control
run
* Ausgabe von Vsource, Voff und Vout
plot v(Vsource) v(Voff) v(Vout) title "input and output voltage"
.endc
.end

Hier besteht eine Besonderheit darin, dass die Spannungsversorgung des Operationsverstärkers (hier \(\pm12\ \mathrm{V}\)) über zusätzliche Spannungsquellen und Knoten in der Netzliste bereitgestellt werden muss. Das Bauteil wird über die Bibliothek eingebunden und anschließend in der Netzliste instanziiert. Für alle Bauteilbibliotheken ist es wichtig, vorher nachzuschauen, wie die Instantiierung durchzuführen ist. Dazu gibt es Hinweise auf den Herstellerwebseiten oder im Quelltext der Bibliothek selbst. Das Ergebnis der Simulation ist im zugehörigen Kapitel über den Frequenzkompensierten Spannungsteiler mit Offset-Spannung zu sehen.