NTC Modellierung in (LT-)SPICE

Die Spice-Sprache besitzt leider nur sehr eingeschränkte generische Möglichkeit einen NTC mit gegebenem Temperaturverhalten zu modellieren. In meinem Fall (DIE-Temperatursensor eines XM3 Halbleitermoduls) ist die Formel für die Änderung nur in Format T=F(R) angeben. Das Auflösen in die Inverse führt laut Wolfram Alpha zu keiner Lösung – das habe ich wegen der Koeffizienten mit quadrierten Exponenten auch nicht vor zu überprüfen.

Eine Lookup-Table lässt sich sehr einfach invertieren, die Präzision der Berechnung ist selbstverständlich schlechter, dass soll hier aber nicht weiter stören, bei Bedarf könnte ja einfach die Schrittweite reduziert werden.

Das Aufbauen von Look-Up-Tabellen ist nicht sehr gut dokumentiert, trotzdem kann man aus der Hilfe des Programmes herleiten, wie man sie import-freundlich implementiert. Hier ein Beispiel mit 3 Stützstellen:

.subckt XM3NTC 1 2
R1 1 2 {TABLE(temp,
+ -10, 20k, 
+ 5, 10k, 
+ 165, 500
+ )}
.ends

„Aber wie verwende ich diesen Text jetzt als Wiederstand ?“ – ganz einfach: Texteditor der Wahl öffen, text einfügen, Datei speichern als irgendwas.cir. Jetzt kann man in LT Spice (Tina natürlich auch) diese Datei öffen. Es geht in LT Spice ein Texteditor auf. Hier muss die Zeile, die mit .subckt anfängt markiert werden – Rechtsklick – „Create Symbol“. Dieses Symbol kann nach gusto verändet werden, sobald glücklich – speichern.

Zurück in der Schaltung, die eigentlich simuliert werden soll muss jetzt der Widerstand eingefügt werden, der gerade modelliert worden ist. WIEPRAKTISCH, dass LT Spice diese Bauteile unter dem „AutoGenerated“ Reiter in der „Component“ Schaltfläche bereitstellt. Jetzt noch einfügen

Version Temperatur-Port

Der Klassiker: die Termperatur eines Bauteils im Betrieb ermitteln. Dafür macht man ein Temperaturemodell mit Wärmekapazität C(th) und Wäreübergangswiderstand R(th). Genauso wie oben kann man die Tabelle importiern, ändern muss man nur, dass der X-Wert nichtmehr temp, sondern irgendetwas anderes heißt, tmp hier und ein weiterer Port wird benötigt, dieser muss so heißen, wie der X-Achsen Bezeichner der LUT (Look up table).

.subckt XM3NTC 1 2 tmp
R1 1 2 R=table(V(tmp),
+ -10, 20k, 
+ 5, 10k, 
+ 165, 500
+ )
.ends

Mit einem kurzen Beispielschaltplan kann man herausfinden, ob sich die Mühe bis hier her gelohnt hat. Und wichtiger : Wie verhält sich das System außerhalb der Stützstellen. Folgende Simulation geht von -20 grad bis 175, also jeweils 10 grad über die Grenzen des in der Tabelle definierten Bereichs. Bild unten zeigt, dass zwischen den Stützstellen linear interpoliert wird, im „undefinierten“ Bereich dagegen wird einfach letzte Wert genutzt, der bekannt ist.

So weit so gut, die Termperatur steigt, der Widerstand fällt. Was fehlt, ist ein Weg, um die Stützstellen automatisch in das Program zu füttern. Das ist mit Python sehr einfach. Hier der Code:

import matplotlib.pyplot as plt
import numpy as np

Kelvin = 273

ResistanceatTzero = 10000       #nominal Resistance
Tzero = 25 + Kelvin             #degre
Beta = 3380                     #Beta Value

def f(T):
    T = T+Kelvin
    return ResistanceatTzero * np.power(np.e, Beta*((1/T)-(1/Tzero)))

Temperature = np.arange(-20, 200, 10)
Resistance = f(Temperature)


plt.plot(Temperature,Resistance)
plt.show()

f = open("NTC.cir", "x")
f.write(".subckt NTC  1 2 temp \n R1 1 2 R=table(V(temp),\n")

for x in range(0, Temperature.size):
    f.write("+ " + str(Temperature[x]) + " , " + str(round(Resistance[x])))
    if not (x==Temperature.size-1):
        f.write(" , ")
    f.write("\n")
    

f.write("+ ) \n")
f.write(".ends")

f.close()

Muss die Messfunktion angepasst werden, einfach die Funktion f(T) ändern. Nach Ausführen des Skripes sollte ein neues Textdokment in dem Ordner entstanden sein, in dem sich das Skript befunden hat. Dieses Textdokument hat die Endung .cir und kann in LTSpice importiert werden.