Forum: Analoge Elektronik und Schaltungstechnik Worst Case Simulation mit LTSPICE


von Sascha K. (shkraft)



Lesenswert?

Hallo zusammen,

schon seit längerem hatte ich mir vorgenommen mit LTSPICE eine MC und WC 
auszuprobieren anhand eines Beispiels aus dem Buch PSPICE von Robert 
Heinemann. Mit dem Beispiel eines aktiven Bandfilters wollte ich die 
Ergebnisse vergleichen, so dass ich sicher sein konnte die Funktionen im 
LTSPICE korrekt umgesetzt zu haben.

Mit LT ist eine MC Analyse nicht das Problem, aber die WC Analyse 
hingegen schon. Ich habe mal gegoogelt und folgendes dazu gefunden:

http://k6jca.blogspot.de/2012/07/monte-carlo-and-worst-case-circuit.html

Die Aufteilung der WC Funktion für R und C sieht auf den ersten Blick 
ganz plausibel aus und habe es direkt umgesetzt.

PSPICE Berechnung WC Analyse:
WC High = 1.41V @ 10kHz (siehe Bild: PSPICE WC H)
WC Low = 651.4mV @ 10kHz (siehe Bild: PSPICE WC L)

LTSPICE Berechnung WC Analyse: 1.Variante (Schaltung ist angehängt)
WC High = 1.33V @ 10kHz
WC Low = 728.79mV @ 10kHz

Differenz der Simualtionsergebnisse:
dHigh = 80mV
dLow = 77mV

Irgendwie bin ich mit dieser Differenz nicht ganz so zufrieden und habe 
eine 2.Variante erzeugt. Ein anderer User hat folgende Lösung dazu 
gehabt:

.function binary_digit(x,powerOfTwo) 
floor(x/(2**powerOfTwo))-2*floor(x/(2**(powerOfTwo+1)))

.function wc(nom,tol,powerOfTwo) if(run==y, nom, 
if(binary_digit(run,powerOfTwo),nom*(1+tol),nom*(1-tol)))

Die Erklärung seiner Lösung zu diesem Problem klingt sehr einleuchtend, 
also direkt Copy/Paste und zu diesem Ergebnis gekommen.

LTSPICE Berechnung WC Analyse: 2.Variante (Schaltung ist angehängt)
WC High = 1.452V @ 10kHz (siehe Bild: LTSPICE_WC_H_L)
WC Low = 652.94mV @ 10kHz (siehe Bild: LTSPICE_WC_H_L)

Differenz der Simualtionsergebnisse:
dHigh = 40mV
dLow = 1.5mV

Dieses Abweichung ist im vergleich zur 1. Variante eine deutlicher 
Verbesserung nur habe ich folgende Fragen dazu:

1.-Frage:
Was genau entspricht das Argument x in der Fkt. binary_digit? Dies ist 
mir noch nicht so ganz klar. Das zweite Argument hingegen schon.

2.-Frage:
Wie wird bei dieser Lösung die verschiedenen Toleranzen beider 
Bauelemente berücksichtigt?

Ich bedanke mich schon einmal bei allen die sich die Zeit genommen haben 
meinen Beitrag durchzulesen. Ich hoffe er war nicht allzu lang.
Link für µA741 Modell:

http://www.ti.com/product/ua741

Danke
Grüße
Sascha

: Verschoben durch Moderator
von Helmut S. (helmuts)


Angehängte Dateien:

Lesenswert?

Hallo,
die in LTspice von mir selbst definierte Funktion wc(..) funktioniert 
hervorragend.

.step param n 0 40 1

.function wc(nom,tol) if(n==0, nom, 
if(flat(0.5)>0,nom*(1+tol),nom*(1-tol)))


Die Ergebnisse sind wahrscheinlich deshalb unterschiedlich weil

1. Bei den vielen Bauteilen muss man mehr als 10 Simulationen machen.

2. In PSPICE hast du wahrscheinlich nicht das Modell von TI's Webseite 
verwendet.


Unabhängig davon ist dein UA741 Opamp zu langsam für einen 10kHz 
Bandpass hoher Güte. Dadurch macht sich auch die Last mit 1kOhm in der 
Verstärkung schon stark bemerkbar. Ich habe deshalb 10kOhm gewählt.
Schau dir mal die Verschiebung des Frequenzganges bei Opamps mit 10MHz 
und 100MHZ GBW an.

Hänge dein UA741 Modell das du in PSPICE verwendest hast an deine 
nächste Nachricht.

Gruß
Helmut

von F. F. (foldi)


Lesenswert?

Hallo ihr "Spicies"!

Mittlerweile finde ich Ltspiche doch nicht so übel, aber um es wirklich 
zu benutzen (und vor allem zu lernen) müsste ich noch etwas wissen.
Kann man Schaltpläne in LtSpice übernehmen oder dort erstellte 
Schaltungen in  einem Layout Programm übernehmen?
Für mich würde es nur Sinn machen, wenn ich das nicht mehrmals machen 
muss.
Dafür hab ich einfach zu wenig Zeit.

von Helmut S. (helmuts)


Lesenswert?

Hallo,
Ein Schaltplan für ein Layoutprogramm hat ganz andere Anforderungen an 
die Symbole als SPICE. Deshalb macht für mich ein Export von LTspice zu 
einem richtigen Layoutprogramm keinen Sinn.

Umgekehrt habe ich im Schaltplan für das Layoutprogramm Bauteile die in 
der Simulation stören, z. B. 0Ohm Widerstände um eine Schaltung zu 
umgehen die aber nicht bestückt werden. Außerdem haben Layout-Symbole 
keine Modellnamen für ein SPICE-Modell hinterlegt.

Deshalb meinen Empfehlung. Zeichne die Schaltung für die Simulation 
extra in LTspice. Das Zeichnen geht dort wirklich schnell.

Gruß
Helmut

PS: Es gibt wohl für EAGLE ein Copy/Paste zu LTspice (ULP?).

von Sascha K. (shkraft)


Lesenswert?

Hallo Helmut,

also ...

Punkt 1:
... die in LTspice von mir selbst definierte Funktion wc(..) 
funktioniert
hervorragend.

.step param n 0 40 1

.function wc(nom,tol) if(n==0, nom,
if(flat(0.5)>0,nom*(1+tol),nom*(1-tol)))

Kommentar:
Ist vom Grundsatz so aufgebaut wie eine MC Analyse und mittlerweile habe 
ich auch verstanden, dass ich die WC Fkt. nicht aufteilen muss nach R 
und C, weil er sich diese Variable aus der Deklaration herausholt. Das 
kam mir etwas später.

Punkt 2:
...Die Ergebnisse sind wahrscheinlich deshalb unterschiedlich weil

1. Bei den vielen Bauteilen muss man mehr als 10 Simulationen machen.

2. In PSPICE hast du wahrscheinlich nicht das Modell von TI's Webseite
verwendet.

Kommentar:
Das ich mehr als 10 Durchläufe machen muss, ist mir bewußt. Nur kann ich 
nicht nachvollziehen wie LT jedes Bauelement gegeneinander in Bezug 
stellt!
Daher kam mir die Funktion:
.function binary_digit(x,powerOfTwo)
floor(x/(2**powerOfTwo))-2*floor(x/(2**(powerOfTwo+1)))
als gangbare Lösung um dieses Problematik anzugehen, weil es ja 2^11 
Möglichkeiten gibt die Bauelemente gegeneinander in Bezug zu stellen 
oder sehe ich das nicht richtig?

Ja, ich habe das Modell von TI heruntergeladen und nicht die PSPICE 
Bibliothek eingebunden. Ich werde das PSPICE Modell noch anhängen.

Punkt 3:
Unabhängig davon ist dein UA741 Opamp zu langsam für einen 10kHz
Bandpass hoher Güte. Dadurch macht sich auch die Last mit 1kOhm in der
Verstärkung schon stark bemerkbar. Ich habe deshalb 10kOhm gewählt.
Schau dir mal die Verschiebung des Frequenzganges bei Opamps mit 10MHz
und 100MHZ GBW an.

Kommentar:
Das werde ich in Ruhe heute Abend prüfen. Wie gesagt, ich wollte mir 
eine Brücke schlagen zwischen PSPICE und LT um die Realisierung mit LT 
besser zu verstehen. Bis später...

Grüße
Sascha

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Schau mal nach dem Zeichen ">" ;-)

von Wilhelm F. (Gast)


Lesenswert?

Frank Frank schrieb:

> Kann man Schaltpläne in LtSpice übernehmen oder dort erstellte
> Schaltungen in  einem Layout Programm übernehmen?

Gute Frage!

Seit einiger Zeit überlege ich eher, wie man Dateien zwischen zwei 
SPICE-Programmen austauschen kann, bzw. ob das überhaupt geht.

Denn ich lernte auf PSPICE, und kam durch das Forum auch mal auf 
LTspice. Ich arbeite gelegentlich parallel mit beiden. Der Kern beider 
ist wohl der selbe, die Oberfläche nicht.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Nein, das Format der ASC-Dateien von LTspice ist allerdings durchdacht 
und leicht modifizierbar. Im Gegensatz zu anderen Ergüssen der 
Programmierer-Herrgötter kann man da auch drin suchen mit einem externen 
Programm!

LTspice bietet doch diverse Export-Formate für Netzlisten! Übersehen?

von Sascha K. (shkraft)


Angehängte Dateien:

Lesenswert?

> Hänge dein UA741 Modell das du in PSPICE verwendest hast an deine
> nächste Nachricht.

Hallo Helmut,

eigentlich hast Du dieses Modell bereits schon!
Eine Frage noch:
Nach welchen Kriterien wird das Argument in der flat Fkt. gewählt?
Danke

Gruß
Sascha

von Helmut S. (helmuts)


Angehängte Dateien:

Lesenswert?

>Nach welchen Kriterien wird das Argument in der flat Fkt. gewählt?

Ehrlich gesagt ich hatte es vergessen.

Hab gerade schnell ein einfaches Beispiel gemacht.

Ergebnis:

1. flat(n) erzeugt Zufallswerte zwischen -n und +n

2. Der erste Wert ist übrigens immer -n. Allerdings kann man das 
abstellen indem man das Häkchen setzt für
Control Panel -> Hacks -> Use the clock to reseed the MC generator

von Peter K. (peter_ph)


Angehängte Dateien:

Lesenswert?

Hallo liebe Mitglieder von mikrocontroller.net.

Das Thema ist zwar schon etwas älter, doch habe ich eine kurze Frage 
ausgerechnet zu dem obigen Beispiel der Worst-Case-Analyse.

Die Vorgehensweise wird hier:
http://k6jca.blogspot.de/2012/07/monte-carlo-and-worst-case-circuit.html
sehr deutlich erklärt, doch sobald ich die simutation nachbilde, taucht 
bei mir ständig eine Errormeldung auf:

***
Can't find definition of model "WC_A"
Select OK to continue the simulation with the default model or Cancel to 
quit now.
***

Also pro definierten "run" konnt diese Meldung 4 Mal, wenn ich jeweils 
auf ok klicke. (Klar, bei 4 Bauteilen)

Anschließend taucht folgender SPICE Error Log auf:
1
Questionable use of curly braces in "c1 n002 n001 {wc_b(10u,tol_b)}"
2
    Error: garbage at end of expression in: "(if(run==1,(10u),if(flat(1)>0,(10u)*(1+tol_b),(10u)(1-tol_b)[))])"
3
Questionable use of curly braces in "c2 0 out {wc_b(1u,tol_b)}"
4
    Error: garbage at end of expression in: "(if(run==1,(1u),if(flat(1)>0,(1u)*(1+tol_b),(1u)(1-tol_b)[))])"
5
Questionable use of curly braces in "r1 out 0 {wc_a(10k,tol_a)}"
6
    Error: garbage at end of expression in: "(if(run==1,(10k),if(flat(1)>0,(10k)*(1+tol_a),(10k)(1-tol_a)[))])"
7
Questionable use of curly braces in "r2 n002 out {wc_a(10k,tol_a)}"
8
    Error: garbage at end of expression in: "(if(run==1,(10k),if(flat(1)>0,(10k)*(1+tol_a),(10k)(1-tol_a)[))])"
9
Circuit: * C:\Users\wadim.schatz.UNITY-GRUPPE\Desktop\Dokumente\LTSpice\Schaltungen\Worst_Case.asc
10
11
Error on line 2 : c1 n002 n001 (wc_b(10u,tol_b))
12
   Unable to find definition of model "wc_b"
13
  
14
  *  Unknown parameter "tol_b"
15
Error on line 3 : c2 0 out (wc_b(1u,tol_b))
16
   Unable to find definition of model "wc_b"
17
  
18
  *  Unknown parameter "tol_b"
19
Error on line 4 : r1 out 0 (wc_a(10k,tol_a))
20
   Unable to find definition of model "wc_a"
21
  
22
  *  Unknown parameter "tol_a"
23
Error on line 5 : r2 n002 out (wc_a(10k,tol_a))
24
   Unable to find definition of model "wc_a"
25
  
26
  *  Unknown parameter "tol_a"
27
.step run=1
28
.step run=2
29
.step run=3
30
.step run=4
31
.step run=5
32
33
Date: Wed Nov 27 09:29:35 2013
34
Total elapsed time: 4.030 seconds.
35
36
tnom = 27
37
temp = 27
38
method = trap
39
totiter = 0
40
traniter = 0
41
tranpoints = 0
42
accept = 0
43
rejected = 0
44
matrix size = 4
45
fillins = 0
46
solver = Normal

(Ich habe in dem Fall die anzahl der runs auf 5 herabgesetzt, ist bei 40 
runs aber genau so.)

Ich nehme an, das Problem ist:
Unknown parameter "tol_a"
bzw.
Unknown parameter "tol_b"

Und was ich nun nicht verstehe: Parameter tol_a und tol_b habe ich doch 
definiert.

Ich weiß, dass ich da etwas falsch mache. Hat nur jemand eine Idee, was 
es ist?

Sorry, falls das nicht perfekt formatiert ist, ich bin recht neu hier 
und muss mich an vieles gewöhnen.

Danke

von Peter K. (peter_ph)


Lesenswert?

Oh, sorry für das Doppelbild, hab da schon was falsch gemacht, beide 
sind völlig identisch.

von Peter K. (peter_ph)


Angehängte Dateien:

Lesenswert?

Achso, falls Jemand das kurz antesten möchte:
hier ist die Schaltung.

von Helmut S. (helmuts)


Lesenswert?

Beachte das nom*( statt nom( am Ende der Zeilen.

.function wc_a(nom, tol_a) if(run==1, nom, 
if(flat(1)>0,nom*(1+tol_a),nom*(1-tol_a)))

.function wc_b(nom, tol_b) if(run==1, nom, 
if(flat(1)>0,nom*(1+tol_b),nom*(1-tol_b)))

Achtung, eventuell ist in der Anzeige im Browser ein Zeilenumbruch. der 
gehört natürlich nicht da rein.



Nachtrag:
Ich hatte in einem meiner eigenen Beispiele flat(0.5)>0

.function wc(nom,tol) if(run==0, nom, 
if(flat(0.5)>0,nom*(1+tol),nom*(1-tol)))

: Bearbeitet durch User
von Peter K. (peter_ph)


Lesenswert?

Ja, tatsächlich.

Danke Helmut für deine Zeit.

Tatsächlich: Abschreib-Fehler. Peinlich, aber wenn man stundenlang das 
gleiche Problem anstarrt, dann verliert man echt den Blick fürs Detail.
Jetzt läufts, als hätte es das schon immer getan.


flat(x) heißt ja nur, dass da eine Zufallszahl zwischen -x und +x 
generiert wird.

Ich blicke da noch nicht so ganz durch, aber so wie ich das verstehe, 
fließt es nicht in die Berechnung mit ein.
Und ich habe gerade mit
flat(0.5)>0
flat(1)>0 und
flat(0.1)>0

das ganze durchgespielt. Und ich kann beim besten Willen keinen 
Unterschied erkennen.

von Helmut S. (helmuts)


Lesenswert?

Hallo Peter,
hier mal ein paar Erklärungen. Ich glaube das steht nirgends in der 
Doku.


mc(val, tol) is a function that uses a random number generator
                     to return a value between val-tol*val and 
val+tol*val

flat(x): a function that uses a random number generator
         to return a value between -x and x;

gauss(x): a function that uses a random number generator
          to return a value with a Gaussian distribution
          and sigma x.

Gruß
Helmut

von Dieter P. (low_pow)


Angehängte Dateien:

Lesenswert?

>Autor: F. Fo (foldi)
>Datum: 24.03.2013 23:21
>Kann man Schaltpläne in LtSpice übernehmen oder dort erstellte
>Schaltungen in  einem Layout Programm übernehmen?

Mit Eagle ab 6.4 soll es in beide Richtungen gehen, auch mit
der limitierten Freewareversion.

http://www.cadsoft.de/

Schaltbild von LTSpice in Eagle,
oder Schaltbild aus Eagle in LTSpice.
Es gibt sicher dabei Grenzen, hab das auch nicht weiter probiert.
Eine LTSpice-Schaltung mit dem Oldie 2N3055 hatte unter Eagle
einen Wechsel des Gehäuses zur Folge, in SMD.
Wenn ich es richtig sehe, ist unter LTSpice das Gehäuse
nicht mit angegeben.

von Helmut S. (helmuts)


Lesenswert?

@Dieter P.
Da hättest du aber besser ein neues Thema gestartet. In diesem "thread" 
geht es um "worst case" Analyse.

von Peter K. (peter_ph)


Lesenswert?

Helmut S. schrieb:
> Hallo Peter,
> hier mal ein paar Erklärungen. Ich glaube das steht nirgends in der
> Doku.
>
>
> mc(val, tol) is a function that uses a random number generator
>                      to return a value between val-tol*val and
> val+tol*val
>
> flat(x): a function that uses a random number generator
>          to return a value between -x and x;
>
> gauss(x): a function that uses a random number generator
>           to return a value with a Gaussian distribution
>           and sigma x.
>
> Gruß
> Helmut

Hallo Helmut,

in dem offiziellen Gettin Started Guide steht es wirklich nicht, aber 
man findet es z.B. in der Help-Funktion unter dem Artikel .param


Aber jetzt nochmal zu meinem Beispiel:

.function wc_a(nom, tol_a) if(run==1, nom, 
if(flat(1)>0,nom*(1+tol_a),nom*(1-tol_a)))

Ich versuche gerade herauszufinden, welchen Sinn die flat-Funktion darin 
erfüllt?

Wenn das Ergebnis der Flat-Funktion, also der Zufallswert zwischen -1 
und 1 positiv ist, dann ist die Anweisung ja gültig. Aber der 
darausfolgende Zufallswert selbst spielt ja absolut keine Rolle für die 
Berechnung.
Ehrlich gesagt, verstehe ich nicht ganz, welche Rolle er dafür überhaupt 
spielt.
Den Rest verstehe ich hoffentlich klar: mit "nom*(1+/-tol_a)" werden die 
maximal und minimal mögliche Werte für die Bauteile abgearbeitet.

von Helmut S. (helmuts)


Lesenswert?

Mal ist flat(1) zufällig größer 0 und mal ist es kleienr 0 und 
entsprechend setze ich den Wert auf +tol oder -tol. Das mache ich mit 
jedem Bauteil. Dadurch bekomme ich zufällig verschiedene Kombinationen 
der Bauteile mit maximal positiver und maximaler negativer Toleranz. Man 
bekommt da mit viel weniger Versuchen als mit mc() auf die schlimmste 
Kombination.

von Peter K. (peter_ph)


Lesenswert?

Danke, so ist es verständlich :)
Dann machts ja auch keinen großen unterschied, ob
flat(0.5)>0 oder flat(1)>0

Das Ergebnis ist letztendlich das Gleiche: hauptsache es ist ein 
zufallsgesteuerter negativer oder positiver Wert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.