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
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
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.
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?).
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
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.
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?
> 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
>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
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
Oh, sorry für das Doppelbild, hab da schon was falsch gemacht, beide sind völlig identisch.
Achso, falls Jemand das kurz antesten möchte: hier ist die Schaltung.
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
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.
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
>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.
@Dieter P. Da hättest du aber besser ein neues Thema gestartet. In diesem "thread" geht es um "worst case" Analyse.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.