Hallo, ich versuche zur Zeit das IGBT-Modell von Peter Lauritzen http://www.ee.washington.edu/research/pemodels/modtext/igbt-pt.html in LTSpice zum Laufen zu bringen. Man kann das Modell in Saber- oder Verilog-A-HDL öffentlich herunterladen und das habe ich versucht in SPICE zu übersetzen. Beim Testen der Übersetzung als *.cir bringt LTSpice die Fehlermeldung: "--grammatical error--" gefolgt von mehreren Zeilen mit Funktionen in der Art : "((-(((if(bq()*bq()>cqm()*1.0e2,2 ... "usw. Ablauf: Drücken auf Run -> "Reducing parameter expressions" -> "Substituting parameters(line 0) ... bis teilweise (line 5) -> Ausgabe des Fehlers Mein Eindruck: Beim Anschauen des angegebenen Fehlers und der enthaltenen Funktionen bleibt LTSpice bei .FUNC iA() {...} stecken. Alle Unterfunktionen in iA() werden korrekt eingesetzt bis zu dem Punkt wo eine Unterfunktion wieder iA() selbst aufruft, quasi eine Funktionen-Schleife. Kann SPICE überhaupt mit solchen Formulierungen umgehen bzw. kann man es so schreiben/programmieren dass SPICE damit klarkommt? Vielleicht würde eine Startwert-Vorgabe wie iA() = 0 helfen, aber ich weiß nicht wie ich diese implementieren sollte. Ich wäre für jeden Hinweis dankbar. Gruß Thomas
Es dauert lange und endet mit einer Fehlermeldung. Reducing parameter expressions... Substituting parameters(line 0) ... Substituting parameters(line 3) Substituting parameters(line 4) Substituting parameters(line 4) Substituting parameters(line 5) Minuten später -- Grammatical Error --- ((-(((if(bq()*.... Ich kann heute Abend noch etwas anderes probieren. Funktionieren exakt die selben Gleichungen mit einem andeern SPICE? Gruß Helmut
Nachdem ich fehlende Klammern gesetzt habe bin ich jetzt bei dieser Meldung. Woher willst du wissen, dass deine Formeln überhaupt stimmen, wenn schon Klammern fehlten? WARNING: infinite recursion in: "ddt((if((((((v(a)-v(k))/vth)-(ln((if((tt()*(in45()-ip46())+qb-2*qp5())* (tt()*(in45()-ip46())+qb-2*qp5())>(qb*(qp5()+tt()*ip46()))*1.0e2,2*(qb*( qp5()+tt()*ip46()))/((tt()*(in45()-ip46())+qb-2*qp5())+sqrt((tt()*(in45( )-ip46())+qb-2*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*(qb*(qp5()+tt( )*ip46())))),0.25*(-(tt()*(in45()-ip46())+qb-2*qp5())+sqrt(abs((tt()*(in 45()-ip46())+qb-2*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*(qb*(qp5()+ tt()*ip46())))))))*((if((tt()*(in45()-ip46())+qb-2*qp5())*(tt()*(in45()- ip46())+qb-2*qp5())>(qb*(qp5()+tt()*ip46()))*1.0e2,2*(qb*(qp5()+tt()*ip4 6()))/((tt()*(in45()-ip46())+qb-2*qp5())+sqrt((tt()*(in45()-ip46())+qb-2 *qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*(qb*(qp5()+tt()*ip46())))),0 .25*(-(tt()*(in45()-ip46())+qb-2*qp5())+sqrt(abs((tt()*(in45()-ip46())+q b-2*qp5())*(tt()*(in45()-ip46())+qb-2*qp5())+8*.......... Da geht es noch ein paar Seiten so weiter.
Vielen Dank für deinen Einsatz! Du hast leider recht. Ich geh in eine Ecke und schäme mich eine Runde, denn eigentlich habe ich bei der Fehlermeldung mit --grammatical error-- mehrfach die Zahl der Klammern geprüft (aber nur in der Fehlermeldung und nicht in den Formeln). Mit PSPICE hab inzwischen aber auch gesehen dass ein paar gefehlt haben. Die werden bei meiner "Übersetzung" abhanden gekommen sein, da besonders die IF-Anweisungen in Verilog anders geschrieben sind. Die unendliche Rekursion konnte ich mit PSPICE noch nicht erzeugen, denn es bemängelt andere Stellen die ich noch korrigieren muss. Bin mal gespannt ob das selbe herauskommt wie bei dir mit LTSPICE. Ein Informatiker-Kollege meinte dass eine Abbruch-Bedingung notwendig wäre, damit die Rekursion ausgerechnet werden kann. Ich kann erst morgen testen, aber mir schwebt sowas wie: nach 30 Iterationen iA=0 setzen (quasi ein Umweg für die Anfangsbedingung iA = 0) oder etwas mit .op , aber das habe ich noch nicht komplett verstanden.
Zum Prüfen ob die Anzahl der aufgehenden und zugehenden Klammern übereinstimmt, habe ich an den Dateinamen ".c" gehängt und dann den Texteditor PSPAD genommen. Bei .c-Dateinen stellt der die zugehörige Klammer farblich dar. Dadurch sieht man zumindest ob eine Klammer fehlt oder zu viel ist.
Momentan ist noch keine Lösung in Sicht. Während LTSpice noch eine Fehlermeldung schafft, stürzt PSpice leider ab (bzw. behauptet der Server wäre nicht erreichbar). In Lauritzen_Verilog.txt wurde das gleiche Modell in Verilog geschrieben. Ich hatte aus Saber in Spice übersetzt. Interessant ist dass die Gleichungen für die "System variables" in Verilog anders formuliert wurden als in Saber. Anstatt: iCak = ddt(q56) wird ein Stromzweig mit unbekanntem Knoten (floating node, hier: n_iCak) erzeugt: I(n_iCak) <+ iCak - ddt(q56) sodass der Simulator folgende Gleichung löst: 0 = iCak - ddt(q56) Zu Beginn wird iCak definiert als: iCak = V(n_iCak) Ich versuche das für Spice zu adaptieren. Der Aufbau erinnert mich an die Infineon-Modelle, in denen kleine "Hilfs"-Netzwerke existieren nach der Art: Rhilfe 11 0 100meg Ghilfe 0 11 {X - V(11)} mit X als beliebigen Wert aus Schaltung oder Funktionen. In anderen Teilen des Modells wird dann mit V(11) weiter gerechnet. Das leuchtet mir allerdings noch nicht ganz ein, denn je höher der Widerstand gewählt wird, desto kleiner wird V(11) und mehr passiert nicht. Das schau ich mir jetzt alles genauer an. Gruß Thomas
Ich habe inzwischen weiter an dem Modell gearbeitet. Falls noch jemand mitliest: Durch das Ersetzen der Systemvariablen mit den Hilfsnetzwerken konnte ich die Rekursion beseitigen. Das sieht folgendermaßen aus: Die Funktion .FUNC udep {u5G()-uox()} wird zu Rudep udep 0 100meg Budep 0 udep I=u5G()-uox()-V(udep) und der Funktionsaufruf udep() in den anderen Teilen des Modells wird duch V(udep) ersetzt. für Rudep größer als 10meg nimmt V(udep) den Wert der davor stehenden Formel an, also V(udep) = u5G () - uox() ... zumindest theoretisch (als Test habe ich z.Bsp.: Btest 0 1 I = ddt(sin(time))-V(1) Rtest 1 0 100meg gewählt und für V(1) cos(time) erhalten.) Damit ist die Rekursion beseitigt, aber es stellt sich die nächste Schwierigkeit ein. Obwohl zum Beispiel I(BiCgk) einen fließenden Strom zeigt (die anderen sind meist =0A ), hat V(BiCgk) keinen Zahlenwert sondern "1.#QNAN0e+000". Selbst wenn kein Strom fließt, sollte für den Knoten doch ein Potential angezeigt werden.
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.