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:
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.
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
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:
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/
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
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 :)
> 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 ;-)
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-)
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! ;-)
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:
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.
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
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... ;-)
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.
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