![]() |
Berechnung eines Wertes aus Widerstandsreihe
Moin,
ich wollte meinen Elektrorechner mal um eine häufig gefragt Funktion erweitern...die genormten Widerstandsreihen (E3,E6,E12,E24,E48,E96,E192). als Dokumentation hab ich da u.a. ![]() laut dieser und anderer Quellen lassen sich die werte berechnen aus der (n-ten Wurzel aus 10)^(position-1). Leider habe komme ich teilweise nicht auf die richtigen Werte (trotz runden). z.B. Reihe E6 => k=1,4677 (6.wurzel aus 10) der 4.wert sollte also ~3,3 sein ich komme jedoch auf 3,161636106733 was ich nicht wirklich auf 3,3 runden kann... kennt sich damit evtl jemand aus? Gruß Frank |
Re: Berechnung eines Wertes aus Widerstandsreihe
Wenn Du einmal in diesem
![]() Deine Berechnungen bestätigt. Und viellecht hilft das noch zur Erklärung (Quelle Wiki): Zitat:
Klaus |
Re: Berechnung eines Wertes aus Widerstandsreihe
Liste der Anhänge anzeigen (Anzahl: 1)
Servus
ich kann mich da nur anschließen, weil die E6 Reihe eine ziemlich große Toleranz hat (20%). Ich hab das mal durchgerechnet (siehe Bild) und ich komm dabei auf einen Toleranzbereich von 2,52982 bis 3,79473 Ohm. Da passen die 3,3 Ohm locker rein :-D. Wenn interesse am Sourcecode besteht, muß ich ihn erstmal aufräumen und poste ihn dann gern. Greetz |
Re: Berechnung eines Wertes aus Widerstandsreihe
es geht mir nicht darum die 3,3 abzudecken, sondern den Wert für ein Bauteil (welches sich an eine der E-Reihen hält) zu einem berechneten Widerstandswert zu bekommen.
wenn ich einen widerstand von 3,2 Ohm ausgerechnet habe, müsste ich z.b. nach E6-Reihe einen 3,3 Ohm verbauen. und diese 3,3 will ich haben. //edit da diese rundungsfehler bekannt sind muss ich das ganze wohl so in etwa machen:
Delphi-Quellcode:
Gruß Frank
procedure TForm1.Button1Click(Sender: TObject);
const //r3:array[0..2] of double=(1.0,2.2,4.7); //r6:array[0..5] of double=(1.0,1.5,2.2,3.3,4.7,6.8); //r12:array[0..11] of double=(1.0,1.2,1.5,1.8,2.2,2.7, 3.3,3.9,4.7,5.6,6.8,8.2); r24:array[0..23] of double=(1.0,1.1,1.2,1.3,1.5,1.6,1.8,2.0,2.2,2.4,2.7, 3.0,3.3,3.6,3.9,4.3,4.7,5.1,5.6,6.2,6.8,7.5,8.2,9.1); r192:array[0..191] of double=(1.00,1.01,1.02,1.04,1.05,1.06,1.07,1.09, 1.10,1.11,1.13,1.14,1.15,1.17,1.18,1.20, 1.21,1.23,1.24,1.26,1.27,1.29,1.30,1.32, 1.33,1.35,1.37,1.38,1.40,1.42,1.43,1.45,1.47,1.49, 1.50,1.52,1.54,1.56,1.58,1.60,1.62,1.64,1.65,1.67,1.69, 1.72,1.74,1.76,1.78,1.80,1.82,1.84,1.87,1.89,1.91,1.93,1.96,1.98, 2.00,2.03,2.05,2.08,2.10,2.13,2.15,2.18,2.21,2.23,2.26,2.29, a2.32,2.34,2.37,2.40,2.43,2.46,2.49, 2.52,2.55,2.58,2.61,2.64,2.67,2.71,2.74,2.77,2.80,2.84,2.87,2.91,2.94,2.98, 3.01,3.05,3.09,3.12,3.16,3.20,3.24,3.28,3.32,3.36,3.40,3.44,3.48, 3.52,3.57,3.61,3.65,3.70,3.74,3.79,3.83,3.88,3.92,3.97, 4.02,4.07,4.12,4.17,4.22,4.27,4.32,4.37,4.42,4.48, 4.53,4.59,4.64,4.70,4.75,4.81,4.87,4.93,4.99, 5.05,5.11,5.17,5.23,5.30,5.36,5.42,5.49, 5.56,5.62,5.69,5.76,5.83,5.90,5.97, 6.04,6.12,6.19,6.26,6.34,6.42,6.49, 6.57,6.65,6.73,6.81,6.90,6.98, 7.06,7.15,7.23,7.32,7.41, 7.50,7.59,7.68,7.77,7.87,7.96, 8.06,8.16,8.25,8.35,8.45, 8.56,8.66,8.76,8.87,8.98, 9.09,9.20,9.31,9.42, 9.53,9.65,9.76,9.88 ); begin if spinedit1.value<(3 shl Combobox1.itemindex) then //maximalwert prüfen E3=2,E6=5,... begin if combobox1.itemindex<4 then showmessage(FloatToStr(r24[(1 shl (Combobox1.Items.count-(Combobox1.itemindex+4))*Spinedit1.value)])) else showmessage(FloatToStr(r192[(1 shl (Combobox1.Items.count-(Combobox1.itemindex+1))*Spinedit1.value)])); end else showmessage('Position zu hoch'); end; [edit=Phoenix]Umbrüche wegen Layout eingefügt Mfg, Phoenix[/edit] |
Re: Berechnung eines Wertes aus Widerstandsreihe
Zitat:
das mit der n-ten Wurzel ist die Theorie für E192, in der Praxis wird aber jede abgeleitete Reihe auf möglichst wenige Stellen gerundet und in sich abgeglichen. Eine Formel gibt es für die resultierenden Zahlenreihen nicht, sie sind einfach nach EIA genormt. Man kann auch nicht nach der eigentlich naheliegenden Regel vorgehen, jeder 8. Wert aus E192 gäbe den Wert in E24 usw. Du wirst also wohl oder übel ALLE Reihen E6 bis E912 abtippen müssen, z.B. hier: ![]() Gruss Reinhard |
Re: Berechnung eines Wertes aus Widerstandsreihe
Hat er ja schon :-D
Jetzt muß er ja nur noch den nächstgrößeren Widerstandswert aus der zugehörigen E-Reihe herausholen. Wird wohl die einzige Lösung sein, wenn mans nicht berechnen kann |
Re: Berechnung eines Wertes aus Widerstandsreihe
ich habe die reihen miteinander verglichen und festgestellt, dass ich eigentlich nur die reihe 24 und 192 abtippen muss.
Die Werte der dazwischenliegenden Reihen sind in den beiden vorhanden. d.h. alle werte der reihen E3, E6 und E12 sind in gleich abständen in der E24 enthalten, gleiches für E48, E96 in E192, wenn ich nicht irgendetwas übersehen habe... jetzt brauche ich nur noch einen algo um möglichst schnell zu dem passenden wert zu kommen. 1. müsste ich auf 1 Stelle vor dem komma kommen (könnte zwar solange /10 machen, bis dieser punkt erreicht ist, aber gibt sicherlich bessere Varianten) 2. dann innerhalb der dekade den jeweiligen wert finden, was aber in Reihe 192 sehr rechenintensiv ist. naja, abgetippt hab ich die nicht, copy&paste ins excel, spalte in scite und per search&replace (teils mit regex) das array zusammengebastelt. ;) Gruß Frank |
Re: Berechnung eines Wertes aus Widerstandsreihe
Wie wärs damit:
Mein erster Code-Post hier im Forum :bounce2: Hoffentlich passt alles *schwitz* Hab mir mal die Freiheit genommen, deine schönen Arrays zu verwenden
Delphi-Quellcode:
Habs paarmal getestet und müsste funktionieren. Ich hab allerdings alle E-Reihen verwendet, weil es ja in der E24 Reihe Widerstände gibt, die in der E6 Reihe nicht auftauchen.
var
a: integer; // ist die verwendete E_Reihe z.B. 6 e_Reihe : integer; // das Array das zum bestimmen verwendet wird Ex_Reihe : array[0..200] of double; // der Widerstand, den du berechnet hast z.B. 3.1 Ohm widerstand: real; // der Widerstand, der dem nächstgelegenen in der E-Reihe entspricht; hier 3.3 Ohm widerstand_nach_e : real; begin // Berechneten Widerstandswert festlegen widerstand := 7.0; // E-Reihe festlegen E_reihe := 6; // deine schönen Arrays in eins zum berechnen übertragen for a := 0 to E_reihe-1 do case e_reihe of 3: ex_reihe[a] := r3[a]; 6: ex_reihe[a] := r6[a]; 12: ex_reihe[a] := r12[a]; { .. } 24: ex_reihe[a] := r24[a]; 192: ex_reihe[a] := r192[a]; end; // Sollte der Widerstandswert größer sein, als der größte der E-Reihe, so ist die Ausgabe // 1.0 Ohm mit einem größeren Multiplikator if widerstand > Ex_Reihe[e_reihe-1] then widerstand_nach_e := 10 else // Eigentliche Auswahlroutine for a := E_Reihe-1 downto 0 do begin if widerstand < Ex_reihe[a] then widerstand_nach_e := ex_reihe[a]; end; label4.caption := 'Nächter Widerstand nach E'+inttostr(e_reihe)+ ': '+floattostrf(widerstand_nach_e,fffixed,10,5); greetz |
Re: Berechnung eines Wertes aus Widerstandsreihe
Hallo,
es gibt noch einen thread zum gleichen Thema, an den ich mich noch erinnere: ![]() Grüße vom marabu |
Re: Berechnung eines Wertes aus Widerstandsreihe
danke marabu, werde mir das mal genauer anschauen. was mir gleich auffällt, ist die Verwendung von Integers statt floats (welches sicherlich schneller geht). Ich werde daher auch floats verwenden (=100er Dekade).
Gibt es eine Möglichkeit einen Wert schneller auf diese dekade zu kommen als so in der Art (ungetested):
Delphi-Quellcode:
Gruß Frank
function tohundreddecade(value:double;var dir:integer):integer;
var ftmp:double; itmp:integer; begin //direction zur rückrechnung in ursprünglichen Wert //result ist natürlich der dekadenwert //itmp ist die temporäre integer-var;ftmp die für floats dir:=0; result:=0; ftmp:=value; if value <100 then begin while ftmp<100 do begin ftmp:=ftmp*10; inc(dir); end; end else if value>999 then begin itmp:=trunc(ftmp); while ftmp>999 do begin itmp:=itmp div 10; dec(dir); end; result:=itmp; end; if result=0 then result:=trunc(ftmp); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz