Esempio n. 1
0
def smp_connector(em,
                  x,
                  y,
                  z,
                  zmax,
                  coax_port_length=0.2e-3,
                  pin_diameter=0.85e-3):
    copper_shield = openems.Metal(em, 'smp_shield')
    copper = openems.Metal(em, 'smp_pin')
    lcp = openems.Dielectric(em, 'lcp', eps_r=3.2)

    # shield
    outside = np.array([[-2.5, 1.0], [-2.5, 2.5], [2.5, 2.5], [2.5, -2.5],
                        [-2.5, -2.5], [-2.5, -1.0]]) * 1e-3
    angle = np.arcsin(1.0 / 2.25)
    inside = openems.arc(0, 0, 4.5e-3 / 2.0, -np.pi + angle, np.pi - angle)
    openems.Polygon(copper_shield,
                    priority=9,
                    pcb_layer=None,
                    points=[x, y] + np.concatenate((inside, outside)),
                    elevation=[z, z + 0.9e-3],
                    normal_direction='z')

    outside = np.array([[0, 2.5], [2.5, 2.5], [2.5, -2.5], [0, -2.5]]) * 1e-3
    inside = openems.arc(0, 0, 1.95e-3 / 2.0, -np.pi * 0.5, np.pi * 0.5)
    openems.Polygon(copper_shield,
                    priority=9,
                    pcb_layer=None,
                    points=[x, y] + np.concatenate((inside, outside)),
                    elevation=[z + 0.9e-3, zmax],
                    normal_direction='z').duplicate().mirror('x')

    # pin
    start = np.array([x, y, zmax - coax_port_length])
    stop = np.array([x, y, z + 0.9e-3])
    copper.AddCylinder(start, stop, 0.5 * pin_diameter, priority=9)

    # smaller part of pin
    stop[2] = z
    copper.AddCylinder(start, stop, 0.5 * 0.8e-3, priority=9)

    # insulator
    start = np.array([x, y, z])
    stop = np.array([x, y, z + 0.9e-3])
    lcp.AddCylinder(start, stop, 4.5e-3 * 0.5, priority=1)

    if coax_port_length != 0:
        # port (coax)
        start = [
            x + 0.5 * coax_port_length, y + 0.5 * coax_port_length,
            zmax - coax_port_length
        ]
        stop = [x - 0.5 * coax_port_length, y - 0.5 * coax_port_length, zmax]
        openems.Port(em, start, stop, direction='z', z=50)
        em.mesh.AddLine('z', start[2])
Esempio n. 2
0
#!/usr/bin/env python3
import sys
import openems
import numpy as np

mm = 1e-3 # default unit is the meter
em = openems.OpenEMS(sys.argv[1], EndCriteria = 1e-6, fmin = 0e6, fmax = 60e9)
em.fsteps = 801
copper = openems.Metal(em, 'copper')
sub = openems.Dielectric(em, 'substrate', eps_r=3.2)
mask = openems.Dielectric(em, 'mask', eps_r=3.3)
air = openems.Dielectric(em, 'air', eps_r=1.0006)

foil_thickness = 0.035*mm
port_length = 0.05*mm
box_length = 5*mm
box_width = 1.5*mm
ms_width = 0.190*mm
box_top = 1.5*mm

# dimensions Z
substrate_top = 0.102*mm
foil_top = substrate_top + foil_thickness
em.resolution = 50e-6

em.mesh.AddLine('z', foil_top + box_top)
em.mesh.AddLine('z', -0.5*mm)

# substrate
start = np.array([-0.5*box_length, 0.5*box_width, 0])
stop  = np.array([0.5*box_length, -0.5*box_width, substrate_top])
Esempio n. 3
0
def generate(
        em,
        substrate,
        z,  # [bottom of substrate, top of substrate, top of metal]
        y1=5.5 * mm,
        y2=0.9 * mm,
        r=0.5 * mm,
        rv=[200, 200, 200, 200],
        w=[0.127 * mm, 0.152 * mm, 0.19 * mm, 0.23 * mm],
        port_length=0.2 * mm,
        ms_width=0.36 * mm,
        endspace=0.5 * mm,
        resistor_size='0402'):
    alumina = openems.Dielectric(em, 'alumina', eps_r=9.8)
    metal = openems.Metal(em, 'pec_wilkinson')
    n = len(rv)

    # substrate
    start = np.array([(n * 4 - 1) * r + endspace, y1 + r + endspace, z[0]])
    stop = np.array([-1.0 * endspace, -1.0 * start[1], z[1]])
    substrate.AddBox(start, stop, 1)

    # common port line (pad 1)
    start = np.array([-1.0 * endspace + port_length, 0.5 * ms_width, z[1]])
    stop = np.array([0, -0.5 * ms_width, z[2]])
    metal.AddBox(start, stop, priority=9, padname='1')

    lo = arc(r, -y1, r + 0.5 * w[0], pi, 2 * pi, 16)
    li = arc(r, -y1, r - 0.5 * w[0], pi, 2 * pi, 16)
    lo = cat((lo, arc(3 * r, -y2, r - 0.5 * w[0], pi, 0.55 * pi, 16)))
    li = cat((li, arc(3 * r, -y2, r + 0.5 * w[0], pi, 0.55 * pi, 16)))
    for i in range(n - 1):
        x = (4 * i + 3) * r
        w2 = w[1 + i]
        em.mesh.AddLine('x', x + r - 0.5 * w2)
        em.mesh.AddLine('x', x + r + 0.5 * w2)
        em.mesh.AddLine('x', x + 3 * r - 0.5 * w2)
        em.mesh.AddLine('x', x + 3 * r + 0.5 * w2)
        lo = cat((lo, arc(x, -y2, r - 0.5 * w2, 0.45 * pi, 0, 16)))
        li = cat((li, arc(x, -y2, r + 0.5 * w2, 0.45 * pi, 0, 16)))
        lo = cat((lo, arc(2 * r + x, -y1, r + 0.5 * w2, pi, 2 * pi, 16)))
        li = cat((li, arc(2 * r + x, -y1, r - 0.5 * w2, pi, 2 * pi, 16)))
        lo = cat((lo, arc(4 * r + x, -y2, r - 0.5 * w2, pi, 0.55 * pi, 16)))
        li = cat((li, arc(4 * r + x, -y2, r + 0.5 * w2, pi, 0.55 * pi, 16)))
    l = cat((lo, li[::-1]))
    l = cat((l[::-1] * [1, -1], l))
    openems.Polygon(metal,
                    priority=9,
                    points=l,
                    elevation=z[1:],
                    normal_direction='z',
                    pcb_layer='F.Cu',
                    pcb_width=0.001)

    # x at 2 port side
    x0 = (n * 4 - 1) * r + endspace
    x1 = x0 - port_length

    # output lines
    for (ym, padname) in [(1, 2), (-1, 3)]:
        start = np.array([x1, ym * 0.2 * mm, z[1]])
        stop = np.array([(n * 4 - 1) * r - 0.1 * mm,
                         ym * (0.2 * mm + ms_width), z[2]])
        lp2 = metal.AddBox(start, stop, priority=9, padname=padname)

    # main line port
    start = [-1.0 * endspace, -0.5 * ms_width, z[1]]
    stop = [-1.0 * endspace + port_length, 0.5 * ms_width, z[2]]
    openems.Port(em, start, stop, direction='x', z=50)

    # coupled line ports
    for ym in [-1, 1]:
        start = [x0 - port_length, ym * 0.2 * mm, z[1]]
        stop = [x0, ym * (0.2 * mm + ms_width), z[2]]
        openems.Port(em, start, stop, direction='x', z=50)

    for i in range(n):
        if not rv[i]:
            continue
        em.add_resistor('r{}'.format(i),
                        origin=np.array([4 * r * i + 3 * r, 0, z[2]]),
                        direction='y',
                        value=rv[i],
                        invert=False,
                        priority=9,
                        dielectric=alumina,
                        metal=metal,
                        element_down=False,
                        size=resistor_size)
Esempio n. 4
0
fc = 6e9

foil_thickness = 35e-6
substrate_thickness = 100e-6

z = np.zeros(6)
z[1] = 1.6e-3
z[2] = z[1] + foil_thickness
z[3] = z[2] + substrate_thickness
z[4] = z[3] + foil_thickness
z[5] = z[4] + 1.6e-3

openems.LPF_DGS_bowtie.generate(
    em,
    sub = openems.Dielectric(em, 'polyimide', eps_r=3.2, tand=0.002, fc=fc),
    mask = openems.Dielectric(em, 'soldermask', eps_r=3.3, tand=0.020, fc=fc),
    min_width = 152e-6,
    cutout_width = 1.0e-3,
    inductors = 0.15e-3 + 1.55*np.array([1.7e-3, 1.96e-3, 2e-3]),
    capacitors = 1.45*np.array([0.47e-3, 0.77e-3, 0.81e-3, 0.82e-3]),
    z = z,
    port_length = 75e-6,
    ms_width = 195e-6,
    box_width = 3e-3)

em.write_kicad(em.name)
command = 'view solve'
if len(sys.argv) > 1:
    command = sys.argv[1]
em.run_openems(command)
Esempio n. 5
0
#!/usr/bin/env python3
import sys
from scipy.constants import pi, c, epsilon_0, mu_0, mil, inch

mm = 0.001
import openems
import openems.lpf
import numpy as np

em = openems.OpenEMS('lpf_6')
em.end_criteria = 1e-6
em.fmin = 1e6
em.fmax = 20e9
em.fsteps = 1601
fc = 6e9
sub = openems.Dielectric(em, 'fr408', eps_r=3.66, tand=0.012, fc=fc)

foil_thickness = 0.035 * mm
substrate_thickness = 6.6 * mil
ms_air_above = 1.0 * mm
z = [0.0, substrate_thickness, substrate_thickness + foil_thickness]
em.mesh.AddLine('z', z[2] + ms_air_above)

from math import sqrt

em.resolution = c / (em.fmax * sqrt(3.0)) / 100.0

lpf = openems.lpf.generate(em,
                           sub=sub,
                           z=z,
                           port_length=0.1 * mm,
Esempio n. 6
0
#!/usr/bin/env python3
# Common SMA edge launch to OSHPark 4 layer
import sys
from scipy.constants import mil
import openems
import numpy as np

em = openems.OpenEMS('sma_el',
                     EndCriteria=1e-6,
                     fmin=0,
                     fmax=20e9,
                     fsteps=1001)
em.resolution = 8e-5
copper = openems.Metal(em, 'copper')
copper_shield = openems.Metal(em, 'copper_shield')
sub = openems.Dielectric(em, 'ro4350b', eps_r=3.66, tand=0.0035, fc=em.fmax)
teflon = openems.Dielectric(em, 'teflon', eps_r=2.1, tand=0.0002, fc=em.fmax)

foil_thickness = 35e-6
substrate_thickness = 62 * mil - 7 * mil
port_length = 300e-6
box_length = 10e-3
box_width = 6e-3
box_height = 6e-3
ms_width = 1.0e-3
board_gap = 0.0

# coax
coax_scale = 2.0
pin_diameter = 0.5e-3 * coax_scale
dielectric_diameter = 1.67e-3 * coax_scale
Esempio n. 7
0
#!/usr/bin/env python3
import sys
from scipy.constants import pi, c, epsilon_0, mu_0, mil, inch
mm = 0.001
import openems
import openems.miter
import numpy as np

em = openems.OpenEMS('miter_6.6')
em.end_criteria = 1e-6
em.fmin = 0
em.fmax = 40e9
em.fsteps = 1601
fc = 40e9
pec = openems.Metal(em, 'pec')
sub = openems.Dielectric(em, 'ro4350b', eps_r=3.66, tand=0.0035, fc=fc)

foil_thickness = 0.033*mm
substrate_thickness = 6.6*mil
ms_air_above = 1.0*mm
z = [0.0, substrate_thickness, substrate_thickness + foil_thickness]
em.mesh.AddLine('z', z[2] + ms_air_above)

em.resolution = 50e-6

openems.miter.generate(
    em,
    pec,
    sub,
    miter = 0.35 * mm,
    z = z,
Esempio n. 8
0
import sys
mm = 0.001  # mm in meters
mil = 25.4e-6  # mil in meters
import openems
import openems.geometries
import numpy as np

em = openems.OpenEMS('via_1_3_oshpark',
                     EndCriteria=1e-4,
                     fmin=0e6,
                     fmax=40e9,
                     boundaries=['PEC', 'PEC', 'PEC', 'PEC', 'PEC', 'PEC'],
                     fsteps=801)
copper = openems.Metal(em, 'copper')
pcopper = openems.Metal(em, 'pcopper')
sub1 = openems.Dielectric(em, 'substrate', eps_r=3.2)
sub2 = openems.Dielectric(em, 'substrate', eps_r=4)

sub1t = 0.166 * mm
sub2t = 47 * mil

ifoil = 0.0125 * mm
ofoil = 0.035 * mm
port_length = 0.1 * mm
box_length = 5 * mm
box_width = 2 * mm
sl_width = 0.24 * mm
ms_width = 0.35 * mm
airspace = 1 * mm

bt = sub1t + ofoil
Esempio n. 9
0
mm = 0.001
import openems
import openems.idbpf
import numpy as np

em = openems.OpenEMS('idbpf_b3', fmin=1e6, fmax=16e9)
em.end_criteria = 1e-10
em.fsteps = 1601
fc = 7.12e9
eps_r = 3.66
#em.add_lossy_metal('copper', frequency=fc, conductivity=56e6/3, ur=1.0)
openems.Metal(em, 'copper')
openems.Metal(em, 'pec')
#em.via_offset_x = 5*mil
#em.via_offset_y = 5*mil
openems.Dielectric(em, 'sub', eps_r=eps_r).set_tanD(0.0035, freq=fc)

foil_thickness = 0.035 * mm
substrate_thickness = 22 * mil
ms_air_above = 2.0 * mm
via = 0.3 * mm
via_pad = 0.6 * mm

# dimensions Z
substrate_bottom = 0.0
substrate_top = substrate_bottom + substrate_thickness
foil_top = substrate_top + foil_thickness
em.mesh.add_z(foil_top + ms_air_above)

from math import sqrt
Esempio n. 10
0
#!/usr/bin/env python3
import sys
from scipy.constants import pi, c, epsilon_0, mu_0, mil, inch
mm = 0.001
import openems
import openems.idbpf_tapped
import numpy as np

idx = int(sys.argv[1])
name = 'idbpf_{}'.format(idx)
fmax = [0, 0, 0, 8e9, 8e9, 10e9, 12e9][idx]
em = openems.OpenEMS(name, fmin=0, fmax=fmax, fsteps=400, EndCriteria=1e-5)
fc = [0, 0, 0, 3e9, 4e9, 5e9, 6e9][idx]
pec = openems.Metal(em, 'pec')
sub = openems.Dielectric(em, 'sub', eps_r=3.3, tand=0.012, fc=fc)

foil_thickness = 0.04 * mm
substrate_thickness = 0.18 * mm
ms_air_above = 1.0 * mm
via = 0.4 * mm
via_pad = 0.8 * mm

# dimensions Z
substrate_bottom = 0.0
substrate_top = substrate_bottom + substrate_thickness
foil_top = substrate_top + foil_thickness
em.mesh.AddLine('z', foil_top + ms_air_above)

em.resolution = [0.1 * mm, 0.04 * mm, 0.5 * mm]

rl = [0, 0, 0, 14.4 * mm, 10.8 * mm, 8.5 * mm, 7.1 * mm][idx]
Esempio n. 11
0
#!/usr/bin/env python3
import sys
from scipy.constants import pi, c, epsilon_0, mu_0, mil
mm = 0.001
import openems
import numpy as np

em = openems.OpenEMS('line', EndCriteria = 1e-6)
em.fmin = 1e6
em.fmax = 40e9
em.fsteps = 1601
fc = 40e9
pec = openems.Metal(em, 'pec')
sub = openems.Dielectric(em, 'fr4', eps_r=3.9, tand=0.0035, fc=fc)
foil_thickness = 0.6*mil
substrate_thickness = 0.2*mm
ms_air_above = 0.36*mm
port_length = 0.1*mm
box_length = 10*mm
box_width = 1*mm
ms_width = 0.2*mm
# dimensions Z
substrate_bottom = 0.0
substrate_top = substrate_bottom + substrate_thickness
foil_top = substrate_top + foil_thickness

from math import sqrt
em.resolution = c/(em.fmax*sqrt(3.0))/100.0

# substrate
start = np.array([0.5*box_length, 0.5*box_width, substrate_bottom])