Howto Messen in LTspice für Anfänger Teil 3 -- Rechteck 2: CMOS timing parameters

RudiS

Absoluter Profi
Member
Landesflagge
In diesem dritten Teil zum "Messen in LTspice für Anfänger" beschäftigen wir uns noch einmal
mit Rechtecksignalen, diesmal jedoch konkret auf CMOS Logikgatter bezogen.

Um die Problematik vorab ein wenig zu klären, betrachten wir zuerst ein Timing Diagramm
aus einem Motorola-Katalog von 1988 zu dem NOR-Gate CD4001.
[Zum Vergrössern des Screenshots auf das Bild klicken!]


00__CMOS-timing plot MOT_1988.png

Im oberen Teil des Diagramms sehen wir das Eingangssignal,
im unteren Teil das Signal, wie es aus dem CMOS-Gatter herauskommt.

Zunächst jedoch das Eingangssignal. Es ist eine Konvention und ein Standard,
dass man für die Anstiegs- und Abfallzeit die Werte von 10% und 90% der Ausgangsspannung zugrunde legt.

Warum macht man das, warum nimmt man nicht 0% und 100%, wie wir das im vorigen Teil
bei der Rechteckschwingung gemacht haben? Durch kapazitive und/oder induktive Belastung
können an den Ecken Verformungen auftreten, die zu einer Verfälschung des Messergebnisses führten,
würde man von 0 bis 100% messen, auch seien hier Overshoot und Ringing genannt.

Was sagt uns das Diagramm noch über das Eingangssignal? Nun, es ist ein positives Signal von low nach high,
das als Inverter beschaltete Gatter macht es zu einem negativen Signal, also von high nach low.
Die Anstiegs- und Abfallzeit des Eingangssignals hat Motorola auf 20ns festgelegt,
wir folgen dem, indem wir diesen Wert übernehmen.

Weiterhin haben wir in der Abbildung vier Abkürzungen: tPHL, tPLH, tTHL und tTLH.
Das kleine "t" steht für time, Zeit, das grosse T für transition, das grosse P für propagation (delay).
HL ist richtungsweisend von high nach low, LH ist die Richtung von low nach high.
Propagation delay ist die Laufzeitverzögerung, d.h. die Zeit, die das Signal vom Eingang des Gatters bis zu seinem Ausgang braucht.
Transition time ist die Übergangszeit, d.h. die Zeit, die das Gatter braucht,
um vom High-Zustand nach low oder umgekehrt vom Low-Zustand nach high zu wechseln.

Um ein CMOS-Gatter zu beurteilen, muss man also diese vier Parameter messen.
Wo und wie man die misst, geht auch aus dem Diagramm hervor.

- tPHL misst man vom Zeitpunkt "50% der ansteigenden Flanke des Eingangssignals" bis zum Zeitpunkt "50% der abfallenden Flanke des Ausgangssignals".
- tPLH misst man von "50% der abfallenden Flanke des Eingangssignals" bis "50% der ansteigenden Flanke des Ausgangssignals".
- tTHL misst man in der abfallenden Flanke des Ausgangssignals von 90% bis 10%.
- tTLH in der ansteigenden Flanke, ebenfalls von 10% bis 90%.

Soweit dieser Vorspann.
Hier ist der Schaltplan:

01__CMOS_tpd_schema.png
Das Eingangssignal liefert uns eine Spannungsquelle, die einen Rechteckpuls generiert.
Wir haben eine kleine Zeitverzögerung vorgeschaltet, dadurch ist der Beginn des Signals ein wenig besser zu erkennen.
Anstiegs- und Abfallzeit beträgt wie schon gesagt 20ns, Einschaltzeit Ton ist 200ns.
Ein als Inverter beschaltetes NOR-Gatter leitet den Impuls weiter.
Am Ausgang des Gatters befindet sich ein Widerstand von 10kOhm,
parallel dazu ein Kondensator von 22pF, beide gehen nach Masse.

Sehen wir uns nun den zugehörigen Plot an:
02__CMOS_tpd_Plot.png

In diesem Plot sind wieder die für unsere Messungen notwendigen Zeitpunkte mit Grossbuchstaben gekennzeichnet,
auf die Markierungen "TRIG(ger)" und "TARG(et)" gehe ich später ein.

Wir sehen schon jetzt, dass das Ausgangssignal weniger steile Flanken aufweist,
ausserdem sind die Ecken durch die kapazitive Belastung verrundet und nicht so eckig wie beim Eingangssignal.

Für die Messungen müssen wir zuerst einige Referenzspannungen messen, vmax der Eingangs- und Ausgangsspannung,
50% des Eingangs- wie auch des Ausgangssignals (Punkte A und C sowie B und D),
10% und 90% des Ausgangssignals (Punkte E und F bzw. E' und F').
Da die Spannungen bei E und E' jedoch identische Spannungen sind (gleiches gilt für F und F'), messen wir nur einmal E und F.

.meas TRAN vi_max MAX v(in)
.meas TRAN vo_max MAX v(out)
.meas TRAN vi_50pc param vi_max*0.5 ;50%
.meas TRAN vo_50pc param vo_max*0.5 ;50%
.meas TRAN vo_90pc param vo_max*0.9 ;90%
.meas TRAN vo_10pc param vo_max*0.1 ;10%

Hier die Ergebnisse:
vi_max: MAX(v(in))=5 FROM 0 TO 6e-007
vo_max: MAX(v(out))=4.7619 FROM 0 TO 6e-007
vi_50pc: vi_max*0.5=2.5
vo_50pc: vo_max*0.5=2.38095
vo_90pc: vo_max*0.9=4.28571
vo_10pc: vo_max*0.1=0.47619


Wie man schon vom Plot her sehen konnte, liegt die Ausgangsspannung des Gatters
etwas unterhalb der Eingangsspannung von 5 Volt, daher liegt der Mittelwert nicht bei 2.5 Volt, sondern bei 2.38 Volt.

Anhand der nun vorhandenen Referenzspannungen können wir jetzt die Zeitpunkte messen.

.meas TRAN t_A find time when v(in)=vi_50pc rise=1 ;ansteigende Flanke
.meas TRAN t_B find time when v(out)=vo_50pc fall=1 ;abfallende Flanke
.meas TRAN t_C find time when v(in)=vi_50pc fall=1
.meas TRAN t_D find time when v(out)=vo_50pc rise= 1

.meas TRAN tPHL param t_B - t_A
.meas TRAN tPHL.ns param tPHL*1e9 ;Anzeige in ns
.meas TRAN tPLH param t_D - t_C
.meas TRAN tPLH.ns param tPLH*1e9 ;Anzeige in ns

Die Ergebnisse für diese Messungen sind:
t_a: time=1.1e-007 at 1.1e-007
t_b: time=2.47991e-007 at 2.47991e-007
t_c: time=3.3e-007 at 3.3e-007
t_d: time=4.68484e-007 at 4.68484e-007
tphl: t_b - t_a=1.37991e-007
tphl.ns: tphl*1e9=137.991
tplh: t_d - t_c=1.38484e-007
tplh.ns: tplh*1e9=138.484


Somit ist die Propagation delay time von high nach low ca. 138ns, die von low nach high eine Idee länger, nämlich 138.5ns.

Für die Transition time müssen wir ebenfalls vier Zeitpunkte messen, nämlich E und F sowie E' und F',
alle auf die Ausgangsspannung bezogen. Da LTspice mit E' und F' (Apostroph) nicht operiert,
nennen wir stattdessen die Zeitpunkte E2 und F2.

tTHL bezieht sich auf die abfallende Flanke, tTLH auf die ansteigende.
Beim Formulieren der Messanweisungen muss man daher achtgeben, dass man sich nicht mit "rise" und "fall" vertut!

.meas TRAN t_E find time when v(out)=vo_90pc fall=1
.meas TRAN t_F find time when v(out)=vo_10pc fall=1
.meas TRAN t_F2 find time when v(out)=vo_10pc rise=1
.meas TRAN t_E2 find time when v(out)=vo_90pc rise=1


Die Differenz zwischen t_E und t_F beträgt 90% - 10%, also 80%.
Um auf 100% zu kommen, dividieren wir das Ergebnis durch 8 und multiplizieren mit 10.

.meas TRAN tTHL param (t_F - t_E)/8*10
.meas TRAN tTHL.ns param tTHL*1e9
.meas TRAN tTLH param (t_E2 - t_F2)/8*10
.meas TRAN tTLH.ns param tTLH*1e9

Die Ergebnisse lauten:
t_e: time=2.1385e-007 at 2.1385e-007
t_f: time=2.80984e-007 at 2.80984e-007
t_f2: time=4.34345e-007 at 4.34345e-007
t_e2: time=5.01477e-007 at 5.01477e-007
tthl: (t_f - t_e)/8*10=8.39181e-008
tthl.ns: tthl*1e9=83.9181
ttlh: (t_e2 - t_f2)/8*10=8.39156e-008
ttlh.ns: ttlh*1e9=83.9156


Die Transition time von high nach low beträgt demnach rund 84ns, die von low nach high ebenso viel.
Damit hätten wir eigentlich die vier CMOS timing Parameter gemessen.

-- -- --

Manch einer wird sich über die Markierungen TRIG und TARG im Plot gewundert haben, und das nicht ohne Grund.

Im ".measure Statement Editor" stolpert man dauernd darüber, aber die Erklärung in der Hilfe ist nicht sonderlich hilfreich.
Der Hilfe grösstes Manko ist, dass für die (Wort-)Beispiele zur .measure-Anweisung kein Schaltplan vorhanden ist,
den man in LTspice laden und mit dessen Ausführung man die in den Beispielen angegebenen Werte nachverfolgen kann.
Dennoch, vielerorts wird immer wieder darauf hingewiesen, die Hilfe-Datei gründlich zu studieren, und ich kann dem nur zustimmen.

Es gibt im ".measure Statement Editor" bei "Genre" dieses "(interval)", wo ich mich immer gewundert habe,
warum das Ding in Klammern steht. Soll man das etwa nicht benutzen?
Und wenn nein, warum ist es dann überhaupt da?

Tatsächlich aber kann man mit "(interval)" und "TRIG" und "TARG" viel eleganter die Zeitdifferenz messen,
als wir das oben gemacht haben, der Nachteil dieser Methode: sie ist sehr schwer zu "debuggen".
Warum? Wenn man diese falsch handhabt, erscheint ohne Angabe eines Grundes nur die Meldung "xxx.... failed.",
und gerade ein Neuling weiss dann oft nicht weiter.

Warum steht "(interval)" in Klammern?
In der LTspice-Hilfe findet sich ein Satz, über den man, wenn man nicht achtsam ist, schnell hinwegliest:

"If no measurement operation is specified, the result of the .MEAS statement is the
distance along the abscissa between the TRIG and TARG points."


"(interval)
" ist gerade dieses "keine Messdirektive angeführt" im Gegensatz zu z.B. MAX oder AVG,
die ja explizit in der .meas-Direktive auftauchen.

Wie sähe denn nun der Befehl aus? Zuerst mal umgangssprachlich:
Messe das Intervall vom Startzeitpunkt A (TRIG, trigger) bis zum Zielzeitpunkt B (TARG, target).
In LTspice-Speak:

.meas tPHL_2 [interval] TRIG v(in)=vi_50pc rise=1 TARG v(out)=vo_50pc fall=1
.meas tPHL_2.ns param tPHL_2*1e9

Das farblich in Rot hervorgehobene [interval] dient mir hier nur zur Verdeutlichung und wird NICHT geschrieben!!
Das Resultat in der log-Datei zeigt einen identischen Wert, verglichen mit dem weiter oben gemessenen,
die Differenz wird bei (interval) automatisch gebildet:

tphl_2=1.37991e-007 FROM 1.1e-007 TO 2.47991e-007
tphl_2.ns: tphl_2*1e9=137.991


Wer Lust hat, kann ja die anderen, oben gemachten Berechnungen mit dieser Methode wiederholen.
Diese Beschreibung (PDF) zum Nachlesen, Screenshots und Simulationsdateien befinden sich im Archiv.

--
RudiS

P.S.: Ich hatte eigentlich noch weitere Folgen geplant, aber allem Anschein nach ist das Thema weniger interessant.
Es gibt auch wie so oft kaum eine Rückmeldung, so dass ich mir die Mühe wohl ersparen kann.
 

Anhänge

  • MfA_03.zip
    187 KB · Aufrufe: 3
Zuletzt bearbeitet:

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

Wer hat diesen Thread gelesen

Zurück
Oben