Forum: Platinen Impedanzkontrolle fürs Hobbybudget


von Benedikt H. (hunz)


Lesenswert?

Gutn Abend zusammen,

da ich mich gerade an einem FPGA+DDR2 Layout mit Eagle versuche, brauch 
ich Impedanzkontrolle. Mit kostenlosen Tools (AppCAD, zcalc, mdtlc, 
etc.) ist das ganze natürlich nicht so komfortabel, wie mit dem Polar 
Instruments solver o.ä. - Vor allem muss man sich aus dem PCB stackup 
dann die Parameter für die transmission lines von Hand raussuchen und in 
den tools dann so lange herumspielen, bis man ein akzeptables Ergebnis 
hat. Wenn man dann unter Linux noch mit wine herumklickt, ist der Spaß 
perfekt.

Ich hab daher mal angefangen, mir in Lua was zusammenzubasteln, wo ich 
den Layerstack, min/max-Werte für die Bahnen und die benötigten 
Impedanzen reinwerfen kann und dann für jeden Layer eine Liste bekomme 
wie nah ich da mit welcher transmission line drankomme.

Bisher kann das Teil Microstrip (auch differentiell) und Asymmetrische 
Striplines. Unterschied in der Außen-/Innenlagen 
Ausbreitungsgeschwindigkeit fällt auch raus. Einheit ist immer mm, nicht 
mil.
Das Ding gibts aber erst seit heute, daher ist das natürlich nicht allzu 
gut getestet, ich hab nur mal ein paar Werte mit 
http://www.coresourcetech.com/resources/calculators.htm und zcalc 
verglichen. Sah soweit gut aus, aber man sollte die Werte dann wirklich 
nochmal mit andern Tools (z.B. mdtlc) abgleichen.

Der code liegt hier: https://github.com/znuh/pcbtools
Benutzung ist ziemlich einfach, nur config.lua an die eigene Bedürfnisse 
anpassen, dann lua impedance.lua aufrufen. Output sieht dann so aus:
1
e_r: 4.5
2
Layer=1 h=0.200 t=0.035 (signal_speed_factor=1.27):
3
  microstrip (IPC-D-317A) target_z0= 50 best_z0= 53 w=0.300 target_zdiff=100 best_zdiff=100 s=1.000
4
  microstrip (IPC-D-317A) target_z0= 75 best_z0= 75 w=0.140 target_zdiff=150 best_zdiff=149 s=1.000
5
  microstrip (IPC-D-317A) target_z0=150 best_z0= 78 w=0.125 target_zdiff=300 best_zdiff=299 s=1.000
6
Layer=3 h1=0.360 h2=0.640 t=0.035:
7
  stripline (IPC-D-317A) target_z0= 50 best_z0= 54 w=0.300
8
  stripline (IPC-D-317A) target_z0= 75 best_z0= 75 w=0.133
9
  stripline (IPC-D-317A) target_z0=150 best_z0= 77 w=0.125
10
Layer=14 h1=0.360 h2=0.640 t=0.035:
11
  stripline (IPC-D-317A) target_z0= 50 best_z0= 54 w=0.300
12
  stripline (IPC-D-317A) target_z0= 75 best_z0= 75 w=0.133
13
  stripline (IPC-D-317A) target_z0=150 best_z0= 77 w=0.125
14
Layer=16 h=0.200 t=0.035 (signal_speed_factor=1.27):
15
  microstrip (IPC-D-317A) target_z0= 50 best_z0= 53 w=0.300 target_zdiff=100 best_zdiff=100 s=1.000
16
  microstrip (IPC-D-317A) target_z0= 75 best_z0= 75 w=0.140 target_zdiff=150 best_zdiff=149 s=1.000
17
  microstrip (IPC-D-317A) target_z0=150 best_z0= 78 w=0.125 target_zdiff=300 best_zdiff=299 s=1.000

Wenn das Ding noch jemand sinnvoll findet, freue ich mich natürlich sehr 
über Feedback und Code/Formel-Beiträge! Inwieweit ich das 
weiterentwickle mach ich wohl auch davon abhängig, ob das noch jmd. 
sinnvoll findet.

Ich hab versucht, den Code möglichst einfach und trotzdem flexibel zu 
halten. In transm_lines.lua sind die Berechnungsvorschriften abgelegt, 
es ist auch recht einfach möglich, neue transmission-lines, bzw. 
verschiedene Formeln für eine transmission-line abzulegen. Ich erklär 
auch gern mehr Details wie was funktioniert, wenn gewünscht.

Was ich gern noch einbauen würde:
- Differential asymmetric stripline - da fehlt mir aber die Formel, ich 
finde die nur für symmetrische :\
- Coplanar waveguide
- Differential coplanar waveguide

Formelspenden nehm ich sehr gerne :) Ansonsten würde mich auch erstmal 
euer Feedback interessieren.

von Reinhard Kern (Gast)


Lesenswert?

Benedikt H. schrieb:
> In transm_lines.lua sind die Berechnungsvorschriften abgelegt

Wäre interessant, woher sie kommen - es gibt verschiedene Formeln, 
leider auch teilweise mit verschiedenen Ergebnissen, aus verschiedenen 
Quellen - z.B. LVDS Spec, Design Handbook, Online-Kalkulatoren, App 
Notes usw. Ein Betriebsgeheimnis verrätst du uns damit ja nicht, aber 
dann könnte man sagen ok, gleiche Formel wie Saturn, kommt auch das 
Gleiche raus - oder eben nicht.

Ich meine damit übrigens nicht, dass die Näherungsformeln nur für 
begrezte Werte gültig sind, leider sind Formeln bzw. Programme im 
Umlauf, die für ganz normale Leiterbahnen ziemlich abweichende Werte 
liefern.

Ansonsten sehr interessant, ansonsten wäre GUI nett - Stack definieren, 
Impedanz rein und Breite raus oder umgekehrt oder Lagenabstand 
berechnen. Gled verlangen kann man wohl nicht dafür, das geht nur wenn 
die Berechnung auf Field Solver beruht.

Gruss Reinhard

von Benedikt H. (hunz)


Lesenswert?

Reinhard Kern schrieb:
> Wäre interessant, woher sie kommen - es gibt verschiedene Formeln,
> leider auch teilweise mit verschiedenen Ergebnissen, aus verschiedenen
> Quellen - z.B. LVDS Spec, Design Handbook, Online-Kalkulatoren, App
> Notes usw. Ein Betriebsgeheimnis verrätst du uns damit ja nicht, aber
> dann könnte man sagen ok, gleiche Formel wie Saturn, kommt auch das
> Gleiche raus - oder eben nicht.

Oh ja, dass da unterschiedliche Formeln aus unterschiedlichen Quellen 
mit unterschiedlichen Ergebnissen herumschwirren hab ich auch gemerkt, 
daher hab ich das auch so vorgesehen dass man zu jeder Formel die Quelle 
ablegt.
Beispiel aus transm_lines.lua:
1
  {
2
    name = "microstrip",
3
    source = "http://www.coresourcetech.com/resources/calculators.htm",
4
    ref = "IPC-D-317A",
5
    z0_fn = microstrip_z0,
6
    w_fn = microstrip_w,
7
    zdiff_fn = diff_microstrip_z,
8
    s_fn = diff_microstrip_s
9
  },

ref wird in der Ausgabe auch mit angegeben, dass man in der Liste dann 
weitere Details nachsehen kann.
Das schöne ist, dass sich die Tabelle beliebig um weitere Felder 
erweitern lässt, z.B. comment = "nicht bei Vollmond benutzen!"

> Ich meine damit übrigens nicht, dass die Näherungsformeln nur für
> begrezte Werte gültig sind, leider sind Formeln bzw. Programme im
> Umlauf, die für ganz normale Leiterbahnen ziemlich abweichende Werte
> liefern.

Ja, hab ich gemerkt. Daher macht danach eine Verifikation mit 
field-solver wohl auch Sinn.

> Ansonsten sehr interessant, ansonsten wäre GUI nett - Stack definieren,
> Impedanz rein und Breite raus oder umgekehrt oder Lagenabstand
> berechnen. Gled verlangen kann man wohl nicht dafür, das geht nur wenn
> die Berechnung auf Field Solver beruht.

GUI hab ich auch überlegt, aber erstmal zurückgestellt. Aus zwei 
Gründen:
- Zum einen brauchts dafür in jedem Fall mindestens ein Zusatzmodul für 
Lua, die Installation davon ist je nach Version und Betriebssystem mehr 
oder weniger nervig. Unter aktuellem Ubuntu im einfachsten Fall nur 
"apt-get install lua-lgi", aber ich finds sinnvoll, wenn man das Tool 
auch auf andern Platformen ohne viel Frickelei nutzen kann. Bisher 
braucht man da nur den 120kB großen Lua-Interpreter, die Installation 
davon ist überall schmerzfrei.
- Zum Andern hab ich das Gefühl, dass man die stackup Tabelle in 
https://github.com/znuh/pcbtools/blob/master/config.lua mit einem 
Texteditor teilweise schneller editiert hat, als das mit Mausgeschubse 
ginge. Man kann auch schön mehrere stackups hinterlegen und dann einen 
auswählen mit stackup_6l_v1 = { ... }; stackup = stackup_6l_v1

Was sich noch recht einfach einbauen lässt ist eine grafische Ausgabe 
des stackup. Hätte vermutlich den Vorteil, dass man es schneller sieht 
wenn da n Fehler drin ist. Braucht aber auch ein Zusatzmodul, würde ich 
dann so machen dass diese Funktion nur geht wenn das Modul installiert 
ist, der Rest aber weiterhin auch ohne Zusatzmodul funktioniert.

Breite rein, Impedanz raus lässt sich recht einfach einbauen, die 
Formeln können bisher Breite <-> Impedanz. Prepreg/Kern-höhen ausrechnen 
hab ich bisher nicht vorgesehen, spezielle Prepregs/Kerne aussuchen ist 
auch eher nur im Profibereich realistisch und da nimmt man dann auch 
gleich teurere, genauere Tools mit field solvern oder?

Geld wollte ich dafür nie haben, ist open source und soll auch von 
andern weiterentwickelt werden können.

Eine Field solver Anbindung wäre natürlich noch sehr cool, vielleicht 
kann man da mdtlc da irgendwie mit dranhängen, der scheint im Vergleich 
zu den kommerziellen auch recht brauchbar zu sein: 
http://mdtlc.sourceforge.net/

von Reinhard Kern (Gast)


Lesenswert?

Using unknown colors will cause a crash.

Benedikt H. schrieb:
> vielleicht
> kann man da mdtlc da irgendwie mit dranhängen

werde ich mir mal ansehen, atlc kenne ich schon länger. Die Idee mit 
Bitmap hat was für sich, ist allerdings für einfache Sachen zu 
umständlich, da muss man schon die Möglichkeit haben, sowas wie 
Stripline mit Parametern zu definieren anstatt mit einem 
Zeichenprogramm.

Allerdings ist das auch noch ziemlich roh, halt Unix-Stil, Zitat "Using 
unknown colors will cause a crash", eigentlich mehr eine Library als ein 
Anwendungsprogramm. Da bleibt für eine GUI noch viel zu tun, eben nicht 
nur nette Grafik, sondern alles vom Programm fernhalten, was es nicht 
mag, und möglichst einfache Eingaben bei Standardkonfigurationen, wie es 
ja bei den vorhandenen Windows-Programmen oder mit Java schon üblich 
ist.

Allerdings würde ein Fieldsolver mit solcher GUI dein Programm nicht 
ergänzen, sondern überflüssig machen, dass die Näherungsformeln 
schneller zu berechnen sind dürfte heute keine Rolle mehr spielen.

Wenn ich mir den Markt so ansehe, so ist er anscheinend so begrenzt, 
dass er nur eine Firma, polarinstruments, ernähren kann. Hobbyanwender 
dürfte es noch viel weniger geben, und Geld haben die ja eh nicht.

Gruss Reinhard

von Benedikt H. (hunz)


Angehängte Dateien:

Lesenswert?

Ja, das atlc hab ich mir vorhin angeguckt, das lässt sich 
vergleichsweise einfach da mit dranbauen.
Image output für den layer stack hab ich mir gerade schnell mit dem gd 
graphics Modul mit eingebaut. Das GD Modul kann dann auch gleich die 
bitmaps für atlc erzeugen. Werd ich nachher mal probieren.

Ein Problem mit atlc ist soweit ich das sehe aber, dass man da halt die 
Geometrie als Bitmap reinwirft und die Impedanzen fallen dann raus. 
Impedanzen -> Geometrie geht nicht direkt, das muss man dann quasi 
bruteforcen... Da machen die Näherungsformeln dann vielleicht Sinn um 
einen Startwert zu haben und das Verfeinern dann mit Binärsuche.
Werd ich nachher mal probieren :)

von Grendel (Gast)


Lesenswert?

> Impedanzen -> Geometrie geht nicht direkt,
> das muss man dann quasi bruteforcen...

Parameter "Sweepen" tut man da ;-)

Du könntest einen Graphen mit möglichen Impedanzen für den jeweiligen 
Lagenaufbau (jew. über Leiterbreite oder Leiterabstand für zdiff) 
plotten, dann kann sich der Anwender selbst raussuchen wo es passen 
könnte und dann den Fieldsolver anwerfen.


Habs mir nicht so genau angeschaut, aber kann atlc mit dem Bitmap was Du 
da gepostet hast umgehen? Also in der Mitte hast Du ja 4 Signale und 
zwei Referenzlagen...

Falls nicht könnte man die E-Feld Bitmaps pro Lage (die durch 
Referenzlagen getrennt sind) manuell zusammensetzen. Sähe sicher cool 
aus wenn man für den ganzen Stackup die E-Felder ausgeben und 
zusammenbauen würde. Da der Lagenaufbau i.d.R. symmetrisch ist, muss man 
die Bitmaps unten nur umdrehen.

Ja wirklich sinnvoll ist das vielleicht nicht, aber cool ;-)

von Benedikt H. (hunz)


Lesenswert?

Grendel schrieb:
> Parameter "Sweepen" tut man da ;-)

klingt gleich viel professioneller ;-)

> Du könntest einen Graphen mit möglichen Impedanzen für den jeweiligen
> Lagenaufbau (jew. über Leiterbreite oder Leiterabstand für zdiff)
> plotten, dann kann sich der Anwender selbst raussuchen wo es passen
> könnte und dann den Fieldsolver anwerfen.

Ja Graphen für Impedanz vs. Breite hatte ich auch schon überlegt, macht 
wahrscheinlich Sinn.

> Habs mir nicht so genau angeschaut, aber kann atlc mit dem Bitmap was Du
> da gepostet hast umgehen? Also in der Mitte hast Du ja 4 Signale und
> zwei Referenzlagen...

Nee, hatte ich mir auch gedacht, dass atlc mit dem ganzen Stack nix 
anfangen kann und ich das immer für den jeweiligen layer of interest 
splitten muss.
Das Bild so wie es oben ist ist auch nicht für atlc, sondern für den 
User zum ausdrucken und einrahmen gedacht :D
Für atlc stimmen Farben und Skalierungen nicht.

> Falls nicht könnte man die E-Feld Bitmaps pro Lage (die durch
> Referenzlagen getrennt sind) manuell zusammensetzen. Sähe sicher cool
> aus wenn man für den ganzen Stackup die E-Felder ausgeben und
> zusammenbauen würde. Da der Lagenaufbau i.d.R. symmetrisch ist, muss man
> die Bitmaps unten nur umdrehen.
>
> Ja wirklich sinnvoll ist das vielleicht nicht, aber cool ;-)

Klingt cool, ja :)
Mal gucken, ursprünglich wollte ich ja "nur" eine Platine layouten... 
8-)

von Grendel (Gast)


Lesenswert?

Benedikt H. schrieb:
> Mal gucken, ursprünglich wollte ich ja "nur" eine Platine layouten...
> 8-)

Ja ist so wie immer beim Hobby: Der Weg ist das Ziel! ;-)

von Benedikt H. (hunz)


Angehängte Dateien:

Lesenswert?

So, ich hab mal mit der atlc-Anbindung angefangen. Muss man im Moment 
noch manuell aufrufen, geht aber relativ einfach:
1
lua -i impedance.lua
Mit dem -i läuft der Interpreter danach weiter und man kann selber 
Funktionen aufrufen wie man will.
Für atlc gibts derzeit 2 Funktionen: export_atlc und run_atlc

* export_atlc exportiert nur das Bild für atlc, das sollte auf jedem OS 
laufen, sofern das GD Modul installiert ist. GD kann blöderweise aber 
nur 1Bit BMPs, daher schreibt export_atlc ein PNG, das muss man dann 
noch umwandeln.

* run_atlc exportiert das Bild, wandelt es mit convert (von Imagemagick) 
nach 24Bit BMP und ruft dann atlc auf. Alle atlc-Daten werden im atlc/ 
Unterverzeichnis abgelegt.

Die Benutzung ist recht einfach:
1
> run_atlc("l1_microstrip", 1, 0.14, 1)
2
atlc/l1_microstrip.bmp 3 Er_odd=   3.009 Er_even=   3.087 Zodd=  73.471 Zeven=  74.762 Zo=  74.114 Zdiff= 146.943 Zcomm=  37.381 Ohms VERSION=4.6.1
3
> run_atlc("l3_stripline", 3, 0.125, 1)
4
atlc/l3_stripline.bmp 3 Er_odd=   4.337 Er_even=   4.372 Zodd=  73.770 Zeven=  76.705 Zo=  75.223 Zdiff= 147.541 Zcomm=  38.352 Ohms VERSION=4.6.1

Argumente sind für run und export gleich:
1) filename ohne png Endung
2) Layer ID (hier 1, bzw. 3)
3) w (Leiterbreite in mm)
4) s (Leiterabstand in mm)

Das Ergebnis von atlc wird bisher nur direkt von atlc ausgegeben, 
automatisiert sweepen und Graph erstellen geht so noch nicht.

Ich hab im atlc mit dem microstrip-Aufbau scheinbar auch einen komischen 
Bug getriggert: Wenn ich nicht aussen herum noch ein GND-Rechteck male, 
kommt bei der Berechnung ziemlicher Mist raus. Lässt sich auch mit 
multi-dielectric.bmp aus den atlc-Examples reproduzieren - ich werd den 
atlc-Author deswegen mal anschreiben.

Ansonsten ist e_r für atlc im Moment fest auf 4.8 konfiguriert. Man kann 
auch ne eigene Farbe für ein custom e_r definieren. Ist nicht viel 
Aufwand, das noch einzubauen, aber noch ists nicht mit drin.
Die default e_r von atlc find ich auch etwas komisch:
Fibreglass PCB: 4.8
FR-4 PCB: 3.7
Es gibt bei FR4 ja ziemliche Schwankungen, aber 3.7 scheint mir etwas 
sehr niedrig. AppCAD sagt 4.6, das scheint mir realistischer zu sein, 
oder?

Stopplack könnte man natürlich auch noch mit reinnehmen, ich weiss aber 
nicht, was man da dann als Material/e_r nimmt und ob das so viel 
ausmacht.

Neben den Leiterbahnen fülle ich derzeit mit Luft auf. Macht da FR4 mehr 
Sinn? Letztendlich gibts da ja kein richtiges Füllmaterial, sondern das 
FR4 biegt sich halt durch.

von Reinhard Kern (Gast)


Lesenswert?

Benedikt H. schrieb:
> Letztendlich gibts da ja kein richtiges Füllmaterial, sondern das
> FR4 biegt sich halt durch.

Die Aussage dieses Satzes ist ziemlich rätselhaft. Grundsätzlich ist 
aber bei Stripline FR4 zwischen den Leiterbahnen, bei Microstrip ist 
neben den Leiterbahnen Luft, ebenso an der Aussenseite - das ist keine 
Frage des Programms, das ist die Realität der Fertigung! Man kann 
Lötstoplacke berücksichtigen, das ist aber ziemlich kompliziert, denn es 
ist nicht so einfach festzustellen, wie sich der Lack um die Konturen 
der Leiterbahnen verteilt.

Es gibt auch die Möglichkeit, aussenliegende Leiterbahnen zu versenken, 
entweder soweit dass sich eine glatte Oberfläche ergibt, oder auch so 
dass sie abgedeckt sind, aber das sind alles teure Sondertechnologien.

Ach so, vielleicht meinst du, die Lagen werden nur aufeinandergelegt: 
natürlich nicht, sie werden heiss verpresst, und das noch teilflüssige 
FR4-Material füllt alle Lücken aus. Klappt das nicht kann man den 
Multilayer in jedem Fall wegschmeissen, da interessiert auch die 
Impedanz nicht mehr.

Gruss Reinhard

von Grendel (Gast)


Lesenswert?

Benedikt H. schrieb:
> Die default e_r von atlc find ich auch etwas komisch:
> Fibreglass PCB: 4.8

Sollte einstellbar sein, auf keinen Fall fest das ist überall anders und 
ändert sich auch von Layer zu Layer je nachdem was für Prepregs und 
Cores man verwendet und wie der Harzgehalt ist.


Benedikt H. schrieb:
> Stopplack könnte man natürlich auch noch mit reinnehmen, ich weiss aber
> nicht, was man da dann als Material/e_r nimmt und ob das so viel
> ausmacht.

Ja das macht viel aus.

Benedikt H. schrieb:
> Neben den Leiterbahnen fülle ich derzeit mit Luft auf. Macht da FR4 mehr
> Sinn? Letztendlich gibts da ja kein richtiges Füllmaterial, sondern das
> FR4 biegt sich halt durch.

"FR4" ist Glasfasergewebe (wie ein Stück Stoff gewebt) mit Harz 
getränkt. Das wird in einer Presse verpresst und mindestens das Harz 
füllt  Zwischenräume auf. Und ja, das ist keinesfalls homogen...  ;-)

von hunz (Gast)


Lesenswert?

Ok, ich hab erstmal die Zwischenräume zwischen den Leitern von Luft auf 
FR-4 geändert. Unklar ist mir dabei aber, ob ich dann die Isolator-höhe 
über und unter der Kupferlage auch etwas reduzieren müsste.
Stopplack guck ich mal dass den noch mit einbaue.

von Reinhard Kern (Gast)


Lesenswert?

hunz schrieb:
> ob ich dann die Isolator-höhe
> über und unter der Kupferlage auch etwas reduzieren müsste.

Nein, die Angabe ist das endgültige Mass. Richtig ist, dass der 
Hersteller ein dickeres Prepreg verwenden muss, um die Lücken zu füllen, 
aber das ist sein Problem. Die Angaben im Padstack sind die Masse des 
fertigen Multilayers.

Du kannst das garnicht berücksichtigen, weil das vom Muster der Lage 
abhängt, das du nicht kennst: bei einer GND-Lage mit annähnernd 100 % 
Deckung muss man nichts zugeben, bei einer Lage mit wenig Leiterbahnen 
dagegen so viel wie das Kupfer dick ist. Gefüllt werden die Lücken 
natürlich immer nur von der Prepreg-Seite aus.

Gruss Reinhard

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
Noch kein Account? Hier anmelden.