Howto Wer hat Angst vor Virginia Woolf? -- Crashkurs in "X" (subcircuit)

RudiS

Absoluter Profi
Member
Landesflagge
Wer hat Angst vor Virginia Woolf? --- Es gibt ja durchaus Personen bzw. Situationen, die einem Angst machen: plötzlich verselbständigen sich die Vorstellungen, und in der Phantasie wird es
nicht selten schlimmer als es sein müsste. Auch in der elektronischen Simulation mag es derartige Elemente geben, die einem „Angst“ machen. Dabei ist es oft nur das Ungewohnte und Unbekannte,
das einer neuen Erfahrung im Wege steht. So wie im Sprichwort: „Was der Bauer nicht kennt, das isst er nicht.“

Ein solches – um im Bilde zu bleiben – Angst machendes Element bei LTspice ist allem Anschein nach der Subcircuit. Dabei ist der im Prinzip ganz einfach und nicht so kompliziert, wie viele vielleicht meinen.

Wer also noch nie einen Subcircuit erstellt hat, aber den Mut und die Neugier besitzt, Neuland zu betreten, der ist hier auf dem richtigen Weg.
(Ich möchte an dieser Stelle noch einmal betonen, dass in den meisten Fällen nicht das Erstellen des eigentlichen Subcircuits das Schwierige ist, sondern das Erstellen des Symbols.)

Hinweis: um die im Text eingebetteten Bilder grösser zu sehen, auf das Bild klicken!

Was ist denn eigentlich ein Subcircuit? - Leider sind die Informationen dazu in der LTspice-Hilfe nicht gerade ausführlich und leicht verständlich,
deswegen hier einige zusätzliche Erläuterungen.

Nun, wie der Name schon sagt, ist ein Subcircuit ein Teil-Schaltplan, der dem Hauptschaltplan untergeordnet ist, so z.B. ein Filter für eine bestimmte Frequenz,
ein Flip-Flop als Frequenzteiler etc. Ein Filter setzt sich z.B. zusammen aus Widerständen, Kondensatoren und einem Transistor. Dieses Filter ist schaltungstechnisch
eine – nennen wir es einmal so – funktionale Einheit. Diese Einheit machen wir auch äusserlich sichtbar, in dem wir ein Symbol dafür erstellen.
Sinnvoll ist ein Subcircuit vor allem dann, wenn er mehrfach im Hauptschaltplan vorkommt oder auch anderweitig öfter verwendet wird,
weil wir uns das wiederholte Zeichnen ersparen können. Zum andern wird der Schaltplan übersichtlicher.

Die Syntax, d.h. die Art, wie wir einen Subcircuit deklarieren, ist wie folgt:

.subckt Subcircuit-Name Anschlüsse [Parameter-Deklaration]

Abgeschlossen wird der Subcircuit mit einem

.ends [Subcircuit-Name]

Die Dinge in eckigen Klammern sind optional.

Beispiel:
.subckt HP_Filter in out V+ V-

.ends

Nun denn, los geht’s. Um sich an das Erstellen eines Subcircuits zu gewöhnen, fangen wir mit etwas ganz Einfachem an, benutzen nur passive Bauteile
und machen einen Spannungsteiler aus zwei Widerständen, R1 und R2. R2 bekommt einen festen Wert von 1kOhm, R1, den oberen Widerstand, wollen wir verändern können.
Anstelle eines festen Wertes setzen wir einen Werte-Statthalter ein: Ra in geschweiften Klammern - {Ra}
Ausserdem müssen wir die Anschlüsse mit einem Label versehen: A und B für die beiden Endpunkte und C für den Mittelabgriff.

01__vdiv_schema.png

Das ist eigentlich schon alles. Fast alles. Wir sollten uns nämlich daran gewöhnen, die Schaltungen zu testen, bevor wir sie als Subcircuit fixieren,
denn später etwas zu ändern ist viel umständlicher.
Wir ergänzen den Schaltplan wie im nächsten Bild gezeigt. Für den Test müssen wir auch R1 einen Wert zuweisen. Wir machen das mit der .param Direktive.
Anschliessend starten wir eine TRAN-Analyse von 1 usec.


02__vdiv_test-schema.png


Wir lassen uns im Plotfenster die Spannung am Mittelabgriff C anzeigen. Wenn die angezeigte Spannung 5V beträgt, ist alles in Ordnung. Dann löschen wir den linken Teil wieder.
[Anmerkung: bei einem komplexen Subcircuit empfiehlt es sich, den Testschaltplan unter „...xyz test.asc“ abzuspeichern!]

Nun erstellen wir den Subcircuit: Rechtsklick – View – SPICE Netlist.

In dem sich öffnenden Fenster sehen wir diese Netzliste. Leider können wir sie nicht „direkt“ editieren, d.h. wir können zwar in diesem Fenster Text ändern oder ergänzen,
aber das Editierte nicht abspeichern. Daher in diesem Fenster erneut Rechtsklick, wählen „Edit as Independent Netlist“ und speichern diese unter dem vorgeschlagenen Namen ab.
Die nun angezeigte Netzliste können wir beliebig verändern und auch speichern.

Die erste Zeile mit dem Sternchen ist eine Kommentarzeile, die lassen wir einfach so und entfernen sie auch nicht.
Nach dieser (vor der Zeile mit R1 . . .) fügen wir eine Leerzeile ein und schreiben dort:

.subckt VDIV A B C

Die Zeile mit „.backanno“ löschen wir und die Zeile mit „.end“ ändern wir in „.ends“. Dann sollte das Ganze so aussehen:


03__vdiv_sub.png

Zum Speichern wählen wir nicht das Disketten-Icon im Toolbar! Dann würde nämlich unser Subcircuit unter „. . .cir“ abgespeichert.
Nach Rechtsklick wählen wir unten File – Save as … und dort auch nicht die Voreinstellung „Netlists …“, sondern im Drop-down „All Files“
und ändern anschliessend den Dateinamen in „vdiv.sub“.
Nachdem wir auf diese Weise den Subcircuit erschaffen haben, ist unsere nächste Aufgabe, ein Symbol dafür zu erstellen.

Wer noch nie einen Subcircuit selbst gemacht hat, für den ist das Errichten eines Symbols keine ganz leichte Aufgabe.
[Anmerkung: es gibt zwar auch die Möglichkeit, LTspice automatisch ein Symbol für einen Subcircuit erstellen zu lassen, ABER!… - ganz problemlos ist das nicht!
Erstens wird das Symbol in einem neuen Ordner „AutoGenerated“ erstellt, von dem der Neuling meist keine Ahnung hat und möglicherweise ins Schwitzen gerät
bei dem Versuch, das Symbol zu finden, und zweitens wird der Subcircuit im Symbol mit vollem Pfad eingetragen! Das wird zum Problem, wenn man andere um
Hilfe bittet, wenn die Schaltung, in der der Subcircuit verwendet wird, nicht funktioniert.]

Wir wollen daher selbst Hand anlegen und selbständig ein Symbol erzeugen, und mit der hier geleisteten Hilfestellung sollte das jedem gelingen.

Für den Neuling ist die erste Hürde: wie gross sollte das Symbol sein?
Schauen wir uns dazu einmal einige Symbole von LTspice an, welche Grösse die haben:

04__symbol_size.png

Kondensator und Diode sind zwei Einheiten breit und vier Einheiten lang, wie man anhand des Grids erkennen kann. [Grid einschalten: Rechtsklick – View – Show Grid]
Spule und Widerstand sind ebenfalls zwei Einheiten breit, aber fünf Einheiten lang. FET, Spannungsquelle und BJT wie angegeben.
Andere Gesichtspunkte, die man berücksichtigen muss, sind:
- soll Text im Symbol stehen?
- wie viel Anschlüsse hat der Subcircuit?

Da unser Spannungsteiler aus zwei Widerständen besteht, machen wir das Symbol zwei Einheiten breit, aber etwas länger, nämlich sechs.
Zeichnen wollen wir ihn wie einen europäischen Widerstand als Rechteck.

Im Hauptfenster von LTspice wählen wir File – New Symbol. Ein neues Fenster öffnet sich als Grid mit grossen Punkten und einem (feststehenden)
Fadenkreuz in der Mitte. Das Symbol sollte man in der Nähe des Fadenkreuzes erstellen.

Wir zeichnen also zuerst mal ein Rechteck, zwei Einheiten breit und vier Einheiten lang. Zum Zeichnen Rechtsklick – Draw – Rect.
Der Cursor zeigt einen Kreis mit einem Fadenkreuz. Wir gehen mit dem Fadenkreuz ziemlich genau auf einen Gridpunkt, Linksklick,
ziehen die Maus nach rechts unten, bis wir bei dem Punkt angelangt sind, wo das Rechteck zwei Einheiten breit und vier Einheiten lang ist,
Linksklick und fertig! Das sollte dann so aussehen:

05__symbol_rect.png

Als nächstes müssen wir die Anschlüsse zeichnen: Rechtsklick – Add Pin. Wir setzen den Pin mittig (in Bezug auf das Rechteck, versteht sich)
auf den Punkt im Abstand einer Einheit oberhalb des Rechtecks (vergl nächstes Bild!). Bevor wir den Pin ablegen können, müssen wir noch das Label eintragen.

Achtung! Das ist jetzt wichtig, also gut aufpassen! Der Subcircuit ist auch eine Netliste, und bei der Netliste ist die Reihenfolge der Anschlüsse nicht egal!
Das bedeutet, wir müssen im Symbol die gleiche Reihenfolge haben wie im Subcircuit angegeben!!
Wir hatten im Subcircuit die Reihenfolge A B C, also A ist #1, B ist #2 und C ist #3.
Wenn wir also bei unserem ersten Pin bei Label „A“ eintragen, so sollte daneben bei „Netlist order“ eine „1“ zu sehen sein. Ist soweit alles in Ordnung, dann OK klicken.
Damit wir später, wenn wir in einem Schaltplan das Symbol verwenden, immer noch wissen, welcher Anschluss wo ist, sollten wir ihn kennzeichnen: Rechtsklick – Draw – Text.
Im Textfenster geben wir „A“ ein, Justification lassen wir so wie es ist, nur bei „Font Size“ wählen wir die kleinste und klicken OK.
Der Text klebt am Maus-Cursor, wir bewegen ihn bis kurz unter die obere Linie des Rechtecks und setzen ihn dort per Linksklick ab. Bis hierhin sollte es dann so aussehen:

06__symbol_PIN A.png

Den Pin lassen wir aber nicht so mutterseelenallein in der Luft hängen, wir verbinden den Pin mittels einer Linie mit dem Rechteck: Rechtsklick – Draw – Line.
Wir bewegen das Fadenkreuz des Cursors auf den Gridpunkt innerhalb des PINs, Linksklick (nicht gedrückt halten), ziehen den Cursor herunter bis genau auf den Gridpunkt
in der oberen Linie des Rechtecks, Linksklick und Rechtsklick, weil wir nicht von dort aus noch eine weitere Linie zeichnen wollen.
Als nächstes erschaffen wir Pin B, einen Punkt unterhalb der unteren Linie des Rechtecks, kennzeichnen ihn (Rechtsklick – Draw – Text, Font Size nicht vergessen!)
und verbinden den Pin wieder mit dem Rechteck (Rechtsklick – Draw – Line). Das ergäbe dann folgendes Bild:

07__symbol_PIN B.png

Jetzt fehlt nur noch Anschluss C. Vielleicht habt ihr es inzwischen gemerkt, aber man kann einen Pin immer nur auf einem Gridpunkt absetzen,
nicht jedoch im Raum zwischen Gridpunkten! Wenn man also ein symmetrisches Bild erzielen möchte, muss man das berücksichtigen.


Pin C wollen wir an der rechten Seite anbringen, wieder mittig, einen Punkt von der Seitenlinie entfernt. Bei „Label“ tragen wir „C“ ein,
kennzeichnen den Pin als C und verbinden ihn per Linie mit der Seitenlinie. Das ganze Symbol sieht nun so aus:

08__symbol_PIN C.png

Als letzte Kontrolle wollen wir uns noch einmal vergewissern, dass die Pin-Zuordnung ok ist: Rechtsklick – View – Pin Table. Alles ok?
Und wenn wir eine Vorstellung davon bekommen wollen, wie unser Symbol letztlich auf dem Schaltplan ohne die störenden Ankerkreise
aussieht: Rechtsklick – View – Anchor Points.

Was fehlt jetzt noch? - Wir müssen das Symbol noch mit dem Subcircuit verbinden, so wie es ist, ist es nur eine Grafik.
Dafür gibt es eine Eigenschaftstabelle, in der wir die Zugehörigkeit des Symbols zu einem bestimmten Subcircuit eintragen.

Wir öffnen diese Tabelle mit Rechtsklick – Attributes – Edit Attributes. Es öffnet sich das Fenster des sogenannten „Symbol Attribute Editors“.

09__Symbol Attr Editor.png

Ganz oben lesen wir „Symbol Type“ mit „Block“ als Vorgabe. Der nach unten zeigende Pfeil gibt zu verstehen, dass es sich hier um eine Drop-down-Liste handelt,
wo man auch etwas anderes selektieren kann, aber dazu später.
Die Tabelle hat auf der linken Seite die Eigenschaften (attribute) und daneben die zugehörige Wertzuweisung (value). In den Reihen unterhalb von „value“ kann man
durch Doppel-Linksklick ein kleines Fenster für die Texteingabe öffnen. Die Eigenschaften (attribute) selbst kann man weder verändern noch ergänzen, sie liegen fest.

„Prefix“ ist die wichtigste Eigenschaft für das Symbol eines Bauteils. Für einen Widerstand stünde hier „R“, für einen Kondensator „C“ und für einen BJT „Q“.
Der Wert für einen Subcircuit ist „X“. Also Doppel-Linksklick und „X“ hier eingeben, aber nicht ENTER drücken oder OK klicken!
Mit dem „TAB“-Key gelangt man ohne erneuten Doppel-Linksklick zur nächsten Reihe bereit für die Eingabe. Bei „SpiceModel“ tragen wir nichts ein
und gehen gleich per TAB weiter zur nächsten Eigenschaft.
Bei „Value“ schreiben wir „vdiv“, wir TAB’en uns weiter bis „Description“. Hier ergänzen wir wichtige Zusatzinformationen wie z.B.:
„Spannungsteiler mit zwei Widerständen; unterer W. 1kOhm, oberer Wert {Ra} da Parameter frei wählbar“.
Wir wollen ja schliesslich auch nach einem Jahr noch wissen, wie wir diesen Subcircuit handhaben müssen, wenn die Erinnerung
an Einzelheiten wahrscheinlich längst aus unserem Gedächtnis verschwunden ist
. Diese Informationen sind auch für dritte Personen enorm wichtig.

Bei der Eingabe eines solchen langen Textes reicht das kleine Fenster nicht aus, man kann nicht mehr sehen, was man gerade schreibt.
Die rechte untere Ecke ist durch Punkte markiert, hier kann man mit gedrückter Maustaste das Fenster nach rechts vergrössern,
so dass man den eingegebenen Text wieder lesen kann, und auch nach der Eingabe wieder verkleinern.
TAB zur nächsten Reihe. Hier, bei „ModelFile“, tragen wir „vdiv.sub“ ein.


10__Symbol Attr Editor final.png

Als Allerletztes, bevor wir OK klicken, gehen wir nach oben zum „Symbol Type“ und wählen in der Drop-down-Liste „Cell“.
Wenn man das nicht als Letztes macht, sondern andernorts noch etwas eingibt oder korrigiert, springt das von „Cell“ wieder auf „Block“ um,
daher als wirklich letzten Schritt ausführen! Möglicherweise ist das in der neuesten Version von LTspice korrigiert,
ich selbst verwende allerdings immer noch ein älteres LTspiceXVII.
[Anmerkung: „Block“ verwendet man für hierarchische Schaltplanblöcke, eine Art Vorstufe von Subcircuits, aber dazu erkläre ich hier jetzt nichts.]

Zu guter Letzt müssen wir unser mit viel Mühe erstelltes Symbol noch speichern, wir sollten dabei sicherstellen, dass wir es im gleichen Ordner wie unseren Subcircuit speichern.
Wichtig ist hier auch, es unter dem gleichen Namen wie den des Subcircuits zu speichern!! Da unser Subcircuit „vdiv.sub“ heisst, nennen wir das Symbol „vdiv.asy“.

Das war’s. Im ersten Schritt erstellten wir den Subcircuit, im zweiten das Symbol, im dritten und letzten Schritt müssen wir Subcircuit und Symbol zusammen testen.

Auf einem leeren Schaltplan in LTspice platzieren wir eine Gleichspannungsquelle von 10V, Plus-Anschluss mit Label „v+“ versehen, Minus-Anschluss an Masse
und speichern dies in dem gleichen Ordner, wo sich unser Subcircuit befindet.
Wie fügen wir aber den Subcircuit in unseren Schaltplan ein? -- Dazu klicken wir wie gewohnt auf das Symbol im Toolbar, wo wir auch sonst Bauteile selektieren.
Die Vorgabe oben bei „Top Directory“ zeigt normalerweise auf das Symbolverzeichnis von LTspice, in dieser Drop-down-Liste wählen wir nun unser Verzeichnis,
in dem wir den Schaltplan vorhin abgespeichert haben.

11__Sel-compo.png

In dem befindet sich ja auch unser Subcircuit, und siehe da! - da ist er, der Subcircuit, selbst die Infos dazu werden angezeigt.
Wir klicken also OK und platzieren das Bauteil wo es gefällt, verbinden „A“ mit V1 +, „B“ mit Masse und heften ein Label „out“ an Pin „C“.
Wir machen wie schon zuvor eine TRAN-Simulation von 1usec und erhalten – eine Fehlermeldung: can’t find definition of model „RA“.
Richtig! Wir hatten beim oberen Widerstand R1 ja nur einen Werte-Statthalter angegeben, {Ra}.
Also benutzen wir die .param-Direktive und geben dem Widerstand einen Wert: .param Ra=1k
und starten die Simulation erneut. Ein Plot der Spannung v(out) zeigt wie erwartet 5V.

Was aber, wenn wir auf dem Hauptschaltplan schon einen Widerstand mit Werte-Statthalter {Ra} haben?? -- Logischerweise kann LTspice
nicht anders handeln als für beide Instanzen den gleichen Wert zu benutzen.
Für diesen Test fügen wir eine weitere Gleichspannungsquelle von 4V und einen Widerstand ein, bei dem wir den gleichen Werte-Statthalter {Ra} einsetzen.
Die Schaltung speichern wir unter „vdiv test2.asc“ ab und machen dann wie zuvor eine TRAN-Analyse von 1usec.

12__vdiv_test2-schema.png

Wie zu erwarten beträgt die Ausgangsspannung 5V und durch den Widerstand R1 im Hauptschaltplan fliesst ein Strom von 4mA.

Abhilfe schaffen kann man auf zweierlei Weise: erstens kann man dem Widerstand R1 im Hauptschaltplan einen anderen Statthalter zuweisen,
z.B. {RaH} oder {Rx}. Man kann aber auch die Gültigkeit von {Ra} im Subcircuit durch eine Ergänzung im Symbol einschränken.
Durch Rechtsklick auf das Symbol des Subcircuits öffnet sich nämlich eine leicht geänderte Form des schon bekannten „Symbol Attribute Editors“,
ohne dass das Symbol selbst geöffnet werden müsste, nämlich der „Component Attribute Editor“.

13__Component Attr Editor.png


Für uns interessant sind die letzten vier Zeilen: Value, Value2, SpiceLine und SpiceLine2. Ihr alleiniger Zweck ist es,
den darunter liegenden Subcircuit mit (veränderlichen) Parametern zu versorgen.

Beim Attribut „Value“ ist schon unser Subcircuit namentlich eingetragen, auch dort könnte man ergänzend „Ra=1k“ anhängen.

Diese Zeile sollte man jedoch möglichst vermeiden. Warum?
Es könnte sein, dass man beim Eintragen eines Parameters unabsichtlich den Namen unseres Subcircuits löscht!
Und auf dem Fusse folgt der Alptraum eines jeden Subcircuit-Neulings, denn beim nächsten Start erfolgt die Fehlermeldung:
„Unknown subcircuit called in …“ und resultiert oft in eine fruchtlose Fehlersuche: Subcircuit ist da, Symbol auch – warum funktioniert das verflixte Ding nicht!!
Man möchte sich dann wie Rumpelstilzchen die Haare raufen…
Jetzt, wo dieses Wissen noch frisch ist, sollte man das gleich mal ausprobieren und bei "Value" den Text "vdiv" löschen - ausführen - wieder eintragen und testen, ob wieder alles ok ist!

Also lassen wir diese Zeile in Ruhe, nehmen stattdessen „Value2“ und ergänzen dort: Ra=4k, 4k deshalb, um einen Unterschied zum Ra =1k des Hauptschaltplans zu haben.

Die erneute Simulation zeigt: die Ausgangsspannung beträgt jetzt wie zu erwarten war 2V, der Strom durch R1 ist unverändert 4mA.
Damit hätten wir auch dieses Problem gelöst und zugleich etwas über den Gültigkeitsbereich (scope) von Subcircuitsvariablen gelernt.
_____ _____ _____

So, zum ersten Mal einen Subcircuit geschafft! Auf Japanisch würde man hier jetzt お疲れさま (o-tsukare-sama) sagen, was soviel heisst wie „danke, dass Sie bis hierhin durchgehalten haben“.

RudiS
P.S.: Wer Fragen hat, sollte sich nicht scheuen zu fragen!
 

Anhänge

  • Crashkurs X.pdf
    219,7 KB · Aufrufe: 1
  • Crashkurs X.zip
    343 KB · Aufrufe: 1
Zuletzt bearbeitet:

Benutzer welche diesen Thread betrachten (Mitglieder: 0, Gäste: 1)

Wer hat diesen Thread gelesen

Zurück
Oben