Howto Wie man zu einem beliebigen Widerstand den nächsten E12 (extended) Normwert von LTspice berechnen lässt

RudiS

Absoluter Profi
Member
Top Poster des Monats
Landesflagge
Wie oft habe ich mir vorgestellt, wie schön es doch wäre, wenn LTspice über eine Scripting-Sprache verfügen würde!

Es hat mich umso mehr gereizt, mal etwas eher Mathematisches in LTSpice zu versuchen.
Das Ergebnis ist eine Funktion (eher ein paar Funktionen), die zu einem (nahezu) beliebigen Widerstand >=10 Ohm, <=100 MegOhm den nächstliegendsten E12-Normwert berechnet.
Dieser kleine Beitrag stellt auch eine Ergänzung zu meinem Howto Kleine Einführung zu benutzerdefinierten Funktionen dar.

Ich habe das Ganze nicht ausführlich getestet, aber es scheint soweit ok zu sein.

01_E12_schema.png

Das Ergebnis kann man in der Spice error log einsehen:

02_E12_log.png
Die für die Simulation erforderlichen Dateien befinden sich - wie immer - im beigefügten Archiv.
Über Rückmeldungen würde ich mich freuen.

RudiS

Wer genauer wissen möchte, wie das Ganze func-tioniert, sollte die weiter unten mit Spicer geführten Dialoge und Erläuterungen
studieren!

Nachtrag 22.Mai:
Ich hatte in der Datei "Functions_E12_calc.inc" den Exponenten der Zehnerpotenz dummerweise "idx" benannt, das kann leicht verwechselt und missverstanden werden.
Da "exp" in LTspice schon mit der e-Funktion belegt ist, habe ich "idx" in "expo" umbenannt und das Archiv dementsprechend geändert. Diejenigen, die vor dem 22. Mai
das Archiv runtergeladen haben, bitte ich um Nachsicht.

Nachtrag 26. Mai:
Ich habe die E-Funktionen um einen Wert am Ende erweitert. Normalerweise ist der Endwert bei E12 8k2, bei der von mir erweiterten E12X 9k1.
Wenn jetzt der gesuchte Wert 9k75 wäre, würde in der alten Form 8k2 bzw. 9k1 als nächstliegenster Wert ausgegeben, obwohl der Wert 10k als Normwert
viel näher liegt. Ich habe daher die Reihe um diesen neuen Endwert ergänzt. Das Archiv lasse ich erst einmal so wie es ist,
hänge aber die neue Datei "E12_functions.txt" hier an.
 

Anhänge

  • E12-extended_Resistor_function.zip
    106,4 KB · Aufrufe: 0
  • E12_functions.txt
    1,3 KB · Aufrufe: 0
Zuletzt bearbeitet:
Genial. Ich habe alles in eine txt genommen und versucht, die E3 und E6 Reihen hinzuzufügen.
Aber ich verstehe die Zeilenenden
.func E12x_Idx(Rx)
.func E12x_R(Idx)
nicht ganz. Kannst E3 und E6 mal testen bitte?
Ev könnte man noch mit den Reihen E24 bis E96 ergänzen?
 

Anhänge

  • Simulation.zip
    2,2 KB · Aufrufe: 1
Zuletzt bearbeitet:
Ich habe heute (jetzt: 22:24 jap. Ortszeit) sowie morgen sehr wenig Zeit, daher muss die Erläuterung ein paar Tage warten.

Zuerst eine kurze Erklärung zum 1. Problem - wie viele digits hat eine Zahl, und welches ist ihr Grundwert?

Beispiel: Widerstandswert R=11k5798, als einfache Zahl: 11579.8

Die Nachkommastellen berücksichtige ich nicht. Die Zahl 11579 hat also 5 digits. Wie erhalte ich diesen Wert?
Meine Methode ist mit dem Logarithmus: x = log10(R) ; [im Internet gibt es viele "umständliche" Methoden mit C oder C++]
Ergebnis x = 4.0637
Der Integerwert davon ist z = int(x) = 4
Also hat diese Zahl z + 1 digits = 5 (ohne die Nachkommastellen)
Das ist schon mal eine Sache.

Als nächstes will ich den Widerstand auf einen Grundwert zurückführen.
Beispiel: 120R 1k2 12k 120k
Alle diese Widerstände unterscheiden sich nur durch ihre Zehnerpotenz:
120R = 1.2 * 100 (10**2)
1k2 = 1.2 * 1000 (10**3)
12k = 1.2 * 10.000 (10**4) usw.
Diese 1.2 ist der Grundwert. Wie bekomme ich diesen Grundwert von obigem Widerstand?
Höchst einfach!!
Der Gesamtwert ist im Exponenten x = 4.0637 enthalten, die Zehnerpotenz in der Variablen z = 4.
Wenn man die Zehnerpotenz vom Exponenten subtrahiert, bleibt . . .
a = x - z --> 4.0637 - 4 = 0.0637
a = 0.0637 ist dieser Grundwert, weil 10**a = 1.15798

Die unten angefügten Screenshots belegen diese Rechnung unter LTspice.

Zu den Tabellen schreibe ich am Mittwoch. Bis dahin bitte ich um etwas Geduld.

RudiS
 

Anhänge

  • 01__digits_schema.png
    01__digits_schema.png
    28,7 KB · Aufrufe: 4
  • 02__digits_log.png
    02__digits_log.png
    10,1 KB · Aufrufe: 4
Zuletzt bearbeitet:
Ich meinte, die Werte ab Nr 10. Die sind unterschiedlich und auch nicht gleich lang. Sorry, hab mich schlecht ausgedrückt ;)

.func E12_Idx(Rx) {table(Rx, 1, 1, 1.2, 2, 1.5, 3, 1.8, 4, 2.2, 5, 2.7, 6, 3.3, 7, 3.9, 8, 4.7, 9, 5.6, 10, 6.8, 11, 8.2, 12)}
.func E12x_Idx(Rx) {table(Rx, 1, 1, 1.2, 2, 1.5, 3, 1.8, 4, 2.2, 5, 2.7, 6, 3.3, 7, 3.9, 8, 4.7, 9, 5.1, 10, 5.6, 11, 6.8, 12, 7.5, 13, 8.2, 14, 9.1, 15)}
 
Ich muss morgen früh raus und daher jetzt ins Bett, tut mir leid. Ich schreibe am Mittwoch, versprochen. Hab bitte bis dahin etwas Geduld, ja?
Nur ganz, ganz kurz: E12_Idx ist die reine E12-Tabelle, E12X_Idx ist die von mir um einige oft gebrauchte E-24-Werte ergänzte E12-Tabelle, das X steht für extended.
Rudi
 
Zuletzt bearbeitet:
Nur keine Eile.
Jetzt ist ja eh alles klar. Hatte mich nur gewundert ob der zusätzlichen Werten.
 
Gibt es denn jetzt noch irgendwelche Unklarheiten, zu denen eine Erläuterung notwendig ist?

Zu den Tabellen möchte ich noch folgendes sagen:
.func E12_Idx(Rx) {table(Rx, 1, 1, 1.2, 2, 1.5, 3, 1.8, 4, 2.2, 5, 2.7, 6, 3.3, 7, 3.9, 8, 4.7, 9, 5.6, 10, 6.8, 11, 8.2, 12)}
.func E12_R(Idx) {table(Idx, 1, 1, 2, 1.2, 3, 1.5, 4, 1.8, 5, 2.2, 6, 2.7, 7, 3.3, 8, 3.9, 9, 4.7, 10, 5.6, 11, 6.8, 12, 8.2)}

Die Funktion E12_Idx(Rx) liefert zu einem beliebigem Widerstand einen Index. Wie ich seinerzeit in der oben erwähnten Einführung in benutzerdefinierte Funktionen gezeigt
habe, wird bei Zwischenwerten von LTspice linear interpoliert.
Beispiel: 2k41 --> 2.41 * 1000
Dieser Wert liegt zwischen 2.2 (Index 5) und 2.7 (Index 6), daher liefert die Funktion einen Wert von 5.xxx zurück.
2.41 liegt näher zu 2.2 als zu 2.7, also ist der zurückgelieferte interpolierte Index zumindest kleiner als 5.5, sagen wir einfach mal 5.43
Die round()-Funktion rundet das Ergebnis, bei 5.5 würde aufgerundet zu 6, bei unserem Wert von 5.43 wird abgerundet zu 5.

Die nächste Funktion E12_R(Idx) macht das Umgekehrte, sie liefert zu einem Index den zugehörigen Widerstandsgrundwert.
Zu dem Index 5 finden wir den Grundwert 2.2
Dieser wird nun mit der zugehörigen Zehnerpotenz, in unserem Fall mit 1000 multipliziert, ergibt 2200 oder 2k2.
Damit ist der dem Widerstand 2k41 am nächsten liegende Normwert besagte 2k2. QED

RudiS
 
Zuletzt bearbeitet:
Auf Wunsch von Spicer hier einmal ein Durchlauf mit der E6-Reihe, nur als Bild.

Selbstverständlich kann man das "Programm" auch auf die E24- oder E48-Reihen erweitern, aber da ich persönlich an MF-Widerständen ausser der E12 nur einige der E24-Reihe besitze, mache ich das hier aus Zeitmangel nicht. Mir genügt die mit ein paar E24-Werten erweiterte E12X. Wer unbedingt die E24 oder gar die E48-Reihe braucht (von der E96 ganz zu schweigen), muss dann eben selbst Hand anlegen. Ist ja eh nur reine Fleissarbeit. Ein Blick auf die Datei "Functions_E12_calc.inc" sollte genügend Anhaltspunkte geben, was dafür zu ändern ist.

03__E6-log.png
 
Zuletzt bearbeitet:
おまけ (o-make) -- auf japanisch: kleine Zugabe :)

Hier die E24-Reihe. Muss sich jeder selbst einbauen...

.func E24_Idx(Rx) {table(Rx, 1, 1, 1.1, 2, 1.2, 3, 1.3, 4, 1.5, 5, 1.6, 6, 1.8, 7, 2.0, 8, 2.2, 9, 2.4, 10, 2.7, 11, 3.0, 12, 3.3, 13, 3.6, 14, 3.9, 15, 4.3, 16, 4.7, 17, 5.1, 18, 5.6, 19, 6.2, 20, 6.8, 21, 7.5, 22, 8.2, 23, 9.1, 24)}
.func E24_R(Idx) {table(Idx, 1, 1, 2, 1.1, 3, 1.2, 4, 1.3, 5, 1.5, 6, 1.6, 7, 1.8, 8, 2.0, 9, 2.2, 10, 2.4, 11, 2.7, 12, 3.0, 13, 3.3, 14, 3.6, 15, 3.9, 16, 4.3, 17, 4.7, 18, 5.1, 19, 5.6, 20, 6.2, 21, 6.8, 22, 7.5, 23, 8.2, 24, 9.1)}

04__E24-log.png
 

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

Wer hat diesen Thread gelesen

Zurück
Oben