Software: FEMM - Stromfluss - LUA-Script

Aus OptiYummy
Version vom 3. März 2020, 15:54 Uhr von WikiSysop (Diskussion | Beiträge) (→‎Script-Entwicklung)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

Simulation des ungetrimmten Widerstands
- LUA-Script -

In der vorherigen Übung (Elektrostatisches Feld) haben wir Erfahrung mit der Entwicklung von LUA-Scripten gewonnen. Die vollständige Parametrisierung mit allen konstruktiv und technologisch relevanten Parametern soll auch diesmal das Ziel für den Aufbau eines scriptbasierten FEM-Modells darstellen. Die Prozess-Schritte, welche wir soeben auf dem Niveau der grafischen Bedienoberfläche ausführten, werden wir unter diesem Aspekt als LUA-Script entwickeln.
Infolge der knappen Übungszeit beschränkt sich die Script-Entwicklung wieder auf das Nachvollziehen der vorgegebenen Script-Abschnitte (Copy & Paste). Dazu öffnen wir einen geeigneten Script-Editor (z.B. Crimson-Editor) und die LUA-Konsole des FEMM-Programms:
Teilnehmer der Lehrveranstaltung speichern die neue Textdatei als LaserTrimm_xx.LUA (xx=Teilnehmer-Nr.).

Script-Entwicklung

1. Parameter:

Wir werden weitestgehend die kompletten Dimensionierungsrechnungen in den Parameter-Abschnitt integrieren. Dabei berücksichtigen wir sofort die Abmessungen der Trimmkerbe, obwohl sie erst später im FEM-Modell benötigt werden.

Software FEMM - Stromfluss - L-Schnittt.gif

Man kann die "Parameter" in zwei Gruppen einteilen:

a) Funktionelle und technologische Parameter
Hier kann der Modell-Nutzer seine speziellen Anforderungen an den Widerstand und die technologischen Prozessgrößen in Form von Werten vorgeben:
-- Funktionelle und technologische Parameter
   xx=00;     -- Teilnehmer-Nr. 00 bis 50
   s=25;      -- Schnittbreite des Laser-Strahls [µm]
   Ls=500;    -- aktuelle Länge L-Schnitt [µm]
   bz=200;    -- Breite eines Zuschlags für Fertigung [µm]
   d=20;      -- Schichtdicke in µm = Dicke 2D-Elemente
   RF=100;    -- Nennwert Flächenwiderstand der Paste [Ohm/Quadrat]
   Pmax=6.2;  -- max. zul. Leistungsdichte in Paste [W/cm²]
   RN=240;    -- Nennwert nach Trimmen [Ohm]
   Szul=0.02; -- zulässige relative Toleranz von RN
   PV=0.2;    -- max. Verlustleistung im Betrieb [W]
   SF=0.3;    -- Fertigungsstreuung ungetrimmter Widerstand (rel.)
b) Berechnete Geometrie- und Material-Parameter
Im Unterschied zur manuellen Dimensionierung werden im Folgenden die berechneten geometrischen Größen nicht gerundet. Da dies für die Fertigung keine Bedeutung hat, werden die berechneten "krummen" Werte verwendet:
-- Berechnete Geometrie- und Material-Parameter
   Ru=RN*(1-SF)*(1+Szul);       -- notw. Nennwert ungetrimmter Widerstand [Ohm]
   PWCR=Pmax*0.5;               -- Leistungsdichte Worst-Case-Resistor [W/cm²]
   Bu= sqrt(PV*RF/(PWCR*Ru))*cm/um; -- Breite Widerstand [cm] -> [µm]
   L=Bu*Ru/RF;                  -- Länge des Widerstands [µm]
   R0=(1-xx/100)*Ru;            -- konkreter Wert ungetrimmter Widerstand [Ohm]
   bk=Bu*(0.05+1.05*(1-R0/RN))+bz; -- Breite der Trimmkerbe für P-Schnitt [µm]
                                -- mit 5% Druck- und Pos.-Toleranz und Zuschlag
   Kappa=1/((1-xx/100)*RF*d*um);-- spez. Leitfähigkeit (konkr.Teilnehmer) [S/m]
-- Kontrollausgabe auf die LUA-Konsole:
   showconsole(); -- LUA-Konsole öffnen, falls Script als Datei ausgeführt
   print ("Ru    =",Ru,"[Ohm]");
   print ("Bu    =",Bu,"[µm]");
   print ("L     =",L,"[µm]");
   print ("bk    =",bk,"[µm]");
   print ("Kappa =",Kappa,"[S/m]");
   print ("R0    =",R0,"[Ohm] -> 'Sollwert' vor dem Trimmen in FEM-Rechnung!");

2. Definition des Problem-Typs

-- Definition des Problem-Typs ================================================
   create(3);        -- 0=magnetic|1=electrostatic|2=heatflow|3=currentflow
   ci_probdef("micrometers","planar",0,1e-8,d,30);
                     -- 1e-8=Max.Fehler für Solver
                     -- 30° =Min.Winkel für Netz

3. Geometrie

Die markanten Punkte der Geometrie sind laut folgender Skizze durchnummeriert:

Software FEMM - Stromfluss - LUA-Script ungetrimmt nodes.gif
-- Geometrie (alle Abmessungen in µm!)=========================================
   ci_seteditmode ("nodes") -- ungetrimmtes Rechteck *************************
   x01= 0; y01= 0; ci_addnode (x01,y01);
   x02= 0; y02= Bu; ci_addnode (x02,y02);
   x03= L; y03= Bu; ci_addnode (x03,y03);
   x04= L; y04= 0; ci_addnode (x04,y04);
   ci_zoomnatural(); ci_zoomout(); -- Zoom einschließlich Kanten im Bild
   ci_seteditmode ("segments")
   ci_addsegment ( x01,y01 , x02,y02 );
   ci_addsegment ( x02,y02 , x03,y03 );
   ci_addsegment ( x03,y03 , x04,y04 );
   ci_addsegment ( x04,y04 , x01,y01 );


4. Material der Paste

Das Block-Label für die Definition des Pasten-Bereiches muss unabhängig von den Abmessungen immer innerhalb des Rechtecks liegen. Außerdem darf dieses Label nicht mit dem späteren L-Schnitt kollidieren. Deshalb wird das Label unterhalb des oberen Rechteck-Randes mittig platziert. Global soll eine automatische Vernetzung des gesamten Bereiches erfolgen. Nur an kritischen Stellen wird die Maschengröße an den Segmenten des Randes individuell angepasst:

-- Material fuer Widerstand (Mesh Size=Auto) ==================================
-- ci_addmaterial ("name", ox, oy, ex, ey, ltx, lty)
                  -- ox,oy = el.Leistfähigkeit [S/m]
                  -- ex,ey = rel. el. Dielektrizitätskonst.
                  -- ltx,lty= Umpolarisierungsverluste
   ci_addmaterial ("Paste", Kappa, Kappa, 1, 1, 0, 0); -- Paste
   ci_seteditmode ("blocks") -- Label wegen L-Schnitt mittig 1/10 vom oberem Rand
   x0_Paste= 0.5*L; y0_Paste= 0.9*Bu;
   ci_addblocklabel(x0_Paste, y0_Paste); ci_selectlabel (x0_Paste,y0_Paste); 
-- ci_setblockprop("blockname", automesh, meshsize, group);
   ci_setblockprop ("Paste"   , 1       , 0       , 0);   ci_clearselected();

5. Randbedingungen (Conductor Property)

Segmente, welche mit Randbedingungen versehen sind, sollten hinreichend fein vernetzt werden. Unabhängig von den konkreten Abmessungen wird im Beispiel eine Maschengröße von 1/50 der Segmentlänge definiert:

-- Randbedingungen über Conductor Property mit Vorgabe Maschengröße ===========
-- 
-- ci_addconductorprop ("name",    v,     c,      type: 1=v/0=c)
   ci_addconductorprop ("Null",    0,     0        ,    1 );--voltage
   ci_addconductorprop ("Strom",   0,     0.01     ,    0 );--current
   ci_seteditmode ("segments") 
-- ci_selectsegment(x,y) -> Mitte xs,ys des Segments P1,P2 nutzen:
--                          xs=x1+(x2-x1)/2;   ys=y1+(y2-y1)/2;
-- Links mit Nullpotential (SegL= 01...02) 
   xs_L=x01+(x01-x02)/2;   ys_L=y01+(y02-y01)/2;
   ci_selectsegment(xs_L,ys_L);
-- ci_setsegmentprop("bound.",elem.size,automesh,hide,group,"cond.name")
   ci_setsegmentprop("<None>",Bu/50    , 0      , 0  , 0   , "Null");
   ci_clearselected();
-- Rechts mit Stromeinspeisung (SegR= 03...04)
   xs_R=x03+(x04-x03)/2; ys_R=y03+(y04-y03)/2;
   ci_selectsegment(xs_R,ys_R);
   ci_setsegmentprop("<None>",Bu/50    , 0      , 0  , 0   , "Strom");
   ci_clearselected();

6. Vernetzung und Berechnung

Software FEMM - Stromfluss - LUA-Script ungetrimmt netz.gif
-- Vernetzung und Berechnung ==================================================
   ci_saveas("LaserTrimm.fec"); -- Speichern in Ordner der LUA-Datei
   ci_createmesh(); --> nur gespeichertes Modell wird vernetzt!
   ci_analyze(1); -- Solverfenster 1=minimiert / 0=sichtbar
   ci_loadsolution(); -- öffnet Ergebnisfenster für Postprozess

7. Ergebnisse (Postprcessing)

Software FEMM - Stromfluss - LUA-Script ungetrimmt ergebnisfeld.gif
-- Felddarstellung (normiert) und Widerstandsberechnung =======================
   v,i = co_getconductorproperties("Strom");
   R = v/i; 
   co_showmesh();
   co_zoomnatural(); co_zoomout(); -- Zoom einschließlich Kanten im Bild
-- co_showdensityplot(legend,gscale,upper_D,lower_D,type);
-- 0|1 0=color, min , max , 0=V|1=D|2=E
   co_showdensityplot( 1 , 0 , 0 , v , 0 );
   co_showcontourplot(20,0,v);     -- blendet 20 Aequipotentiallinien ein 
   print ("R=", R, "[Ohm]")        -- Werte in Outputfeld der LUA-Konsole
   print (" mit v=", v, "[V]");
   print (" und i=", i, "[A]");