Compare commits

...
Sign in to create a new pull request.

76 commits
wip ... main

Author SHA1 Message Date
jaseg
8c76006f5f Update paper for newer submission template 2025-02-17 16:52:54 +01:00
jaseg
99d4905880 Final version for TPEL submission 2025-01-27 18:43:21 +01:00
jaseg
cfae60ee68 paper: update comment on git repo url 2025-01-27 18:41:46 +01:00
jaseg
d0856a7efe Update graphics todo 2025-01-27 18:40:16 +01:00
jaseg
5cc5110d6b Fix paper date 2025-01-27 18:38:30 +01:00
jaseg
540d02be25 Add setup photo 2025-01-27 18:36:06 +01:00
jaseg
6540f6ff0f Fix up version logic 2025-01-27 18:06:31 +01:00
jaseg
522857cf73 paper: Add emergencity acknowledgement 2025-01-27 18:05:44 +01:00
jaseg
2d2118e7b3 Include Hendrik's comments 2025-01-24 12:10:45 +01:00
jaseg
1caddd0757 Update bibliography 2025-01-24 11:59:31 +01:00
jaseg
ac92394866 Last updates 2024-12-11 17:11:29 +01:00
jaseg
7a54792439 Improve table layout 2024-12-11 14:13:21 +01:00
jaseg
7703eddfad Shorten big table by removing k=1/2 cases 2024-12-11 14:10:40 +01:00
jaseg
a4faa49955 Update bibliography 2024-12-11 14:09:14 +01:00
jaseg
56f96463d8 Improve related work on rotating WPT 2024-12-11 14:08:46 +01:00
jaseg
8376dea009 Update bibliography 2024-12-11 13:37:51 +01:00
jaseg
2f13da79f6 Straighten up citations. 2024-12-11 13:37:24 +01:00
jaseg
26ed0a40d6 More WIP 2024-12-10 18:04:09 +01:00
jaseg
bf275d75f3 Rework WIP 2024-12-10 18:01:19 +01:00
jaseg
3a972912fd More rework, shorten 2024-12-09 18:16:00 +01:00
jaseg
aa443a5d52 Revision work 2024-12-09 17:34:31 +01:00
jaseg
59d1f34d56 Include reference to torus knots 2024-12-05 18:01:30 +01:00
jaseg
d4907fd11c Add more TODOs from Leo's review 2024-12-05 16:56:39 +01:00
jaseg
59fcb1f4d4 More fixes 2024-12-05 15:22:41 +01:00
jaseg
4d0fab0248 More Leo fixes 2024-12-03 13:07:45 +01:00
jaseg
51abb45ce2 Incorporate first batch of Leo's comments 2024-12-03 12:57:02 +01:00
jaseg
f43e604546 paper: add todos from leo 2024-11-21 17:26:09 +01:00
jaseg
fcbd119f57 Fix reference bug 2024-11-14 15:45:17 +01:00
jaseg
9077146920 Compact paper a bit 2024-11-14 15:43:52 +01:00
jaseg
e57a19a0fb Reformat for IEEE draft submission template variant 2024-11-14 13:51:37 +01:00
jaseg
7ba4e330ef Add abstract, fix some of the layout borkage 2024-11-13 22:00:50 +01:00
jaseg
aacb58c567 Finish first proof of paper 2024-11-13 21:49:17 +01:00
jaseg
180547dc7a Remove future work that we already did 2024-11-13 19:58:03 +01:00
jaseg
82eaace7fa paper: more text 2024-11-13 10:06:26 +01:00
jaseg
53a9b9f87c annotate tables 2024-11-13 09:43:08 +01:00
jaseg
0ee750496f Add total ripple plot 2024-11-13 09:07:15 +01:00
jaseg
453398c7c0 Add big data table 2024-11-13 07:31:34 +01:00
jaseg
22befa272b Paper: Add tabular wide coil results 2024-11-12 17:58:55 +01:00
jaseg
85bc4b3f91 First proof intro and related work done. 2024-11-08 19:31:16 +01:00
jaseg
ea1f14ce41 First proof partially done, add contributions section. 2024-11-08 19:27:03 +01:00
jaseg
d103b16e03 Related work mostly done 2024-11-08 17:59:27 +01:00
jaseg
ded9947d11 Related work WIP 2024-11-08 15:46:16 +01:00
jaseg
a25619a07a Related work WIP 2024-11-05 19:45:32 +01:00
jaseg
424402c3ae Work on related work 2024-10-31 17:33:31 +01:00
jaseg
32d11e4672 More work on related work section 2024-10-30 18:01:21 +01:00
jaseg
87f83fdb95 Extend related work section 2024-10-30 12:17:50 +01:00
jaseg
77a54510bd Fix typo 2024-10-29 18:24:06 +01:00
jaseg
7b7704cc30 Add fleming citation on counterwound planar coils 2024-10-29 18:23:33 +01:00
jaseg
9385c8f013 Add scan todo 2024-10-29 18:21:21 +01:00
jaseg
3fbfa4ffb6 Add citations to woven coil related work 2024-10-29 18:17:20 +01:00
jaseg
3d214630f6 Fix layout 2024-10-29 18:05:45 +01:00
jaseg
befc1aae0d Add related work on old coils, rename trace pair to inversion 2024-10-29 18:02:54 +01:00
jaseg
8e54fb69b4 Add wide coil exports 2024-10-26 12:16:46 +02:00
jaseg
2f1c7daa0a Export wide coil specimens 2024-10-25 17:52:17 +02:00
jaseg
62f443c3d6 gen: Add via stagger options 2024-10-25 12:48:21 +02:00
jaseg
8ba908c58e WIP 2024-10-14 14:23:52 +02:00
jaseg
44b2bb5fe2 WIP 2024-10-14 13:43:46 +02:00
jaseg
1dbf9abeae Paper text WIP 2024-10-11 16:11:42 +02:00
jaseg
55993ec1b8 Add missing plot 2024-10-11 10:55:04 +02:00
jaseg
a3c4c44e6e Paper WIP 2024-10-10 18:18:34 +02:00
jaseg
f450e4fded Extract inductace sims for the paper 2024-10-09 15:12:57 +02:00
jaseg
d310493e93 Revert "Work on Elmer sims"
This reverts commit cb81979a7f.
2024-10-08 16:18:57 +02:00
jaseg
8577c6209f Revert "More Elmer WIP"
This reverts commit 80294f98c2.
2024-10-08 16:15:28 +02:00
jaseg
ed9e1d3e53 Paper WIP 2024-10-04 17:30:12 +02:00
jaseg
f212246d62 Add more plots 2024-10-02 16:51:55 +02:00
jaseg
6085a62b10 Add more plots 2024-10-02 16:42:29 +02:00
jaseg
7db1999012 paper: Add coupling experiment section 2024-09-26 18:51:54 +02:00
jaseg
e324240250 Update experimental section with results 2024-09-26 18:30:32 +02:00
jaseg
a4adfcfc6e Add first measurement plots 2024-09-24 18:11:55 +02:00
jaseg
80294f98c2 More Elmer WIP 2024-09-23 19:25:11 +02:00
jaseg
70d37e1950 paper: Work on spiral parametrization 2024-09-20 16:44:57 +02:00
jaseg
7abc27c8b8 Update plots 2024-09-19 17:30:57 +02:00
jaseg
f9b584e7a8 Add nice plots 2024-09-19 17:07:52 +02:00
jaseg
96e8bad4eb sim WIP 2024-09-13 17:52:20 +02:00
jaseg
7d717fb5c5 spirals WIP 2024-09-11 10:17:53 +02:00
jaseg
c643d0747a Paper structure WIP 2024-09-10 15:25:39 +02:00
69 changed files with 1894766 additions and 87 deletions

1480
Spiral plots.ipynb Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,21 +1,3 @@
Coil_Solver:
Equation: CoilSolver
Procedure: '"CoilSolver" "CoilSolver"'
Linear System Solver: Iterative
Linear System Preconditioning: ILU1
Linear System Max Iterations: 1000
Linear System Convergence Tolerance: 1e-10
Linear System Iterative Method: BiCGStab
Linear System Residual Output: 10
Steady State Convergence Tolerance: 1e-06
Normalize Coil Current: True
Nonlinear System Consistent Norm: True
Coil Closed: True
Narrow Interface: True
Save Coil Set: True
Save Coil Index: True
Calculate Elemental Fields: True
Static_Current_Conduction: Static_Current_Conduction:
Equation: Static Current Conduction Equation: Static Current Conduction
Variable: Potential Variable: Potential

View file

@ -208,13 +208,13 @@ def inductance(mesh_file, sim_dir, solver_method):
fr4 = elmer.load_material('fr4', sim, 'coil_mag_materials.yml') fr4 = elmer.load_material('fr4', sim, 'coil_mag_materials.yml')
copper = elmer.load_material('copper', sim, 'coil_mag_materials.yml') copper = elmer.load_material('copper', sim, 'coil_mag_materials.yml')
solver_coil = elmer.load_solver('Coil_Solver', sim, 'coil_mag_solvers.yml') solver_current = elmer.load_solver('Static_Current_Conduction', sim, 'coil_mag_solvers.yml')
solver_magdyn = elmer.load_solver('Magneto_Dynamics', sim, 'coil_mag_solvers.yml') solver_magdyn = elmer.load_solver('Magneto_Dynamics', sim, 'coil_mag_solvers.yml')
if solver_method: if solver_method:
solver_magdyn.data['Linear System Iterative Method'] = solver_method solver_magdyn.data['Linear System Iterative Method'] = solver_method
solver_magdyn_calc = elmer.load_solver('Magneto_Dynamics_Calculations', sim, 'coil_mag_solvers.yml') solver_magdyn_calc = elmer.load_solver('Magneto_Dynamics_Calculations', sim, 'coil_mag_solvers.yml')
copper_eqn = elmer.Equation(sim, 'copperEqn', [solver_coil, solver_magdyn, solver_magdyn_calc]) copper_eqn = elmer.Equation(sim, 'copperEqn', [solver_current, solver_magdyn, solver_magdyn_calc])
air_eqn = elmer.Equation(sim, 'airEqn', [solver_magdyn, solver_magdyn_calc]) air_eqn = elmer.Equation(sim, 'airEqn', [solver_magdyn, solver_magdyn_calc])
bdy_trace = elmer.Body(sim, 'trace', [physical['trace'][1]]) bdy_trace = elmer.Body(sim, 'trace', [physical['trace'][1]])
@ -237,20 +237,20 @@ def inductance(mesh_file, sim_dir, solver_method):
bdy_if_bottom.material = copper bdy_if_bottom.material = copper
bdy_if_bottom.equation = copper_eqn bdy_if_bottom.equation = copper_eqn
comp_coil = elmer.Component(sim, 'Coil', [bdy_trace]) potential_force = elmer.BodyForce(sim, 'electric_potential', {'Electric Potential': 'Equals "Potential"'})
comp_coil.data['Desired Current Density'] = 'Real 1.0' bdy_trace.body_force = potential_force
current_force = elmer.BodyForce(sim, 'Source', {
'Current Density 1': 'Equals "CoilCurrent e 1"',
'Current Density 2': 'Equals "CoilCurrent e 2"',
'Current Density 3': 'Equals "CoilCurrent e 3"',
})
bdy_trace.body_force = current_force
# boundaries # boundaries
boundary_airbox = elmer.Boundary(sim, 'FarField', [physical['airbox_surface'][1]]) boundary_airbox = elmer.Boundary(sim, 'FarField', [physical['airbox_surface'][1]])
boundary_airbox.data['Electric Infinity BC'] = 'True' boundary_airbox.data['Electric Infinity BC'] = 'True'
boundary_vplus = elmer.Boundary(sim, 'Vplus', [physical['interface_top'][1]])
boundary_vplus.data['Potential'] = 1.0
boundary_vplus.data['Save Scalars'] = True
boundary_vminus = elmer.Boundary(sim, 'Vminus', [physical['interface_bottom'][1]])
boundary_vminus.data['Potential'] = 0.0
with tempfile.TemporaryDirectory() as tmpdir: with tempfile.TemporaryDirectory() as tmpdir:
tmpdir = sim_dir if sim_dir else Path(tmpdir) tmpdir = sim_dir if sim_dir else Path(tmpdir)
@ -261,8 +261,6 @@ def inductance(mesh_file, sim_dir, solver_method):
stdout_log=(tmpdir / 'ElmerGrid_stdout.log'), stdout_log=(tmpdir / 'ElmerGrid_stdout.log'),
stderr_log=(tmpdir / 'ElmerGrid_stderr.log')) stderr_log=(tmpdir / 'ElmerGrid_stderr.log'))
solver_stdout, solver_stderr = (tmpdir / 'ElmerSolver_stdout.log'), (tmpdir / 'ElmerSolver_stderr.log') solver_stdout, solver_stderr = (tmpdir / 'ElmerSolver_stdout.log'), (tmpdir / 'ElmerSolver_stderr.log')
print('Solver stdout:', solver_stdout)
print('Solver stderr:', solver_stderr)
res = elmer_solver(tmpdir, res = elmer_solver(tmpdir,
stdout_log=solver_stdout, stdout_log=solver_stdout,
stderr_log=solver_stderr) stderr_log=solver_stderr)

View file

@ -10,6 +10,7 @@
"opacity": { "opacity": {
"images": 0.6, "images": 0.6,
"pads": 1.0, "pads": 1.0,
"shapes": 1.0,
"tracks": 1.0, "tracks": 1.0,
"vias": 1.0, "vias": 1.0,
"zones": 0.6 "zones": 0.6
@ -62,9 +63,10 @@
35, 35,
36, 36,
39, 39,
40 40,
41
], ],
"visible_layers": "fffffff_ffffffff", "visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0 "zone_display_mode": 0
}, },
"git": { "git": {
@ -75,9 +77,71 @@
}, },
"meta": { "meta": {
"filename": "coil_test_board.kicad_prl", "filename": "coil_test_board.kicad_prl",
"version": 3 "version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": 0
}, },
"project": { "project": {
"files": [] "files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
} }
} }

View file

@ -6,14 +6,14 @@
"apply_defaults_to_fp_fields": false, "apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false, "apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false, "apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.049999999999999996, "board_outline_line_width": 0.05,
"copper_line_width": 0.19999999999999998, "copper_line_width": 0.2,
"copper_text_italic": false, "copper_text_italic": false,
"copper_text_size_h": 1.5, "copper_text_size_h": 1.5,
"copper_text_size_v": 1.5, "copper_text_size_v": 1.5,
"copper_text_thickness": 0.3, "copper_text_thickness": 0.3,
"copper_text_upright": false, "copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996, "courtyard_line_width": 0.05,
"dimension_precision": 4, "dimension_precision": 4,
"dimension_units": 3, "dimension_units": 3,
"dimensions": { "dimensions": {
@ -24,13 +24,13 @@
"text_position": 0, "text_position": 0,
"units_format": 1 "units_format": 1
}, },
"fab_line_width": 0.09999999999999999, "fab_line_width": 0.1,
"fab_text_italic": false, "fab_text_italic": false,
"fab_text_size_h": 1.0, "fab_text_size_h": 1.0,
"fab_text_size_v": 1.0, "fab_text_size_v": 1.0,
"fab_text_thickness": 0.15, "fab_text_thickness": 0.15,
"fab_text_upright": false, "fab_text_upright": false,
"other_line_width": 0.09999999999999999, "other_line_width": 0.1,
"other_text_italic": false, "other_text_italic": false,
"other_text_size_h": 1.0, "other_text_size_h": 1.0,
"other_text_size_v": 1.0, "other_text_size_v": 1.0,
@ -41,11 +41,11 @@
"height": 1.524, "height": 1.524,
"width": 1.524 "width": 1.524
}, },
"silk_line_width": 0.09999999999999999, "silk_line_width": 0.1,
"silk_text_italic": false, "silk_text_italic": false,
"silk_text_size_h": 1.0, "silk_text_size_h": 1.0,
"silk_text_size_v": 1.0, "silk_text_size_v": 1.0,
"silk_text_thickness": 0.09999999999999999, "silk_text_thickness": 0.1,
"silk_text_upright": false, "silk_text_upright": false,
"zones": { "zones": {
"min_clearance": 0.5 "min_clearance": 0.5
@ -63,15 +63,20 @@
"copper_edge_clearance": "error", "copper_edge_clearance": "error",
"copper_sliver": "warning", "copper_sliver": "warning",
"courtyards_overlap": "error", "courtyards_overlap": "error",
"creepage": "error",
"diff_pair_gap_out_of_range": "error", "diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error", "diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error", "drill_out_of_range": "error",
"duplicate_footprints": "warning", "duplicate_footprints": "warning",
"extra_footprint": "warning", "extra_footprint": "warning",
"footprint": "error", "footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore", "footprint_type_mismatch": "ignore",
"hole_clearance": "error", "hole_clearance": "error",
"hole_near_hole": "error", "hole_near_hole": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error", "invalid_outline": "error",
"isolated_copper": "warning", "isolated_copper": "warning",
"item_on_disabled_layer": "error", "item_on_disabled_layer": "error",
@ -98,7 +103,9 @@
"text_thickness": "warning", "text_thickness": "warning",
"through_hole_pad_without_hole": "error", "through_hole_pad_without_hole": "error",
"too_many_vias": "error", "too_many_vias": "error",
"track_angle": "error",
"track_dangling": "warning", "track_dangling": "warning",
"track_segment_length": "error",
"track_width": "error", "track_width": "error",
"tracks_crossing": "error", "tracks_crossing": "error",
"unconnected_items": "error", "unconnected_items": "error",
@ -111,27 +118,29 @@
"min_clearance": 0.0, "min_clearance": 0.0,
"min_connection": 0.0, "min_connection": 0.0,
"min_copper_edge_clearance": 0.5, "min_copper_edge_clearance": 0.5,
"min_groove_width": 0.0,
"min_hole_clearance": 0.25, "min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25, "min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998, "min_microvia_diameter": 0.2,
"min_microvia_drill": 0.09999999999999999, "min_microvia_drill": 0.1,
"min_resolved_spokes": 2, "min_resolved_spokes": 2,
"min_silk_clearance": 0.0, "min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999, "min_text_height": 0.8,
"min_text_thickness": 0.08, "min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3, "min_through_hole_diameter": 0.3,
"min_track_width": 0.0, "min_track_width": 0.0,
"min_via_annular_width": 0.09999999999999999, "min_via_annular_width": 0.1,
"min_via_diameter": 0.5, "min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0, "solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true "use_height_for_length_calcs": true
}, },
"teardrop_options": [ "teardrop_options": [
{ {
"td_onpadsmd": true, "td_onpthpad": true,
"td_onroundshapesonly": false, "td_onroundshapesonly": false,
"td_onsmdpad": true,
"td_ontrackend": false, "td_ontrackend": false,
"td_onviapad": true "td_onvia": true
} }
], ],
"teardrop_parameters": [ "teardrop_parameters": [
@ -206,6 +215,7 @@
"mfg": "", "mfg": "",
"mpn": "" "mpn": ""
}, },
"layer_pairs": [],
"layer_presets": [], "layer_presets": [],
"viewports": [] "viewports": []
}, },
@ -234,6 +244,7 @@
"microvia_drill": 0.1, "microvia_drill": 0.1,
"name": "Default", "name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)", "pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": 2147483647,
"schematic_color": "rgba(0, 0, 0, 0.000)", "schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2, "track_width": 0.2,
"via_diameter": 0.6, "via_diameter": 0.6,
@ -242,7 +253,7 @@
} }
], ],
"meta": { "meta": {
"version": 3 "version": 4
}, },
"net_colors": null, "net_colors": null,
"netclass_assignments": null, "netclass_assignments": null,
@ -257,7 +268,7 @@
"pos_files": "", "pos_files": "",
"specctra_dsn": "", "specctra_dsn": "",
"step": "", "step": "",
"svg": "", "svg": "svg_vis",
"vrml": "" "vrml": ""
}, },
"page_layout_descr_file": "" "page_layout_descr_file": ""

BIN
gerber_wide_1.zip Normal file

Binary file not shown.

BIN
gerber_wide_2.zip Normal file

Binary file not shown.

BIN
gerber_wide_3.zip Normal file

Binary file not shown.

BIN
gerber_wide_4.zip Normal file

Binary file not shown.

BIN
gerber_wide_5.zip Normal file

Binary file not shown.

100
make_wide_coils.py Normal file
View file

@ -0,0 +1,100 @@
#!/bin/sh
import math
import subprocess
import tempfile
from gerbonara import utils
from gerbonara.cad.kicad import pcb as kicad_pcb
from gerbonara.cad.kicad import graphical_primitives as kicad_gr
from gerbonara.cad.kicad import footprints as kicad_fp
outer_dias = [40, 65, 90]
nks = [[(1, 150),
(1, 300),
(1, 480)],
[(53, 50),
(53, 100),
(53, 160)],
[(53, 100),
(53, 200),
(53, 320)],
[(53, 150),
(53, 300),
(53, 480)],
[(53, 1),
(53, 1),
(53, 1)]]
def make_pad(x, y, side, w, h, **kwargs):
f = kicad_fp.Footprint(name=f'conn_gen_01x{n}', _version=None, generator=None, at=kicad_fp.AtPos(x, y, 0), **kwargs)
for i in range(n):
f.pads.append(kicad_fp.Pad(
layers=['F.Mask', 'F.Cu'] if side == 'top' else ['B.Mask', 'B.Cu'],
number=str(i+1),
type=kicad_fp.Atom.smd,
shape=kicad_fp.Atom.rect,
at=kicad_fp.AtPos(0, 0, 0),
size=kicad_fp.XYCoord(w, h),
footprint=f))
return f
for case_num, nk in enumerate(nks, start=1):
board_out = kicad_pcb.Board.empty_board()
for (i, d2), (n, k) in zip(enumerate(outer_dias), nk):
d1 = d2 - 15
with tempfile.NamedTemporaryFile(suffix='.kicad_pcb') as f:
args = 'python twisted_coil_gen_twolayer.py --circle-segments 331 --trace-width 0.13 --via-drill 0.3 --via-diameter 0.6 --via-offset 0.3'.split() + [
'--pcb', f.name,
'--turns', str(n), '--twists', str(k),
'--inner-diameter', str(d1), '--outer-diameter', str(d2),
]
if k > 100:
args += ['--stagger-inner-vias', '--stagger-outer-vias', '--via-offset', '0.4']
subprocess.run(args, check=True)
for obj in kicad_pcb.Board.open(f.name).objects():
board_out.add(obj)
board_out.add(kicad_gr.Text(text=f'case {case_num} n={n} k={k}\\nd={d1:.1f}-{d2:.2f}mm\\nt=0.15mm',
at=kicad_gr.AtPos(0, (d1+d2)/2/2), layer=kicad_gr.TextLayer('F.SilkS')))
# Slots
if i < len(outer_dias)-1:
na = 8
r2 = d2/2
r = r2 + 2.5
aw = 2*math.asin(3 / 2 / r)
for j in range(na):
start = utils.rotate_point(r, 0, (j+1)*2*math.pi/na - aw/2)
end = utils.rotate_point(r, 0, j*2*math.pi/na + aw/2)
arc = kicad_gr.Arc(end=end, center=(0, 0), start=start, stroke=kicad_gr.Stroke(width=1.2), layer='Edge.Cuts')
board_out.add(arc)
# Connecting pads
board_out.add(make_pad(d2/2+1, 0, 'top', 2, 0.7))
board_out.add(make_pad(d2/2+1, 0, 'bottom', 2, 0.7))
board_out.add(kicad_pcb.TrackSegment(start=kicad_pcb.XYCoord(d2/2, 0), end=kicad_pcb.XYCoord(d2/2+1, 0), width=0.15, layer='F.Cu'))
board_out.add(kicad_pcb.TrackSegment(start=kicad_pcb.XYCoord(d2/2, 0), end=kicad_pcb.XYCoord(d2/2+1, 0), width=0.15, layer='B.Cu'))
# Circular board outline
board_out.add(kicad_gr.Circle(center=kicad_gr.XYCoord(0, 0), end=kicad_gr.XYCoord(d2/2+5, 0), layer='Edge.Cuts'))
# Silk crosshairs
r = d2/2 * math.sin(math.pi/4)
board_out.add(kicad_gr.Line(start=kicad_gr.XYCoord(-r, -r), end=kicad_gr.XYCoord(r, r), layer='F.SilkS'))
board_out.add(kicad_gr.Line(start=kicad_gr.XYCoord(r, -r), end=kicad_gr.XYCoord(-r, r), layer='F.SilkS'))
board_out.add(kicad_gr.Line(start=kicad_gr.XYCoord(-r, -r), end=kicad_gr.XYCoord(r, r), layer='B.SilkS'))
board_out.add(kicad_gr.Line(start=kicad_gr.XYCoord(r, -r), end=kicad_gr.XYCoord(-r, r), layer='B.SilkS'))
r = d2/2
board_out.add(kicad_gr.Line(start=kicad_gr.XYCoord(0, r), end=kicad_gr.XYCoord(0, -r), layer='B.SilkS'))
board_out.add(kicad_gr.Line(start=kicad_gr.XYCoord(r, 0), end=kicad_gr.XYCoord(-r, 0), layer='B.SilkS'))
board_out.write(f'wide_coil_{case_num}.kicad_pcb')

7
paper/.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
*.bbl
*.blg
*.aux
*.log
*.bcf
*.run.xml
*.out

View file

@ -8,7 +8,7 @@ MAKEFLAGS += --no-builtin-rules
main_tex ?= paper main_tex ?= paper
VERSION_STRING := $(shell git describe --tags --long --dirty) VERSION_STRING := $(shell git describe --tags --long)
all: ${main_tex}.pdf all: ${main_tex}.pdf
@ -17,8 +17,26 @@ all: ${main_tex}.pdf
biber $* biber $*
pdflatex -shell-escape $< pdflatex -shell-escape $<
paper_biber.bib:
biber --output-format=bibtex --output-resolve paper.bcf
submission.zip:
rm -f submission.zip
zip -r submission.zip paper.tex paper.bib version.tex \
figures/klein-spulen-schwingkreise-korbspule.jpg\
figures/k_ripple_plot.pdf\
figures/nk_combined.pdf\
figures/nk_complex_illust.pdf\
figures/rms_ripple_double_rotation_n3_r4.pdf\
figures/saacke-radiotechnik-3-ledionspule.jpg\
figures/svg_vis_paper_plain.png\
figures/svg_vis_paper.png\
figures/symmetry_3turn_n_twist.pdf\
figures/test_schematic.pdf\
figures/setup_probe_small.jpg
version.tex: ${main_tex}.tex paper.bib version.tex: ${main_tex}.tex paper.bib
echo "${VERSION_STRING}" > $@ echo -n "${VERSION_STRING}" > $@
.PHONY: clean .PHONY: clean
clean: clean:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,825 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="185.356mm"
height="93.594002mm"
viewBox="0 0 185.356 93.594002"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
sodipodi:docname="test_schematic.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="1.6641134"
inkscape:cx="244.27422"
inkscape:cy="142.71864"
inkscape:window-width="3183"
inkscape:window-height="1783"
inkscape:window-x="26"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect10" />
<rect
x="385.70886"
y="297.09421"
width="102.83019"
height="111.67734"
id="rect3" />
<marker
style="overflow:visible"
id="ConcaveTriangle"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="Concave triangle arrow"
markerWidth="1"
markerHeight="1"
viewBox="0 0 1 1"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path7" />
</marker>
<rect
x="385.70886"
y="297.09421"
width="102.83019"
height="111.67734"
id="rect4" />
<rect
x="385.70886"
y="297.09421"
width="102.83019"
height="111.67734"
id="rect5" />
<rect
x="385.70886"
y="297.09421"
width="102.83019"
height="111.67734"
id="rect6" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect10-5" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect39" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect40" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect47" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect48" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect55" />
<rect
x="437.73779"
y="348.87198"
width="273.77188"
height="112.60981"
id="rect56" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect57" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect58" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect60" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect61" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect62" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect63" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect64" />
<rect
x="437.73779"
y="348.87198"
width="177.31618"
height="129.1815"
id="rect65" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-38.334231,-50.81432)">
<rect
style="fill:#ffeeaa;stroke:none;stroke-width:0.365;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="rect7"
width="57.955029"
height="67.441551"
x="83.425385"
y="68.577538"
rx="1.9671597"
ry="1.9671596" />
<g
id="g6"
transform="matrix(0.7372429,0,0,0.73667369,66.561458,44.083962)"
style="stroke-width:1.35693">
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.678464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:url(#ConcaveTriangle);stop-color:#000000;stop-opacity:1"
d="M 68.349571,99.162305 H 89.106306"
id="path1"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.678464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:url(#ConcaveTriangle);stop-color:#000000;stop-opacity:1"
d="M 75.35578,106.3617 V 85.604966"
id="path2"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.678464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:url(#ConcaveTriangle);stop-color:#000000;stop-opacity:1"
d="M 68.916477,102.85268 86.892335,92.474311"
id="path3"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-23.790662,1.7156218)"
id="text3"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.6667px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect3);display:inline;stroke-width:1.35693"><tspan
x="385.70898"
y="321.1139"
id="tspan17">z</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-8.2310232,15.859299)"
id="text4"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.6667px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect4);display:inline;stroke-width:1.35693"><tspan
x="385.70898"
y="321.1139"
id="tspan19">x</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-11.147673,6.5390471)"
id="text5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.6667px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect5);display:inline;stroke-width:1.35693"><tspan
x="385.70898"
y="321.1139"
id="tspan20">y</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-19.884406,21.928304)"
id="text6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.6667px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect6);display:inline;stroke-width:1.35693"><tspan
x="385.70898"
y="321.1139"
id="tspan33">α</tspan></text>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.678464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;marker-end:url(#ConcaveTriangle);stop-color:#000000;stop-opacity:1"
d="m 71.585314,104.55786 c -1.060219,0.28749 -1.388316,0.86549 -1.381645,1.3205 0.0208,1.419 3.116278,1.75043 4.838231,1.81736 2.514725,0.0977 5.827504,-0.48364 5.827504,-2.03119 0,-0.63687 -0.518568,-1.15241 -1.996357,-1.55072"
id="path6"
sodipodi:nodetypes="csssc" />
</g>
<g
id="g8"
transform="rotate(-90,84.02158,87.2593)">
<rect
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="rect8"
width="15.001786"
height="5.0005956"
x="76.25853"
y="147.85533" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 69.838171,150.35563 H 97.680675"
id="path8"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 97.680675,150.35563 V 162.5472"
id="path18"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 97.680675,198.09083 v 10.6746"
id="path24"
sodipodi:nodetypes="cc" />
</g>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,46.590248,-34.083774)"
id="text9"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect10);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan35"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan34">Receiver</tspan></tspan></text>
<g
id="g11"
transform="rotate(-90,113.22648,58.0544)">
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 69.838171,150.35563 H 97.680675"
id="path11"
sodipodi:nodetypes="cc" />
<rect
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="rect11"
width="15.001786"
height="5.0005956"
x="76.25853"
y="147.85533" />
</g>
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 147.1179,101.44271 h 22.71879"
id="path18-1"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 169.80619,112.66126 0.0305,-31.223089"
id="path8-9"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 185.43453,101.44271 V 81.438168"
id="path25"
sodipodi:nodetypes="cc" />
<g
id="g33"
transform="rotate(-90,108.31112,80.71908)">
<g
id="g29"
transform="translate(-0.25,0.061)">
<g
id="g28"
transform="translate(7.2026149,12.184985)">
<g
id="g26"
transform="matrix(0.53527713,0,0,0.54772615,50.414423,56.309066)"
style="stroke-width:1.84684">
<ellipse
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923418;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="ellipse25"
cx="108.48818"
cy="169.1588"
rx="5.2521563"
ry="1.7507188" />
<path
id="path26"
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923417;stroke-linecap:round;stroke-linejoin:round"
d="m 103.22521,169.1588 v -42.90097 h 10.51513 v 42.90097"
sodipodi:nodetypes="cccc" />
<ellipse
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923418;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="ellipse26"
cx="108.47737"
cy="126.25288"
rx="5.2521563"
ry="1.7507188" />
</g>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 108.47737,119.47146 v 8.53214"
id="path27"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 108.47737,128.0036 v 27.01149"
id="path28"
sodipodi:nodetypes="cc" />
</g>
</g>
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle29"
cx="112.62113"
cy="142.24466"
r="0.73016149" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 113.35129,142.24465 h -5.75927"
id="path29"
sodipodi:nodetypes="cc" />
<g
id="g32"
transform="matrix(1,0,0,-1,0.51562288,313.42993)">
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle30"
cx="112.10551"
cy="155.58745"
r="0.73016149" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 112.83567,155.58744 H 107.0764"
id="path31"
sodipodi:nodetypes="cc" />
</g>
</g>
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 185.43453,101.44271 h 20.09318"
id="path18-1-8"
sodipodi:nodetypes="cc" />
<g
id="g38"
transform="matrix(0,1,1,0,27.561533,5.0692385)">
<g
id="g36"
transform="translate(-0.25,0.061)">
<g
id="g35"
transform="translate(7.2026149,12.184985)">
<g
id="g34"
transform="matrix(0.53527713,0,0,0.54772615,50.414423,56.309066)"
style="stroke-width:1.84684">
<ellipse
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923418;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="ellipse33"
cx="108.48818"
cy="169.1588"
rx="5.2521563"
ry="1.7507188" />
<path
id="path33"
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923417;stroke-linecap:round;stroke-linejoin:round"
d="m 103.22521,169.1588 v -42.90097 h 10.51513 v 42.90097"
sodipodi:nodetypes="cccc" />
<ellipse
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923418;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="ellipse34"
cx="108.47737"
cy="126.25288"
rx="5.2521563"
ry="1.7507188" />
</g>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 108.47737,119.47146 v 8.53214"
id="path34"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 108.47737,128.0036 v 27.01149"
id="path35"
sodipodi:nodetypes="cc" />
</g>
</g>
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle36"
cx="112.62113"
cy="142.24466"
r="0.73016149" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 113.35129,142.24465 h -5.75927"
id="path36"
sodipodi:nodetypes="cc" />
<g
id="g37"
transform="matrix(1,0,0,-1,0.51562288,313.42993)">
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle37"
cx="112.10551"
cy="155.58745"
r="0.73016149" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 112.83567,155.58744 h -8.81671"
id="path37"
sodipodi:nodetypes="cc" />
</g>
</g>
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle29-1"
cx="-101.44271"
cy="169.82144"
r="0.73016149"
transform="rotate(-90)" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 159.27898,73.600206 V 120.49922"
id="path8-9-4-9"
sodipodi:nodetypes="cc" />
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle29-1-8"
cx="73.600204"
cy="159.27896"
transform="matrix(0,1,1,0,0,0)"
r="0.73016149" />
<g
id="g40"
transform="rotate(-90,95.949903,67.216385)">
<circle
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
id="path38"
cx="42.667065"
cy="170.93503"
r="4.845932" />
<text
xml:space="preserve"
transform="matrix(0,0.26458333,-0.26458333,0,138.95415,52.731509)"
id="text9-2"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect10-5);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan37"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan36">V</tspan></tspan></text>
</g>
<g
id="g41"
transform="translate(136.59026,-96.367894)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-42.558683,87.081574)"
id="text39"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect39);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan39"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan38">R</tspan></tspan></text>
<text
xml:space="preserve"
transform="matrix(0.14864912,0,0,0.14864912,13.222331,131.43791)"
id="text40"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect40);display:inline;stroke-width:1.77992"><tspan
x="437.73828"
y="373.61669"
id="tspan41"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan40">L</tspan></tspan></text>
</g>
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 185.40403,109.60382 h 25.06601"
id="path39"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 204.51447,120.49922 h 5.95557"
id="path37-6"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 210.47004,120.49922 v -10.8954"
id="path37-3"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-39.978173,33.881434)"
id="text56"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;text-align:center;white-space:pre;shape-inside:url(#rect56);display:inline"
x="50.625053"
y="0"><tspan
x="474.62395"
y="373.61669"
id="tspan43"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan42">Motion platform</tspan></tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,36.505656,-9.437934)"
id="text58"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect58);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan45"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan44">L</tspan></tspan></text>
<g
id="g60"
transform="translate(121.10514,-53.606385)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-42.558683,87.081574)"
id="text59"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect60);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan47"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan46">V</tspan></tspan></text>
<text
xml:space="preserve"
transform="matrix(0.14864912,0,0,0.14864912,12.012663,131.43791)"
id="text60"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect61);display:inline;stroke-width:1.77992"><tspan
x="437.73828"
y="373.61669"
id="tspan49"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan48">Out</tspan></tspan></text>
</g>
<g
id="g9"
transform="rotate(-90,73.52791,97.752971)">
<rect
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="rect9"
width="15.001786"
height="5.0005956"
x="76.25853"
y="147.85533" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 69.838171,150.35563 H 97.680675"
id="path9"
sodipodi:nodetypes="cc" />
</g>
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 113.939,73.6002 h 12.19157"
id="path18-9"
sodipodi:nodetypes="cc" />
<g
id="g46"
transform="rotate(-90,61.076952,127.95324)">
<g
id="g44"
transform="translate(-0.25,0.061)">
<g
id="g43"
transform="translate(7.2026149,12.184985)">
<g
id="g42"
transform="matrix(0.53527713,0,0,0.54772615,50.414423,56.309066)"
style="stroke-width:1.84684">
<ellipse
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923418;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="ellipse41"
cx="108.48818"
cy="193.9332"
rx="5.2521563"
ry="1.7507188" />
<path
id="path41"
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923417;stroke-linecap:round;stroke-linejoin:round"
d="m 103.22521,193.90511 v -67.64728 h 10.51513 v 67.64728"
sodipodi:nodetypes="cccc" />
<ellipse
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.923418;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="ellipse42"
cx="108.47737"
cy="126.25288"
rx="5.2521563"
ry="1.7507188" />
</g>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 108.47737,119.47146 v 8.53214"
id="path42"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="m 108.47737,128.0036 v 40.56569"
id="path43"
sodipodi:nodetypes="cc" />
</g>
</g>
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle44"
cx="112.62113"
cy="142.24466"
r="0.73016149" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 113.35129,142.24465 h -5.75927"
id="path44"
sodipodi:nodetypes="cc" />
<g
id="g45"
transform="matrix(1,0,0,-1,0.51562288,313.42993)">
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle45"
cx="112.10551"
cy="142.03323"
r="0.73016149" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 112.83567,142.03324 H 107.0764"
id="path45"
sodipodi:nodetypes="cc" />
</g>
</g>
<g
id="g47"
transform="rotate(-90,12.020498,118.16803)">
<circle
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
id="circle46"
cx="42.667065"
cy="170.93503"
r="4.845932" />
<text
xml:space="preserve"
transform="matrix(0,0.26458333,-0.26458333,0,138.95415,52.731509)"
id="text46"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect47);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan51"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan50">V</tspan></tspan></text>
</g>
<g
id="g48"
transform="rotate(-90,102.24798,61.168296)">
<circle
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none"
id="circle47"
cx="75.894829"
cy="9.9268379"
r="4.845932" />
<path
style="fill:none;stroke:#000000;stroke-width:0.500002;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 75.882664,12.622933 c 0,0 -1.320624,-0.616184 -1.320624,-1.348048 0,-0.718365 0.885426,-1.113278 1.320624,-1.3480463 0.436571,-0.23551 1.344954,-0.571053 1.344954,-1.406328 0,-0.781986 -1.344954,-1.289768 -1.344954,-1.289768"
id="path44-8"
sodipodi:nodetypes="csssc" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 64.799615,73.6002 -0.0121,8.991146"
id="path44-7"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 51.012582,73.6002 -0.01211,8.991146"
id="path48"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 64.799615,92.45156 -0.0121,8.99114"
id="path49"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 51.012582,92.45156 -0.01211,8.99114"
id="path50"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 51.012582,73.6002 H 64.841165"
id="path42-3"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 51.000472,101.4427 H 64.829055"
id="path51"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 64.787505,101.4427 h 10.58086"
id="path52"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 75.368365,81.438165 V 101.4427"
id="path53"
sodipodi:nodetypes="cc" />
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle44-0"
cx="-101.4427"
cy="64.793571"
r="0.73016149"
transform="rotate(-90)" />
<circle
style="fill:#000000;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
id="circle53"
cx="-73.600197"
cy="64.793571"
r="0.73016149"
transform="rotate(-90)" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="M 104.52041,81.438162 V 101.4427"
id="path54"
sodipodi:nodetypes="cc" />
<path
style="font-variation-settings:normal;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 104.52041,101.4427 h 21.61016"
id="path55"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-52.418097,-33.843802)"
id="text55"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect55);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan53"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan52">Transmitter</tspan></tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,1.3112422,-9.1879403)"
id="text57"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect57);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan55"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan54">L</tspan></tspan></text>
<g
id="g62"
transform="translate(-6.158472,-88.237458)">
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-42.558683,87.081574)"
id="text61"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect62);display:inline"><tspan
x="437.73828"
y="373.61669"
id="tspan57"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan56">V</tspan></tspan></text>
<text
xml:space="preserve"
transform="matrix(0.14864912,0,0,0.14864912,12.012663,131.43791)"
id="text62"
style="font-size:26.6667px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect63);display:inline;stroke-width:1.77992"><tspan
x="437.73828"
y="373.61669"
id="tspan59"><tspan
style="font-family:Inter;-inkscape-font-specification:Inter"
id="tspan58">in</tspan></tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
\documentclass[conference,compsoc]{IEEEtran} \documentclass[journal,10pt,a4paper]{IEEEtran}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage[ \usepackage[
@ -13,51 +13,959 @@
\usepackage{amssymb,amsmath} \usepackage{amssymb,amsmath}
\usepackage{eurosym} \usepackage{eurosym}
\usepackage{wasysym} \usepackage{wasysym}
\usepackage[binary-units]{siunitx} \usepackage[binary-units]{siunitx}
\DeclareSIUnit{\baud}{Bd}
\DeclareSIUnit{\year}{a}
\usepackage{commath} \usepackage{commath}
\usepackage{graphicx,color} \usepackage{graphicx,color}
\usepackage{colortbl}
\usepackage{subcaption} \usepackage{subcaption}
\usepackage{placeins}
\usepackage{array} \usepackage{array}
\usepackage{censor} \usepackage{censor}
\usepackage{hyperref} \usepackage{hyperref}
\usepackage{makecell} \usepackage{makecell}
\DeclareSIUnit{\baud}{Bd}
\DeclareSIUnit{\year}{a}
\DeclareSIUnit{\rpm}{rpm}
\renewcommand{\floatpagefraction}{.8} \renewcommand{\floatpagefraction}{.8}
\newcommand{\degree}{\ensuremath{^\circ}} \newcommand{\degree}{\ensuremath{^\circ}}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}} \newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\newcommand{\partnum}[1]{\texttt{#1}} \newcommand{\partnum}[1]{\texttt{#1}}
\newcommand{\todo}[1]{\textbf{TODO}\footnote{#1}}
\newlength{\figurescale}
\setlength{\figurescale}{\linewidth}
\begin{document} \begin{document}
\date{} \date{January 27 2025}
\author{\IEEEauthorblockN{Jan Sebastian Götte},\thanks{Corresponding author. Jan Sebastian Götte is with the Technical
University of Darmstadt, 64283 Darmstadt, Germany (e-mail: jan.goette@tu-darmstadt.de).}
\and
\IEEEauthorblockN{Björn Scheuermann}\thanks{Björn Scheuermann is with the Technical University of Darmstadt,
64283 Darmstadt, Germany (e-mail: scheuermann@kom.tu-darmstadt.de).}
\thanks{This work has been funded by the LOEWE initiative (Hesse, Germany) within the emergenCITY center
(LOEWE/1/12/519/03/05.001(0016)/72) as well as by Technical University of Darmstadt.}
}
\title{Wireless Power Transfer with a Twist: \title{Wireless Power Transfer with a Twist:
Achieving Rotation-Invariant Coupling using Multi-Layer PCB Inductors} Achieving Rotation-Invariant Coupling using Twisted Multi-Layer PCB Inductors}
\maketitle \maketitle
\begin{abstract} \begin{abstract}
We present \emph{twisted inductors}, a planar inductor layout that interleaves multiple spiral traces across two
layers, increasing Self-Resonant Frequency (SRF), providing higher inductance, and improving rotational field
symmetry compared to conventional layouts. Twisted inductors generalize both conventional planar spiral inductors as
well as planar toroidal inductors. We experimentally show that in Wireless Power Transfer (WPT) through an axially
rotating joint in Inertial Hardware Security Modules (IHSMs), the improved symmetry of twisted inductors results in
decreased output ripple. We further provide measurements of 39 test coupons showing that twisted inductors improve
SRF by up to \qty{58}{\percent} and increase inductance by up to \qty{6.5}{\percent} compared to conventional planar
spiral inductors.
\end{abstract} \end{abstract}
\section{Introduction} \section{Introduction}
Inductive Wireless Power Transfer (WPT) is a widely used technology supported by a large corpus of research literature
\cite{
awuahNovelCoilDesign2023,
batraEffectFerriteAddition2015,
curranModelingCharacterizationPCB2015,
fanSimultaneousWirelessPower2024,
leeSimpleWirelessPower2017,
liWirelessPowerTransfer2015,
maierContributionSystemDesign2019,
mooreApplicationsWirelessPower2019,
mouEnergyEfficientAdaptiveDesign2017,
mouWirelessPowerTransfer2015,
zhangWirelessPowerTransfer2019}.
While working on an application of inductive WPT in a Inertial Hardware Security Module (IHSM) as previously
published by \textcite{gotteCantTouchThis2022}, we found ourselves presented with an unusual set of constraints
attempting WPT through a rotating joint using a planar inductor implemented in a Printed Circuit Board (PCB)---a set of
constraints that does not seem to be addressed adequately in the existing literature on inductive WPT yet.
Inertial Hardware Security Modules are a hardware security primitive that discourages tampering with a payload such as a
single-board computer by rotating a tamper-sensing enclosure around the payload. The tamper-sensing enclosure
continuously monitors itself for tampering using sensors such as tamper-sensing meshes~\cite{TamperResistance2020} and
accelerometers. When the tamper-sensing enclosure signals a tamper alarm to the payload, the payload immediately
destroys all sensitive data to prevent the attacker from gaining access to it. In principle, an IHSM is similar to an
ATM that responds to attempts at opening its vault by dispensing dye over the bank notes within, rendering them
unusable.
In our IHSM implementation, the tamper-sensing enclosure rotates at speeds in the range from
\qtyrange{1000}{3000}{\rpm}. The tamper sensing circuit on the rotating enclosure is powered through a pair of WPT
inductors located on the IHSM's axis of rotation. The large centrifugal acceleration prohibits the use of batteries or
liquid electrolyte capacitors on the rotating part, and makes heavy components such as large Multilayer Ceramic
Capacitors (MLCCs) challenging to balance. Planar inductors that are patterned directly into a PCB provide a
cost-effective and lightweight solution to this problem, but the coarse pattern resolution of PCBs results in a strict
upper limit to the turn count that can be achieved in an inductor with a given area.
Planar inductors are usually considered approximately axisymmetric. In our application, we found that the field
asymmetry in feasible PCB inductors is large enough that axial rotation of two such inductors results in an oscillation
of their coupling coefficient that leads to voltage ripple on the secondary side, especially when the coils are
misaligned.
In other inductive WPT systems, this issue is mitigated by several factors: First, for this effect to matter in the
first place, the two coils have to be rotating with respect to one another. In ferrite core inductors, the core is the
major factor shaping the magnetic field and evens out the small effect of winding asymmetry. In wire-wound inductors,
the often higher turn count and the tightly packed, circular wires render this effect negligible. Finally, the output
ripple caused by this oscillation can be filtered through a voltage regulator or by using a large decoupling capacitor
on the secondary side if the application can accomodate such components on the rotating part.
\begin{figure}
\begin{center}
\subcaptionbox{\raggedright A classic planar spiral inductor}{
\includegraphics[width=0.25\figurescale]{figures/svg_vis_paper_plain.png}}
\subcaptionbox{\raggedright Our proposed inductor layout}{
\includegraphics[width=0.25\figurescale]{figures/svg_vis_paper.png}}
\subcaptionbox{\raggedright A honeycomb coil in \textcite{saackeRadiotechnikIIIEmpfanger1926}}{
\includegraphics[width=0.15\figurescale]{figures/saacke-radiotechnik-3-ledionspule.jpg}}
\subcaptionbox{\raggedright A basket-woven coil in \textcite{kleinSpulenUndSchwingungskreise1941}}{
\includegraphics[width=0.15\figurescale]{figures/klein-spulen-schwingkreise-korbspule.jpg}}
\end{center}
\caption{Illustration of our proposed inductor layout compared to contemporary conventional planar inductors and
honeycomb as well as basket-woven coils from the early days of wireless radio.}
\label{fig_illust_honeycomb_basket}
\end{figure}
While there exist a corpus of prior work focusing on efficient power transfer between two coils whose position relative
to one another cannot be precisely controlled as is the case in wireless phone charging systems as well as in proposed
WPT electric vehicle chargers~\cite{liWirelessPowerTransfer2015,mouEnergyEfficientAdaptiveDesign2017},
it is generally assumed that the two coils remain quasi-stationary with respect to one another.
There exists a body of work on inductive power transfer through rotating joints but here the focus often lies on higher
power budgets than our application requires, which in practice requires more space and a ferrite or laminated iron
core~\cite{
fanSimultaneousWirelessPower2024,
songRotationLightweightWirelessPower2019,
wangCoaxialNestedCouplersBased2020,
}.
Often, these rotating joint WPT systems use coaxial structures, but segmented approaches exist, too~\cite{
wangNovelRotatingWireless2024,
yanFreeRotationWirelessPower2023,
xiaRotaryWirelessPower2024,
liWirelessPowerTransfer2021,
}.
In lower-power applications, segmented approaches are more common. A key challenge in segmented approaches is the
reduction of secondary-side ripple induced when the segments' alignment changes throughout one revolution~\cite{
zhangWirelessSensorPower2024,
}, which usually requires additional secondary-side circuitry.
\subsection{Twisted inductors}
In this paper, we propose a layout for circular PCB inductors that uses a number of series-connected interleaved spirals
to achieve a topological equivalent to a torus knot from mathematical knot theory. Our layout twists the inductor's
windings around one another by connecting the interleaved spiral segments with a ring of vias each on the inside and
outside of the inductor's windings. Our approach improves rotation ripple in WPT through a rotating joint. Furthermore,
it provides better performance beyond our particular use case, and improves upon conventional contemporary planar
inductors by applying similar principles to those which inspired the polygonal basket-woven air coils used in early
radio sets. We show that we can layout a twisted inductor for any number of layer inversions that is co-prime to the
inductor's turn count. Our approach opens up a design space for inductor layouts that interpolate between planar spiral
inductors on one end, and planar toroidal inductors on the other end, gerneralizing a super-set to a number of previous
approaches to the design of planar inductors.
We observe that in high-frequency applications, a moderate number of layer inversions increases the spacing between the
beginning and end of the inductor's conductor, where the majority of the inductor's AC current flows. This decreases the
parasitic capacitance of the inductor and increases its Self-Resonant Frequency (SRF), raising its maximum possible
operating frequency and improving its efficiency at lower operating frequencies.
\subsection{Contributions}
Our contributions in this paper include:
\begin{itemize}
\item We introduce twisted inductors, a planar inductor layout that improves rotational symmetry in WPT through
rotating joins, and promises improved high-frequency behavior in other applications.
\item We provide detailed instructions for the construction of such layouts, including a mathematical analysis of
the available parameter space.
\item We provide an analytical model of inductance and DC equivalent series resistance of our scheme.
\item We validate our scheme and provide laboratory measurements of the basic parameters of 39 test specimens
comparing our scheme to conventional layouts.
\item We further present the results of Finite Element Method (FEM) simulations to validate our inductance and ESR
approximations.
\item Finally, to analyze the degree of rotational symmetry in our proposed scheme, we provide the results of a
large number of automated measurements of coupling between pairs of inductors under various rotations, offsets,
distances and load conditions.
\end{itemize}
\section{Related Work} \section{Related Work}
\subsection{Twisted Inductors in RFIC Design}
\subsection{Basket-Woven Air Coils} \subsection{Inductive WPT in Practice}
Inductive WPT has been proposed in a large number of
scenarios~\cite{zhangWirelessPowerTransfer2019,mouWirelessPowerTransfer2015}, each of which comes with a set of unique
constraints. When WPT is used to charge an electric toothbrush, the implementation cost of the system is critical, while
efficiency and total power output are of little concern. Mechanically, in an electric toothbrush's charging system, the
position and spacing of the transmitter and receiver coils can easily be controlled down to millimeter precision.
In contrast to this, wireless smartphone charging is a much more demanding application. Here, the total cost of the
system is only secondary, but the receiver's form factor is critical, and total power output as well as efficiency
become major objectives. At the same time, in wireless smartphone charging, position tolerances are very coarse, and the
two coils in the charging base and in the phone may be positioned more than a centimeter off-axis, with a gap of several
millimeters and potentially not even in parallel planes.
Power transfer across large distances is even more of a concern in implantable medical
devices~\cite{mooreApplicationsWirelessPower2019}. Where a wireless phone charger must be able to bridge distances of a
few millimeters, an implantable medical device might be situated underneath several centimeter of tissue and bones. At
the same time, cost is of (almost) no concern in this medical application, which enables the use of complex
manufacturing techniques, customized electronic components and exotic materials.
While all of the aforementioned applications transfer somewhere between a few hundred milliwatts and several watts of
power, at the other end of the spectrum there is a large body of research suggesting the use of inductive wireless power
transfer for the charging of electric vehicles
(EVs)~\cite{liWirelessPowerTransfer2015,mouEnergyEfficientAdaptiveDesign2017}. In this application, the wireless power
transfer system usually replaces the conventional wired charging connector, which improves the systems' user experience
given the strong force required to seat or unseat these rather large connectors, as well as the heft of the required
water-cooled cables. In this application, size is of little concern, but at charging rates up to tens of kilowatt,
efficiency becomes critical.
%When charging an EV at a rate of \qty{10}{\kilo\watt}, an efficiency improvement of just
%$0.1\%$ corresponds to a reduction in power dissipation of \qty{10}{\watt}. Besides the monetary cost of the power lost
%this way, each small improvement enables a reduction in size of heat sinks and other cooling components, which directly
%translates to a decrease in cost.
\subsection{Core materials in WPT}
Across application areas, air-core inductors are often used for WPT since in most applications, an air gap of several
millimeters or more is expected~\cite{curranModelingCharacterizationPCB2015}. Especially in low-power application such
as mobile device charging, the size and weight of ferrites is an obstacle to their use, and at lower power levels losses
are less of a concern.
A common way to use ferrites in WPT applications is by magnetically shielding the inductor's back side with a ferrite
plate such that the field does not extend beyond the coil's back side, thereby increasing the intended mutual inductance
while simultaneously reducing eddy current losses when the WPT coils are placed near metal
objects~\cite{batraEffectFerriteAddition2015,leeSimpleWirelessPower2017,muehlmannMutualCouplingModeling2012}. Similar to
how the trace layouts of planar WPT coils are optimized to improve power transfer efficiency, the layout of ferrite
components has been proposed for optimization~\cite{batraEffectFerriteAddition2015}.
\subsection{PCB inductor design for wireless power transfer}
Today, air-core inductors are the standard solution in inductive WPT links. Since in most WPT applications an air gap of
several millimeters between the sending and receiving assemblies is expected, adding a ferrite core does not result in a
large improvement in coupling. Instead, the impact of this distance as well as misalignment is reduced by maximizing the
area of the air-core inductors used, or by tiling multiple
inductors~\cite{curranModelingCharacterizationPCB2015,wangNovelRotatingWireless2024,zhangDynamicWirelessPower2025}.
WPT inductors tend to be mostly planar coils with only a few layers, so implementing them in a PCB process seems
natural. Using a PCB for the inductor has the potential to reduce implementation cost since PCBs are cheap, and they can
also serve as structural support. However, implementing inductors in PCBs has several disadvantages. First, due to the
limited layer count of common PCB processes and due to structure size limitations, the number of windings that can be
fit into a given volume is much lower than in wire-wound inductors. Second, due to a PCB's copper layers being thin
compared to its dielectric substrate\footnote{common values are \qtyrange{15}{30}{\micro\meter} copper thickness and
\qtyrange{600}{1600}{\micro\meter} substrate thickness} PCB inductors tend to have poor DC resistance, albeit the thin
copper layer decreases skin effect losses compared to a solid, round conductors of the same cross-sectional area.
However, PCBs can still not approach the performance of litz wire used in high-frequency WPT coils, which commonly use
wire diameters in the range of tens of micrometers~\cite{zhaoDesignOptimizationLitzWire2023}.
\textcite{lopeFrequencyDependentResistancePlanar2014} and \textcite{nomotoSplittingConductorsCoils2024} propose a
mitigation that aims to emulate a litz wire's structure in large, high-current PCB inductors, but their mitigation is
heavily limited by the structure size achievable in common PCB manufacturing
processes~\cite{nguyenReviewComparisonSolid2020}.
A further factor that limits the high-frequency performance of PCB inductors is distributed capacitance. Not only does a
large air coil exhibit more parasitic capacitance than an equivalent, smaller ferrite-core inductor simply due to its
size, when implemented in a PCB process a large fraction of the electrical fields responsible for this capacitance pass
through the PCB's substrate, not air. The relative permittivity $\epsilon_r$ of common PCB substrates typically lies in
the range of $4$ to $5$~\cite{mumbyDielectricPropertiesFR41989}, which increases the distributed capacitance compared to
a pure air-core inductor by approximately that same factor.
\subsection{Planar Inductors in RFIC Design}
Beyond WPT, planar inductors are commonly used in radio frequency integrated circuits (RFICs). In RFIC design, the major
challenges are area optimization and precisely predicting the inductor's characteristics during the design phase. Common
optimizations include applying a variable trace pitch~\cite{lopez-villegasImprovementQualityFactor2000} and variable
trace width~\cite{hsuAnalyticalDesignAlgorithm2008}.
In RFICs, inductors are commonly designed as \emph{balanced} inductors with a grounded central node. Such designs
interleave two counter-wound planar spiral inductors on the same layer with the help of some jumper connections on a
second layer~\cite{daneshDifferentiallyDrivenSymmetric2002,martinMultiturnTwistedInductor2016}. The use of such designs
in RFIC design is mainly focused on their electrical symmetry, so that the two input ports can be fed with a fully
differential signal, with the inductor loading both driver outputs equally across the inductor's frequency range.
% Note: They note that the main point behind the design is electrical symmetry of the two ports to make driving the
% thing differentially cleaner. We should adopt this observation for our inductors, which likewise are electrically
% symmetric when compared to a single-layer spiral inductor.
\subsection{A Brief Historical Diversion on Basket-Woven Air Coils}
Since the early days of radio engineering, the parasitic capacitance of inductors has been a point of
concern~\cite{nesperHandbuchDrahtlosenTelegraphie1921,flemingPrinciplesElectricWave1910}. Going back to the early days
of wireless telegraphy after the turn of the twentieth century, coils with high inductance were needed for the
construction of both transmitters and receivers, but the ferrites that would later permit their compact construction
were still being developed. The ferromagnetic core material of choice back then was laminated iron, which was only
useful at low frequencies due to eddy current losses. As a result, the inductors in radio circuits of the era were often
constructed as air-core coils. While air-core inductors are immune to core saturation, the poor magnetic permeability of
air necessitates a large number of wide turns of wire to reach useful inductance values, which for reasons of
practicality or leakage inductance often could not be wound as a single layer cylindrical coil. This could be resolved
by winding an inductor with many turns on multiple layers, which improves compactness and leakage inductance, but this
in turn gives rise to increased distributed capacitance as now turns with a large voltage differential are layered right
on top of each other.
Before the invention of ferrites, a number of ways were devised to decrease distributed capacitance in multilayer
inductors. These methods can be divided into two general categories: Optimizing the connecting order of turns and
optimizing the winding schema of turns. Both aim at increasing spacing between parts of the coil that have a large
voltage differential.
The connecting order of turns was optimized at the assembly level by stacking coils in a particular
way~\cite{flemingPrinciplesElectricWave1910} and at the component level by winding coils in a particular way to minimize
the voltage differential between adjacent turns---a technique that is still used to this
day~\cite{lopeFirstSelfresonantFrequency2021}. The main winding optimization in the first category concerns winding the
turns of a cylindrical multilayer inductor not layer by layer, but instead layering them diagonally, effectively
connecting adjacent turns in a diagonal zigzag pattern. Then as now, wound inductors applying this technique were not
feasible to manufacture reliably by machine, but the technique can be closely replicated in PCB inductors as shown in
\textcite{leePrintedSpiralWinding2011}. The main limiting factors in a PCB implementation are the requirement for a
large number of vias inside the inductor's turns limiting the achievable turn count\footnote{In PCBs, as opposed to
integrated circuits (ICs), vias limit the achievable turn count when they need to be placed in-line inside the turns as
opposed to on the inside or outside because a PCB's minimum trace/space widths are usually much smaller than the
smallest feasible via, consisting of a minimum-size drill surrounded by a minimum-size annular ring.} and increasing
equivalent series resistance (ESR) through the thin trace sections that are necessary to accomodate the via structure,
as well as the layer pairing limitations when blind vias are used in multilayer PCBs.
This lack of a way to wind high frequency inductors with a machine led to the creation of a number of related winding
schemes that include honeycomb and basket woven coils
\cite{eppenAnforderungenEinzelteileRundfunkempfanger1927,
filbigLehrbuchHochfrequenztechnik1942,
kleinSpulenUndSchwingungskreise1941,
meinkeTaschenbuchHochfrequenztechnik1956,
nottebrockSpulen1950,
struttVerstarkerUndEmpfanger1951,
wiggeRundfunktechnischesHandbuch1930,
zicknerSpulen1927}. The simplest such winding technique is the universal winding as described in depth by
\textcite{querfurthCoilWindingDescription1954}. In a simple, cylindrical wire-wound inductor, the windings are laid down
one right next to the other, until the end of the winding area is met, where the winding direction is reversed. One
layer of such windings forms a helix whose pitch is equal to the wire diameter. A universal winding uses the same
helical scheme reversing at the coil ends, but uses a helical pitch larger than the wire diameter to form a structure
similar to a spool of sewing thread.
Other winding techniques include honeycomb and basket woven coils, some historic examples of which are shown in Fig.\
\ref{fig_illust_honeycomb_basket}. In a honeycomb coil, like in an universal winding, subsequent winding layers are
wound at a criss-cross pattern. The characteristic feature of honeycomb coils is that the winding machine is adjusted to
produce large air gaps between adjacent windings, resulting in a three-dimensional rhomboid pattern that is vaguely
reminiscent of a honeycomb's structure.
In basket-woven coils, a mandrel consisting of an odd number of sticks pointing either radially or axially is used, and
the wire is woven between adjacent sticks in an alternating direction. While visually similar to honeycomb coils, this
winding technique is more suited to homebrew construction and less amenable to mass production by machine. In axially
basket-woven coils, the mandrel can be pulled out after the coil is finished. Like honeycomb coils, the resulting
structure can be made mechanically stable with some lacquer, with the turns carrying the layers where they cross.
Both construction techniques apply similar principles to those leading to the improved high-frequency behavior of
twisted inductors that we describe in this paper.\footnote{Interestingly, the winding schemes of both honeycomb and
basket-woven coils are also governed by the same coprimality condition between the number of turns and the number of
inversions within each turn that we describe for our twisted inductors below, although we could not find an example in
historic literature where this condition was explicitly stated~\cite{eppenAnforderungenEinzelteileRundfunkempfanger1927,
kleinSpulenUndSchwingungskreise1941, wiggeRundfunktechnischesHandbuch1930, querfurthCoilWindingDescription1954}.}
\section{Twisted Inductor Design} \section{Twisted Inductor Design}
In this section, we present a detailed derivation of the layout of twisted inductors. We approach this layout by
construction. Let us first consider a simple, planar, circular spiral coil with a fixed pitch. We will ignore trace
width for now, and consider the trace a thin wire. We will assume the inductor's ports are both located on the positive
$x$-Axis on top of one another on different layers, which also helps to minimize the loop area of the inductor's
connections.
The trace trajectory of a standard planar spiral inductor can be parametrized in polar coordinates $r, \varphi$ based
on an Archimedean spiral:
\begin{equation}
r = a\cdot\varphi
\label{eqn_arch_spi_basic}
\end{equation}
An Archimedean spiral defined this way always starts at the origin, and it continues to infinity. Let us re-parametrize
this spiral to a curve parameter $t$ with range $\left[0,1\right]$, such that $t=0$ corresponds to the start of the
inductor and $t=1$ corresponds to its end. As is customary in PCB inductors, we place the inductor's start on its outer
circumference.
To improve layer utilization, a common technique in PCB inductor design is to use both layers of the PCB for the
inductor's spiral trace, instead of only using the bottom layer for a straight jumper trace. Using both layers this way
allows for wider traces, which lowers resistive losses. We can accomodate this optimization in our definition by
re-defining our normalized radius to allow both positive and negative values, defining negative values to designate
traces on the PCB's bottom layer as follows. Fig.\ \ref{fig_nk_combined} shows both a simple and a two-layer
spiral inductor in the first two columns.
Let $n$ be the turn count of our inductor. The resulting parametrization is:
\begin{align}
\varphi &= 2\pi n t\\\nonumber
r &= r_1 + \left|1 - 2 t\right| \left(r_2 - r_1\right)
\label{eqn_twolayer_spiral}
\end{align}
The resulting spiral trace starts at radius $r_2$ on the positive $x$ axis, and spirals inward until it meets $r_1$,
where the sign indicates a layer change, and the trace reverses to continue back to $r_2$ on another layer. In its PCB
realization, at $r_1$, a via would be placed to connect the end of the spiral trace to a jumper trace on the other layer
of the PCB leading back to the start.
\subsection{From Spiral to Twisted Inductor}
Extending the above parametrization of a spiral inductor's layout, we propose planar \emph{twisted inductors} based on
two core observations:
\begin{description}[\IEEEsetlabelwidth{foo}]
\item[Observation 1.]\hfill\\When using an archimedean spiral, multiple such spirals using the same pitch can be
interleaved by spreading out their start and end points at regular angular intervals.
\item[Observation 2.]\hfill\\In a two-layer spiral inductor (Fig.\ \ref{fig_nk_combined}), we can adjust the turn
count of the pair of traces to move the end point of the bottom layer trace anywhere on the inductor's outer
radius.
\end{description}
Setting the inversion count to $k=1$ in our proposed scheme yields the conventional two-layer counterwound
scheme~\cite{lopeFirstSelfresonantFrequency2021,sproHighVoltageInsulationDesign2021,leePrintedSpiralWinding2011}.
Combining these two observations, we find that by choosing a number $k$ of inversions, i.e. layer jumps, that is coprime
to the number of total turns of the inductor $n$, we achieve a layout where all $k$ pairs of top and bottom-layer traces
naturally connect in series, with the resulting spirals on the top and bottom layers interleaving cleanly. Fig.\
\ref{fig_nk_combined} shows a layout with $n=3$ turns with both a single inversion ($k=1$), which results in a
conventional two-layer inductor, and with $k=2$ inversions, creating two interleaved spirals on both the top and the
bottom layer of the PCB. Fig.\ \ref{fig_nk_complex_illust} in the Appendix of this paper shows
additional layout examples for other values of $n$ and $k$. For $k=\frac{1}{2}$, we get a standard single-layer planar
spiral inductor for any turn count $n$, and for $k=1$ we get a standard two-layer planar spiral inductor for any turn
count $n$. In this paper, we will call all layouts with $k\ge 2$ \emph{Twisted Inductors}. The coordinate description of
Equation\ \ref{eqn_twolayer_spiral} thus becomes:
\begin{align}
\varphi &= 2\pi n t\\\nonumber
r &= r_1 + \left|1 - \left( 2 k t \mod 2 \right) \right| \left(r_2 - r_1\right)
\label{eqn_twisted_spiral}
\end{align}
%\begin{figure}
% \begin{center}
% \includegraphics[width=\figurescale]{figures/nk_interleave_illust.pdf}
% \end{center}
% \caption{single-layer spiral inductor's layout (left), a conventional two-layer planar inductor's layout (middle),
% and a twisted inductor with two inversions (right). All three inductors have $n=3$ turns. Traces on the PCB top
% side are shown in red, traces on the bottom side in blue. In the twisted inductor, each layer contains two
% archimedean spirals that interleave at a regular spacing. The four spirals of the inductor are connected in series
% such that they form three total turns.}
% \label{fig_nk_interleave_illust}
%\end{figure}
\begin{figure}
\begin{center}
\includegraphics[width=\figurescale]{figures/nk_combined.pdf}
\end{center}
\caption{Inductor layouts for several sets of turn count $n$ and inversion count $k$. The top row shows the actual
trace layout in cartesian coordinates, the bottom row visualizes the winding schema.
}
\label{fig_nk_combined}
\end{figure}
Topologically, the shape of our inductors can be described as a $(k, n)$-torus knot. From knot theory, we know that such
a torus knot exists if and only if both $n$ and $k$ are co-prime. Fig.\ \ref{fig_nk_combined} illustrates a derivation
of the coprimality requirement. If we plot the spiral in polar coordinates on a cartesian plot we observe that for a
$n$-turn coil with $k$ inversions, the trace crosses the $\varphi$ axis once for each inversion, wrapping around $r$.
Likewise, it crosses the $r$ axis once for each turn of the inductor, wrapping around $\varphi$. Based on this, we can
re-label the angular axis in steps from $0$ to $k$, and re-label the radial axis in steps from $0$ to $n$. Labelling the
new angular axis $i$ and the new radial axis $j$, in the resulting integer lattice, the trace has slope $1$. We can
state the trace's trajectory as a function of a curve parameter $t \in [0, nk]$ as $f(t) = (i, j) = (t \mod n, t \mod
k)$. To produce a valid inductor, the trace must not intersect anywhere. Thus, the system of congruences
\begin{align}
t &\equiv i \mod n\\
t &\equiv j \mod k
\end{align}
must have a unique solution $t \in [0, nk]$ for all $(i, j)$. This statement corresponds exactly to the Chinese
Remainder Theorem, which states that this solution is unique if and only if $k$ and $n$ are coprime.
In the following paragraphs, we will derive analytical expressions for Ohmic resistance and inductance of inductors
derived under this schema.
%\begin{figure}
% \begin{center}
% \includegraphics[width=0.8\figurescale]{figures/nk_chinese_remainder_illust.pdf}
% \end{center}
% \caption{Illustration of the winding pattern of two twisted inductors. The upper plots show the inductor's actual
% layout with the traces on each side of the substrate colored in red (top) and blue (bottom), respectively. The lower
% plots show the same traces, but \emph{unwrap} the annulus by plotting the traces' polar coordinates on cartesian
% axes. The left axis labels show the normalized radius, with $0$ being at the inductor's inner diameter, $1$ being at
% its outer diameter on the top layer, and $-1$ being at its outer diameter on the bottom layer. The top and right
% axes labels show the axis scaled to match indices $i\in\left[0, n\right]$ and $j\in\left[0, k\right]$,
% respectively.}
% \label{fig_nk_chinese_remainder_illust}
%\end{figure}
\subsubsection{Ohmic Resistance}
The arc length $l$ of a spiral can be calculated from its turn count $n$ and the average of its inner and outer diameter
$\frac{2 r_1 + 2 r_2}{2}=r_1+r_2$ as $l = n\pi\left(r_1 + r_2\right)$. Since going from a standard inductor to a twisted
inductor does not change its turn count nor its dimensions, the combined arc length of all traces of the twisted
inductor does not change. Twisted inductors require two additional vias per inversion, which will increase DC resistance
slightly, but the contribution of these vias will remain small in practical applications since the overall number of
vias is still no more than a couple per turn, and since each via only bridges the short distance between the inductor's
layers.
As a general expression, for a standard or twisted inductor with turn count $n$ and twist count~$k$, given via
resistance $R_\text{via}$ and trace cross-sectional area $A_\text{tr}$, we derive a first order approximation of the
inductor's DC resistance as follows.
\begin{equation}
R_L = n\pi\left(r_1 + r_2\right)\frac{\rho_\text{Cu}}{A_\text{tr}} + \left(2k-1\right)R_\text{via}
\end{equation}
\subsubsection{Inductance}
Even for geometrically simple inductors, analytically calculating their inductance is a surprisingly hard problem whose
complexity quickly escalates when geometrically complex inductors are analyzed, when realistic wire shapes as opposed to
thin wire or current sheet approximations are used, and when taking into account differing magnetic permeabilities of
air or dielectrics and core materials. Instead of precise analytical models, a number of approximations are commonly
used. A commonly referenced approximation for the inductance of planar spiral inductors is given by
\textcite{mohanSimpleAccurateExpressions1999}, whose current-sheet approximation for circular planar spiral inductors we
will use here to estimate our inductor's inductance. The current-sheet approximation from
\textcite{mohanSimpleAccurateExpressions1999} reads:
\begin{equation}
\label{eqn_mohan_approx}
L = \frac{\mu n^2 d_\text{avg} c_1}{2}\left(\ln\left(c_2/\rho\right)+c_3\rho+c_4\rho^2\right)
\end{equation}
In this equation, $c_{1-4}$ denote four empirically determined coeficcients that are specific to the coil's shape. The
values for circular coils are $c_{1-4}=(1.00, 2.46, 0.00, 0.20)$. $\mu$ is the magnetic permeability of air (for an
air-core inductor), $n$ is the number of turns, $d_\text{avg}$ is the \emph{average} turn radius, i.e. $d_\text{avg} =
2\frac{r_1 + r_2}{2} = r_1 + r_2$. $\rho = \frac{r_2-r_1}{r_2+r_1}$ is the planar spiral inductor's \emph{fill ratio}.
The fill ratio encodes the fact that the inductor's turns have less flux linkage the closer to the inductor's center we
get. While turns close to the outside have good flux linkage due to their inner area overlapping well with that of other
turns, turns close to the center not only have a loop area that is only a fraction of that of turns further outwards,
the closer we get to the center, the larger is also the fraction of the field lines returning as leakage flux on the
outside of the inner turn that pass through the inner part of turns further outwards, flipping the sign and contributing
\emph{negative} mutual inductance.
As Equation\ \ref{eqn_mohan_approx} approximates the inductor's whole set of windings as a single, uniform current
sheet, the turn count only appears as a single factor of $n^2$ in the equation, with $\rho$ and $c_{1-4}$ correcting for
the inductor's geometry. To account for twisted inductors, we can separate the inductor into a set of $2k$ simple planar
spiral inductor \emph{branches} that are connected in series by the twisted inductor's vias. Compared to a simple spiral
inductor, for each branch, the inductance according to Equation\ \ref{eqn_mohan_approx} stays the same except that the
factor $n^2$ drops to $\left(\frac{n}{2k}\right)^2$ because the $n$ windings are evenly distributed across the $2k$
branches. Let us now make two assumptions. First, we will assume that the flux linkage between both sides of the
inductor is approximately one. This assumption is grounded in the fact that for practical designs, the substrate
thickness will be small compared to the inductor's diameter. Second, we will for now ignore the spiral inductor's field
asymmetry and assume that the flux linkage between two intertwined branches on the same side of the substrate is
approximately one. In our measurements below we show that for simple spiral inductors this asymmetry, while problematic
in our application, is small in absolute terms, and grows smaller with increasing turn count.
Based on these two assumptions, we can model the twisted inductor as a set of $2k$ series-connected spiral inductors
that are perfectly coupled, with full flux linkage. This results in the total series inductance gaining back the factor
$\frac{1}{2k^2}$ that each branch lost, resulting in identical inductances for a simple planar spiral inductor and a
twisted inductor with the same size and turn count according to Equation\ \ref{eqn_mohan_approx}. This approximation
introduces an error due to the imperfect flux linkage between the two sides of the substrate, and between two spiral
branches located at an angular offset from each other. In our experiments, we found that for our test inductors,
compared to inductances measured with an LCR meter, this error is below \qty{10}{\percent} for $n=5$ turns or more, and
for our test samples matches the performance of Equation\ \ref{eqn_mohan_approx} for the simple planar spiral inductor
case.
\subsection{CAD Integration}
To allow for easy design with twisted inductors and to speed up the laboratory prototyping we performed for this paper,
we created a tool that generates arbitrary twisted inductor layouts, and that is able to output these layouts as PCB
footprint files for the open source KiCad EDA CAD tool~\cite{KiCadEDA}. We integrated the ESR and inductance
approximations as derived above with our tool, so that it provides immediate design feedback when generating inductors.
In order to minimize ESR and maximize PCB area utilization, we made the tool automatically calculate the largest
possible trace width when given a minimum clearance specification.
To handle outputting PCB geometry in a format that can be read from KiCad, we utilized the open source EDA file format
library \emph{gerbonara}. To support the FEM simulations that are described in the next section below, our tool contains
functionality to map gerbonara's geometry representation into that of gmsh~\cite{geuzaineGmsh3DFinite2009}, the FEM
mesher that we chose to interface with Elmer FEM~\cite{ruokolainenElmerCSCElmerfemElmer2023}.
Our inductor design tool is available in this paper's supplementary material as well as at the git repository linked at
the end of this paper.
\section{FEM Simulation}
To validate our analytical approximations, we performed a series of FEM simulations in Elmer FEM. For a number of
inductor layouts, we performed simulations to determine ohmic resistance and inductance. Due to limitations in our
gmsh/Elmer toolchain, we were unable to run simulations for parasitic capacitance and self-resonance, or for coupling
behavior of coil pairs. We found that for these cases which require larger, more complex meshes, gmsh would frequently
crash during meshing, and where we were able to produce meshes, Elmer would only converge for some of them. While these
are problems that can be solved through either a more skillful description of the problem in gmsh and Elmer, or by using
more robust software such as Simulia CST, we decided to instead experimentally measure these quantities instead (cf.\
Section\ \ref{sec_experiments}). While our measurements only cover a small number of inductor samples, their results are
more reliable than results from FEM and can serve as a baseline for future work on such simulations.
We conducted our FEM simulations as follows:
\paragraph{Ohmic Resistance}
In Elmer FEM, we can use the built-in joint static current and joule heating solver to determine the ohmic resistance at
a given current.
\paragraph{Inductance}
We let Elmer determine inductance by first using its coil solver to determine the volumetric current density in our mesh
given a test current, then applying its magnetodynamics solver to solve the electromagnetic field. Elmer provides
routines to derive the total magnetic field energy $U_\text{mag}$ from an EM field solution. Since we have only our
inductor under test inside the simulation volume, with test current $I_\text{test}$, we can then derive the inductor's
inductance according to the well-known relation~\cite{meeekerFiniteElementMethod2015}:
\begin{equation}
L = \frac{2\cdot U_\text{mag}}{I_\text{test}^2}
\end{equation}
\section{Experimental Validation}
\label{sec_experiments}
To experimentally validate our design with real-world inductors, we produced 24 test coupons with a number of variations
of twisted inductors with winding count $n$ between $1$ and $25$, and twist count ranging from $k=\frac{1}{2}$ (simple
single-sided spiral inductor) to $k=37$. All test inductors had an inner diameter of \qty{15}{\milli\meter} and an outer
diameter of \qty{35}{\milli\meter} corresponding to the space available in our IHSM implementation.
\subsection{Inductance and DC resistance}
We measured the inductance and DC resistance of each test coupon using a Keysight U1733C LCR meter at
\qty{100}{\kilo\hertz} for inductance and a Keysight 34465A multimeter in four-wire configuration for DC resistance. We
further determined the self-resonant frequency of each inductor using a LiteVNA64 handheld vector network analyzer. The
results of our measurements are shown in Table\ \ref{tab_coupons}.
We found our inductance approximation to be accurate within \qty{10}{\percent} and our ESR approximation to be accurate
within \qty{20}{\percent} for inductors with three turns or more. For lower turn-count inductors, inductance
measurements are difficult because the small absolute inductances involved are easily disturbed by stray inductances,
and ESR measurements are affected by contact and trace resistance even when measurements are taken in four-wire mode.
In accordance with our design intuition, we found that for high turn count inductors, the doubled trace width that is
afforded by splitting a simple spiral inductor across two PCB layers in any two-layer configuration improves ESR by
approximately a factor of two. Going from a simple single-layer spiral inductor to a simple two-layer spiral inductor
($k=1$), we observe that the resulting inductance decreases by up to \qty{15}{\percent}. We suspect that the main factor
leading to this decrease is radial magnetic flux leakage through the PCB material between the inductor's layers.
Comparing simple two-layer inductors with $k=1$ to the twisted inductors with larger $k$ values that we propose in this
paper, we observe almost identical performance for $k>1$ with decreases of less than \qty{0.5}{\percent} going from
$k=1$ to $k=3$ irrespective of turn count. From these measurements we can conclude that the flux linkage of twisted
inductors almost perfectly matches that of simple two-layer inductors.
Finally, we decided to evaluate the high-frequency performance of twisted inductors. It is well-known that self-resonant
frequency decreases when going from a single-layer spiral inductor to a two-layer spiral inductor while keeping
inductance and dimensions constant~\cite{zhangImprovedCompensationMethod2025}. Our measurements show this effect, with
it being more pronounced with higher turn count. Intuitively, this makes sense if we consider the mechanism of inductor
self-resonance. The primary contributor to self resonance, particularly in higher turn count inductors, is capacitive
coupling between the inductor's windings. In a single-layer spiral inductor, this effect gets partially mitigated since
the strongest coupling exists between adjacent windings, which here have only a small voltage differential as only a
fraction of the inductor's total voltage appears across each winding. Compared to this, when the inductor is constructed
as a simple two-layer inductor with $k=1$, now the start and end windings of the inductor, which have the highest
voltage differential, are located right on top of each other with the substrate in between. Making things worse, common
PCB substrates have a relative permittivity much larger than air (usually around $4$).
We observe that this decrease in high-frequency performance is eventually counteracted by increasing inversion count
$k$. While our test samples focused on smaller turn counts, we observe a notable increase from a self-resonant frequency
of \qty{8.9}{\mega\hertz} for a standard $n=25,k=1$ inductor to \qty{10.6}{\mega\hertz} for $n=25,k=13$. Prompted by
this observation, we produced another set of 15 samples focusing on this aspect. We report our results of this
investigation in the following section.
In conclusion to the above measurement results, we observe that twisted inductors \emph{improve} high-frequency
performance compared to simple two-layer inductors while closely matching them in ESR and inductance. While they peform
worse than simple single-layer inductors in high-frequency performance, the increased trace width that two-layer
inductors allow for lowers resistive losses by approximately a factor of four. In applications where resistive losses
lead to the choice of a two-layer inductor, twisted inductors provide improved high-frequency performance at no
additional cost and without compromising other performance parameters.
\setlength{\tabcolsep}{4pt}
\begin{table}
\caption{Inductor sample design parameters and measured characteristics. All inductors have outer diameter
\qty{35}{\milli\meter} and inner diameter \qty{15}{\milli\meter}. The missing values in the simulation results
columns result from the solver failing to converge.}
\begin{tabular}{cc|cc|cc|ccc}
\multicolumn{2}{c|}{}&
\multicolumn{2}{c|}{\textbf{Design}}&
\multicolumn{2}{c|}{\textbf{Simulation}}&
\multicolumn{3}{c}{\textbf{Measured}}\\
$n$&
$k$&
$L$&
$R$&
$L$&
$R$&
$L$&
$f_\text{res}$&
$R$\\
&
&
$\left[\unit{\micro\henry}\right]$&
$\left[\unit{\ohm}\right]$&
$\left[\unit{\micro\henry}\right]$&
$\left[\unit{\ohm}\right]$&
$\left[\unit{\micro\henry}\right]$&
$\left[\unit{\mega\hertz}\right]$&
$\left[\unit{\ohm}\right]$\\\hline
\rowcolor[gray]{0.9}
$1$& $3$& $0.03$& $0.0095$& $0.039$& $0.008$& $0.056$& ${465}$& ${0.0143}$\\
$1$& $4$& $0.03$& $0.0108$& $0.040$& $0.008$& ${0.059}$& $460$& $0.0150$\\
$1$& $5$& $0.03$& $0.0123$& $0.041$& $0.009$& $0.055$& $460$& $0.0166$\\
\hline\rowcolor[gray]{0.9}
$2$& $1$& $0.12$& $0.0253$& $0.127$& $0.024$& $0.149$& ${246}$& ${0.0284}$\\
$2$& $3$& $0.12$& $0.0270$& $0.128$& $0.025$& ${0.152}$& $241$& $0.0291$\\
$2$& $5$& $0.12$& $0.0299$& $0.130$& $0.027$& $0.147$& $226$& $0.0300$\\
\hline\rowcolor[gray]{0.9}
$3$& $1$& $0.26$& $0.0454$& $0.262$& $0.044$& ${0.287}$& ${146}$& $0.0461$\\
$3$& $4$& $0.26$& $0.0479$& $0.265$& $0.046$& ${0.286}$& ${146}$& ${0.0455}$\\
\hline\rowcolor[gray]{0.9}
$5$& $1$& $0.73$& $0.0755$& $0.670$& $0.074$& ${0.693}$& $61.3$& $0.0778$\\
$5$& $3$& $0.73$& $0.0763$& $0.671$& $0.074$& ${0.694}$& ${70.3}$& $0.0727$\\
$5$& $7$& $0.73$& $0.0802$& $0.675$& $0.077$& ${0.694}$& $68.0$& ${0.0672}$\\
\hline\rowcolor[gray]{0.9}
$10$& $1$& $2.90$& $0.2513$& $2.700$& $0.250$& ${2.718}$& $24.1$& $0.2322$\\
$10$& $3$& $2.90$& $0.2520$& $2.700$& $0.250$& $2.714$& ${28.6}$& $0.2255$\\
$10$& $7$& $2.90$& $0.2554$& $2.700$& $0.252$& $2.713$& $28.1$& ${0.2122}$\\
\hline\rowcolor[gray]{0.9}
$25$& $1$& $18.15$& $1.8843$& $16.900$& $1.900$& $16.938$& $8.84$& $1.7024$\\
$25$& $3$& $18.15$& $1.8851$& N/A& N/A& $16.919$& $8.60$& $1.6360$\\
$25$& $13$& $18.15$& $1.9016$& $16.900$& $1.900$& $16.931$& ${10.56}$& ${1.5429}$\\
$25$& $37$& $18.15$& $2.0197$& $17.100$& $2.000$& ${17.066}$& $10.31$& $1.6980$\\
\end{tabular}
\label{tab_coupons}
\end{table}
\subsection{Inductance and Frequency Behavior of Larger Coils}
To investigate the high-frequency behavior of twisted inductors further, we produced and measured 15 additional sample
inductors that were larger (up to \qty{90}{\milli\meter} outer diameter) and that had a higher turn count (up to 53)
compared to our initial set of samples. The parameters of these new samples and our measurement results are shown in
Table\ \ref{tab_wide_coils}. In these results, we can identify three clear trends. First, the ESR of twisted inductors
is generally poorer when compared to two-layer spiral inductors. This increase in ESR is due to the large number of vias
used in these sample inductors. It should be noted that while twisted inductors have worse ESR compared to conventional
two-layer inductors, in our first set of test coupons we saw that their ESR is still better than that of a single-layer
inductor because the traces can be made wider. Our second observation is that in every set of samples from this second
run of physically larger inductors, twisted inductors outperform conventional planar inductors in self-resonant
frequency by a considerable margin with an increase in SRF of up to \qty{58}{\percent} from our
$d_2=\qty{65}{\milli\meter}$ sample going from $k=1$ to $k=100$.
Our third observation is that unlike in the smaller inductors from Table\ \ref{tab_coupons}, in these larger instances,
twisted inductors show increased inductance by approximately \qty{3.7}{\percent} for our smallest samples, and
\qty{6.5}{\percent} for our largest samples. This behavior indicates that large twisted inductors indeed behave like a
combination between a conventional planar spiral inductor and a conventional planar toroidal inductor. Comparing the
magnitude of this increase with the measurements listed in Table\ \ref{tab_wide_coils} for planar toroidal inductors, we
see that this effect exceeds what one would reach by a simple series configuration of both styles of inductor,
indicating a contribution from flux linkage.
\begin{table}
\caption{Parameters and measurement results of a set of larger sample inductors. Bold values indicate best
performance at a given size. Shaded rows indicate conventional planar toroidal ($n=1$) or two-layer planar
spiral inductors ($k=1$).}
\begin{tabular}{cc|cc|ccc|c}
$d_1$&
$d_2$&
$n$&
$k$&
$L$&
$R_\text{ESR}$&
$f_\text{Res}$&
$C_\text{p}$\\
$\left[\unit{\milli\meter}\right]$&
$\left[\unit{\milli\meter}\right]$&
&
&
$\left[\unit{\micro\henry}\right]$&
$\left[\unit{\ohm}\right]$&
$\left[\unit{\mega\hertz}\right]$&
$\left[\unit{\pico\farad}\right]$\\\hline
\rowcolor[gray]{0.9}
$25$&$40$&$1$ &$150$& $5.00$& $11.0$& N/A& N/A\\
\rowcolor[gray]{0.9}
$25$&$40$&$53$ &$1$& $120$& $\mathbf{19.6}$& $18.0$& $0.65$\\
$25$&$40$&$53$ &$50$& $121$& $22.6$& $\mathbf{27.5}$& $\mathbf{0.28}$\\
$25$&$40$&$53$ &$100$& $123$& $26.9$& $26.5$& $0.29$\\
$25$&$40$&$53$ &$150$& $\mathbf{125}$& $33.2$& $24.0$& $0.35$\\\hline
\rowcolor[gray]{0.9}
$50$&$65$&$1$ &$300$& $10.2$& $21.9$& N/A& N/A\\
\rowcolor[gray]{0.9}
$50$&$65$&$53$ &$1$& $270$& $\mathbf{35.7}$& $10.0$& $0.94$\\
$50$&$65$&$53$ &$100$& $272$& $41.9$& $\mathbf{15.8}$& $\mathbf{0.37}$\\
$50$&$65$&$53$ &$200$& $277$& $50.1$& $13.3$& $0.52$\\
$50$&$65$&$53$ &$300$& $\mathbf{280}$& $65.0$& $13.8$& $0.48$\\\hline
\rowcolor[gray]{0.9}
$75$&$90$&$1$ &$480$& $17.3$& $35.5$& N/A& N/A\\
\rowcolor[gray]{0.9}
$75$&$90$&$53$ &$1$& $441$& $\mathbf{50.7}$& $7.00$& $1.17$\\
$75$&$90$&$53$ &$160$& $444$& $60.8$& $\mathbf{10.0}$& $\mathbf{0.57}$\\
$75$&$90$&$53$ &$320$& $461$& $76.2$& $8.75$& $0.72$\\
$75$&$90$&$53$ &$480$& $\mathbf{470}$& $92.9$& $8.00$& $0.84$\\
\end{tabular}
\label{tab_wide_coils}
\end{table}
\subsection{Coupling and its Sensitivity to Radial Offset}
To evaluate twisted inductors in our WPT application, we measured the variation of the coupling between a pair of
inductors using an automated measurement setup consisting of a 3D gantry built from an old 3D printer, with a fourth
rotation axis provided by a small servo that allows us to position two inductor test coupons at arbitrary offsets and
angles to one another (cf.\ Fig.\ \ref{fig_setup_probe}).
\begin{figure}
\begin{center}
\includegraphics[width=.85\figurescale]{figures/test_schematic.pdf}
\end{center}
\caption{The test schematic used in all measurements. For direct coupling factor measurements, the load resistor was
disconnected. We measure voltage at the output of the function generator to account for drop in its internal output
resistance.}
\label{fig_test_schematic}
\end{figure}
\begin{figure}
\begin{center}
\includegraphics[width=.5\figurescale]{figures/setup_probe_small.jpg}
\end{center}
\caption{The automated measurement setup we used to measure coupling while sweeping through linear and angular
displacements.}
\label{fig_setup_probe}
\end{figure}
To approximate our application, we loaded the secondary inductor with a \qty{10}{\ohm} resistor while providing a signal
at a \qty{300}{\kilo\hertz} carrier frequency to the primary inductor from a Siglent SDG6022X function generator as
shown in Fig.\ \ref{fig_test_schematic}. We measured both the input and output voltages of the coupled inductor pair
using Keysight 34465A multimeters in AC Root Mean Square (RMS) mode.
\begin{figure}
\begin{center}
\includegraphics[width=\figurescale]{figures/symmetry_3turn_n_twist.pdf}
\end{center}
\caption{RMS output voltage of the test circuit from Fig.\ \ref{fig_test_schematic} for three pairs of matching
inductors with one inductor rotating w.r.t.\ the other. The inductors have $n=3$ turns each and $k=\frac{1}{2}$,
$k=1$, and $k=3$, respectively. For each $k$, voltage curves are plotted for a number of different radial offsets
between the two inductor's centers.}
\label{fig_symmetry_3turn_n_twist}
\end{figure}
Fig.\ \ref{fig_symmetry_3turn_n_twist} shows the ratio between input and output voltage of our test link for a set of
three-turn inductors with multiple inversion numbers $k$ when one inductor is rotated. In practical WPT setups, the
transmitter and receiver coils are rarely aligned perfectly, so we show measurements across a range of radial offsets.
In line with our inductance measurements, coupling is lower at $k>0$ compared to a single-layer spiral inductor. Across
one revolution, we find that the single-layer spiral inductor exhibits the most voltage ripple, with simple two-layer
inductors with $k=1$ already improving ripple. For $k$ above $1$, ripple amplitude stay sconstant, but energy is shifted
into higher frequencies that are easier to passively filter on the WPT link's secondary side in our application.
Expanding our measurements in the previous section, we performed a series of measurements rotating both inductors. In
these measurements, the coils' distance is fixed \qty{1}{\milli\meter} and the radial offset is set to a worst-case
value of \qty{4}{\milli\meter}. Fig.\ \ref{fig_rms_ripple_n3} shows the normalized output voltage of a WPT link made
from three-turn inductors with rotation of one inductor shown on the horizontal axis, and the rotation of the other
shown on the vertical axis.
We performed similar measurements on 24 of our test coupons at \qty{1}{\milli\meter} and \qty{4}{\milli\meter} radial
offsets. Fig.\ \ref{fig_k_ripple_plot} shows the combined results of these measurements, with worst-case voltage
variation plotted across inversion count $k$ for multiple turn counts $n$ and radial offsets $r$. In this graph, we see
that twisted inductors improve ripple compared to conventional designs, even at a low inversion count such as $k=3$.
Concluding our measurements, we achieved our primary objective of reducing coupling variation under rotation, with
twisted inductors ($k>1$) improving over conventional two-layer spiral inductors, which perform better than simple
single-layer spiral inductors. This improvement is greatest for inductors with low turn count and consequentially coarse
pitch, as their turns deviate the furthest from a set of ideal, concentric circles.
\begin{figure}
\begin{center}
\includegraphics[width=.85\figurescale]{figures/k_ripple_plot.pdf}
\end{center}
\caption{RMS Voltage ripple as a percentage of total RMS
output voltage in a rotating WPT setup with $R_L=\qty{10}{\ohm}$, coil distance $d=\qty{1}{\milli\meter}$ plotted
w.r.t. inductor inversion count $k$. Measurements were taken at two radial offsets of $r=\qty{1}{\milli\meter}$ and
$\qty{4}{\milli\meter}$. The shaded area indicates conventional coil layouts, with the remainder of the plot showing
twisted inductors.}
\label{fig_k_ripple_plot}
\end{figure}
%\begin{figure}
% \begin{center}
% \includegraphics[width=.6\figurescale]{figures/field_plot_3d_n5_k0.pdf}
% \end{center}
% \caption{The coupling between a pair of identical coils (here two simple spiral inductors with $n=5$ and
% $k=\frac{1}{2}$)
% visualized in three dimensions. The $x$ and $y$ axis show in-plane displacement, and the $z$ axis shows output
% amplitude in arbitrary units. Height and rotation are fixed to \qty{1}{\milli\meter} and \qty{0}{\degree},
% respectively. The most prominent aspects of this plot are that coupling falls off steeply with distance, and that
% the rotation-dependent variation is small in comparison. The circular valley around the central peak is the region
% where one inductor is mostly outside the other inductors, and intersects the field lines returning from the other
% inductor's back, leading to a negative coupling coefficient.}
% \label{fig_field_plot_3d}
%\end{figure}
\begin{figure}
\begin{center}
\includegraphics[width=.75\figurescale]{figures/rms_ripple_double_rotation_n3_r4.pdf}
\end{center}
\caption{RMS ripple magnitude as a percentage of mean RMS output voltage, plotted against the rotation of each of
the two inductors for three variants of three-turn coils. The two coils were kept at a constant
\qty{4}{\milli\meter} radial offset, and the output coil was loaded with a \qty{10}{\ohm} load. The plots share the
same color scale to allow for visual comparison.
% , plots for $n=5$ can be found in Figure\ \ref{fig_rms_ripple_n5} and plots for $n=\{10,25\}$ in Figures
% \ref{fig_rms_ripple_n10} and \ref{fig_rms_ripple_n25} in the Appendix.
}
\label{fig_rms_ripple_n3}
\end{figure}
%\begin{figure}
% \begin{center}
% \includegraphics[width=.75\figurescale]{figures/rms_ripple_double_rotation_n5_r4.pdf}
% \end{center}
% \caption{RMS ripple magnitude as shown in Figure\ \ref{fig_rms_ripple_n3} for four different 5-turn coils.}
% \label{fig_rms_ripple_n5}
%\end{figure}
\section{Future Work}
Our derivation of twisted inductors opens up a space for future research. On the practical side, as part of our inductor
design tool, we extended the EDA file format library gerbonara with code to automatically map gerbonara's geometry
description to the gmsh FEM mesher. This code may be of independent interest since it allows for the extraction of FEM
meshes from not just individual planar components, but PCBs in any file format supported by gerbonara such as KiCad's
native file format, as well as the Gerber file format supported by the majority of EDA tools.
On the theoretical side, the fact that our twisted inductor model generalizes both one- or two-layer planar spiral
inductors as well as planar toroidal inductors would make the deduction of key parameters such as inductance and
distributed capacitance by mathematical analysis or by finite element methods interesting. Furthermore, the precise
contribution of vias to the twisted inductor's parasitics is interesting, especially for layouts with large values of
inversion count $k$. We suspect that via influence will be frequency dependant as vias and traces have distinct DC
resistances, and skin effect will affect both to a differring extent.
\section{Conclusion} \section{Conclusion}
\section*{Availability} In this paper, we introduced a novel layout approach for planar, multi-layer inductors. Our \emph{twisted} inductors
This is version \texttt{\input{version.tex}\unskip} of this paper, generated on \today. generalize several types of conventional planar inductors including conventional single- or two-layer planar spiral
inductors as well as planar toroidal inductors. For inversion count parameter $k\ge 2$, twisted inductors produce
magnetic field distributions that have better rotational symmetry along the inductor's main axis compared to either
conventional single- or two-layer planar spiral inductors, which yields lower output ripple in WPT through rotating
joints and enables the use of smaller and lighter secondary-side circuitry, improving efficiency.
% The git repository with the Furthermore, besides the advantages twisted inductors show in our particular application, we found that our sample
% LaTeX source for this paper as well as our data analysis and demo code can be found at: twisted inductors have up to \qty{50}{\percent} improved self-resonant frequency as well as up to \qty{6.5}{\percent}
increased inductance compared to conventional two-layer planar spiral inductors.
% \center{\url{https://git.jaseg.de/nice-coils.git}} We base our evaluation on laboratory measurements on a set of 39 sample inductors in total, including an automated,
four-dimensional mapping of the coupling between a pair of identical inductors. We provide both an analytical
description of twisted inductor construction as well as a set of Open-Source tools for their design, available at the
link at the end of this paper.
\printbibliography[heading=bibintoc] \printbibliography[heading=bibintoc]
%\section{Supplemental plots}
%\begin{figure}
% \begin{center}
% \includegraphics[width=\figurescale]{figures/symmetry_10turn_n_twist.pdf}
% \end{center}
% \caption{Coupled RMS output voltage of three pairs of matching inductors with $n=10$ turns each and
% $k=\frac{1}{2}$, $k=1$, and $k=3$, respectively, shown as in Figure\ \ref{fig_symmetry_3turn_n_twist}}
% \label{fig_symmetry_10turn_n_twist}
%\end{figure}
%\begin{figure}
% \begin{center}
% \includegraphics[width=.75\figurescale]{figures/rms_ripple_double_rotation_n10_r4.pdf}
% \end{center}
% \caption{RMS ripple magnitude as shown in Figure\ \ref{fig_rms_ripple_n3} for four different 10-turn coils.}
% \label{fig_rms_ripple_n10}
%\end{figure}
%\begin{figure}
% \begin{center}
% \includegraphics[width=.75\figurescale]{figures/rms_ripple_double_rotation_n25_r4.pdf}
% \end{center}
% \caption{RMS ripple magnitude as shown in Figure\ \ref{fig_rms_ripple_n3} for four different 25-turn coils.}
% \label{fig_rms_ripple_n25}
%\end{figure}
\FloatBarrier
%\section{Layout examples}
%\label{sec_appendix_layout_examples}
\begin{figure*}
\appendix
\begin{center}
\includegraphics[width=.75\textwidth]{figures/nk_complex_illust.pdf}
\end{center}
\caption{Layout examples for a number of combinations of turn count $n$ and inversion count $k$. Note that in this
illustration we chose values for $n$ and $k$ such that all pairs are coprime.}
\label{fig_nk_complex_illust}
\end{figure*}
\end{document} \end{document}

View file

@ -1 +1 @@
final-tpel-submission-2025-01-27-0-g99d4905

BIN
pretty_plots.pdf Normal file

Binary file not shown.

15331
pretty_plots.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.2 MiB

View file

@ -14,6 +14,7 @@ import time
import math import math
import json import json
import subprocess import subprocess
import re
import tqdm import tqdm
import click import click
@ -25,7 +26,7 @@ def mesh_args(db, coil_id, mesh_type, mesh_file, outfile, **kwargs):
rows = dict(db.execute('SELECT key, value FROM results WHERE coil_id=?', (coil_id,)).fetchall()) rows = dict(db.execute('SELECT key, value FROM results WHERE coil_id=?', (coil_id,)).fetchall())
rows.update(kwargs) rows.update(kwargs)
args = ['python', '-m', 'twisted_coil_gen_twolayer', mesh_type, mesh_file, '--pcb'] args = ['python', '-m', 'twisted_coil_gen_twolayer', mesh_type, mesh_file, '--pcb']
for k, v in rows: for k, v in rows.items():
prefix, _, k = k.partition('.') prefix, _, k = k.partition('.')
if v != 'False' and prefix == 'gen': if v != 'False' and prefix == 'gen':
args.append('--' + k.replace('_', '-')) args.append('--' + k.replace('_', '-'))
@ -104,9 +105,10 @@ def list_runs(ctx):
@cli.command() @cli.command()
@click.option('-r', '--run-id') @click.option('-r', '--run-id')
@click.option('-l', '--log-dir', default='logs', type=click.Path(dir_okay=True, file_okay=False, path_type=pathlib.Path))
@click.option('-m', '--mesh-dir', default='meshes') @click.option('-m', '--mesh-dir', default='meshes')
@click.pass_context @click.pass_context
def list_coils(ctx, run_id, mesh_dir): def list_coils(ctx, run_id, log_dir, mesh_dir):
db = ctx.obj['db_connect']() db = ctx.obj['db_connect']()
if run_id is None: if run_id is None:
run_id, = db.execute('SELECT run_id FROM runs ORDER BY timestamp DESC LIMIT 1').fetchone() run_id, = db.execute('SELECT run_id FROM runs ORDER BY timestamp DESC LIMIT 1').fetchone()
@ -122,9 +124,11 @@ def list_coils(ctx, run_id, mesh_dir):
'gen.inner_diameter': 'ID[mm]', 'gen.inner_diameter': 'ID[mm]',
'gen.outer_diameter': 'OD[mm]', 'gen.outer_diameter': 'OD[mm]',
'calculated_fill_factor': 'Fill factor', 'calculated_fill_factor': 'Fill factor',
'calculated_approximate_inductance': 'L [µH]', 'calculated_approximate_inductance': 'L [µH] (design)',
'calculated_trace_length': 'track len [mm]', 'calculated_trace_length': 'track len [mm]',
'calculated_approximate_resistance': 'R [mΩ]'} 'calculated_approximate_resistance': 'R [mΩ] (design)',
'sim_inductance': 'L [µH] (sim)',
'sim_resistance': 'R [mΩ] (sim)'}
out = [] out = []
for row in db.execute('SELECT *, MAX(meshes.timestamp) FROM coils LEFT JOIN meshes ON coils.coil_id=meshes.coil_id WHERE run_id=? GROUP BY coils.coil_id, mesh_type ORDER BY meshes.timestamp', (run_id,)).fetchall(): for row in db.execute('SELECT *, MAX(meshes.timestamp) FROM coils LEFT JOIN meshes ON coils.coil_id=meshes.coil_id WHERE run_id=? GROUP BY coils.coil_id, mesh_type ORDER BY meshes.timestamp', (run_id,)).fetchall():
if row['timestamp']: if row['timestamp']:
@ -151,6 +155,19 @@ def list_coils(ctx, run_id, mesh_dir):
if 'calculated_fill_factor' in params: if 'calculated_fill_factor' in params:
params['calculated_fill_factor'] = f'{float(params["calculated_fill_factor"]):.03f}' params['calculated_fill_factor'] = f'{float(params["calculated_fill_factor"]):.03f}'
log_file = log_dir / (pathlib.Path(row['filename']).stem + '_elmer_self_inductance.log')
if log_file.is_file():
log = log_file.read_text()
resistance = re.search(r'Coil resistance calculated by solver: ([0-9.e+-]*) (\w?)Ω', log)
inductance = re.search(r'Inductance calucated from field: ([0-9.e+-]*) (\w?)H', log)
si_prefix = {'': 1, 'm': 1e-3, 'µ': 1e-6, 'n': 1e-9, 'p': 1e-12}
if resistance:
resistance = float(resistance.group(1)) * si_prefix[resistance.group(2)]
params['sim_resistance'] = format(resistance*1e3, '.3f')
if inductance:
inductance = float(inductance.group(1)) * si_prefix[inductance.group(2)]
params['sim_inductance'] = format(inductance*1e6, '.3f')
out.append([row['coil_id'], row['mesh_type'], state, row['timestamp']] + [params.get(key, '-') for key in keys]) out.append([row['coil_id'], row['mesh_type'], state, row['timestamp']] + [params.get(key, '-') for key in keys])
print(tabulate(out, headers=['coil', 'mesh', 'state', 'time'] + list(keys.values()), disable_numparse=True, stralign='right')) print(tabulate(out, headers=['coil', 'mesh', 'state', 'time'] + list(keys.values()), disable_numparse=True, stralign='right'))
@ -180,13 +197,13 @@ def run(ctx, run_id, log_dir, mesh_dir):
@run.command() @run.command()
@click.option('-j', '--num-jobs', type=int, default=1, help='Number of jobs to run in parallel') @click.option('-j', '--num-jobs', type=int, default=1, help='Number of jobs to run in parallel')
@click.option('-t', '--mesh-type', type=click.Choice(['split', 'normal', 'mutual']), default=['split', 'normal', 'mutual'], multiple=True)
@click.pass_context @click.pass_context
def generate_meshes(ctx, num_jobs): def generate_meshes(ctx, num_jobs, mesh_type):
db = ctx.obj['db_connect']() db = ctx.obj['db_connect']()
rows = [row['coil_id'] for row in db.execute('SELECT coil_id FROM coils WHERE run_id=?', (ctx.obj['run_id'],)).fetchall()] rows = [row['coil_id'] for row in db.execute('SELECT coil_id FROM coils WHERE run_id=?', (ctx.obj['run_id'],)).fetchall()]
mesh_types = ['split', 'normal', 'mutual']
params = list(itertools.product(rows, mesh_types)) params = list(itertools.product(rows, mesh_type))
all_files = {get_mesh_file(db, ctx.obj['mesh_dir'], ctx.obj['run_id'], coil_id, mesh_type): (coil_id, mesh_type) for coil_id, mesh_type in params} all_files = {get_mesh_file(db, ctx.obj['mesh_dir'], ctx.obj['run_id'], coil_id, mesh_type): (coil_id, mesh_type) for coil_id, mesh_type in params}
todo = [(coil_id, mesh_type) for f, (coil_id, mesh_type) in all_files.items() if not f.is_file()] todo = [(coil_id, mesh_type) for f, (coil_id, mesh_type) in all_files.items() if not f.is_file()]
@ -232,7 +249,7 @@ def self_inductance(ctx, num_jobs):
with tempfile.TemporaryDirectory() as tmpdir: with tempfile.TemporaryDirectory() as tmpdir:
try: try:
tqdm.tqdm.write(f'Processing {mesh_file}') tqdm.tqdm.write(f'Processing {mesh_file}')
res = subprocess.run(['python', '-m', 'coil_parasitics', 'inductance', '--sim-dir', tmpdir, mesh_file], check=True, capture_output=True) res = subprocess.run(['python', '-m', 'coil_parasitics', 'inductance', '--sim-dir', tmpdir, mesh_file], check=True, capture_output=True, text=True)
logfile.write_text(res.stdout+res.stderr) logfile.write_text(res.stdout+res.stderr)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print(f'Error running simulation, rc={e.returncode}') print(f'Error running simulation, rc={e.returncode}')
@ -266,8 +283,8 @@ def self_inductance(ctx, num_jobs):
q.join() q.join()
@run.command() @run.command()
@click.option('target_hosts', type=click.Path(exists=True, dir_okay=False, path_type=pathlib.Path), help='File with one SSH target host name per line') @click.argument('target_hosts', type=click.Path(exists=True, dir_okay=False, path_type=pathlib.Path))
@click.option('job_file', type=click.Path(exists=True, dir_okay=False, path_type=pathlib.Path), help='JSON job description file') @click.argument('job_file', type=click.Path(exists=True, dir_okay=False, path_type=pathlib.Path))
@click.pass_context @click.pass_context
def run_mutual_inductance(ctx, target_hosts, job_file): def run_mutual_inductance(ctx, target_hosts, job_file):
db = ctx.obj['db_connect']() db = ctx.obj['db_connect']()
@ -301,7 +318,7 @@ def run_mutual_inductance(ctx, target_hosts, job_file):
'ElmerGrid_stderr.log', 'ElmerGrid_stderr.log',
'ElmerSolver_stdout.log', 'ElmerSolver_stdout.log',
'ElmerSolver_stderr.log']: 'ElmerSolver_stderr.log']:
subprocess.run(['scp', f'{host}:{mesh_abs}/{workdir.name}/{fn}', str(host_log(Path(fn).stem))], check=True, capture_output=True, text=True) subprocess.run(['scp', f'{host}:{mesh_abs}/{workdir.name}/{fn}', str(host_log(Path(fn).stem))], check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print(f'Error copying simulation logs, rc={e.returncode}', file=sys.stderr) print(f'Error copying simulation logs, rc={e.returncode}', file=sys.stderr)

46
svg-vis-paper-2.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

369
svg-vis-paper-3.svg Normal file
View file

@ -0,0 +1,369 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="45.350204mm"
height="42.200001mm"
viewBox="0 0 45.350204 42.200001"
version="1.1"
id="svg1"
sodipodi:docname="svg-vis-paper-3.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="4.6942248"
inkscape:cx="61.458497"
inkscape:cy="121.10626"
inkscape:window-width="3840"
inkscape:window-height="2091"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1335"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1336"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1337"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1338"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1516"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1517"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1518"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1519"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1520"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1521"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1522"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1523"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1524"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1525"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1526"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1527"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1528"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1529"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#1a1a1a;fill-opacity:1;stroke:none"
id="g1530"
transform="translate(-178.4,-349.4)">
<g
id="g76"
style="fill:#1a1a1a">
<circle
cx="180"
cy="351"
r="1.6"
id="circle1334"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="180"
cy="390"
r="1.6"
id="circle1335"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="219"
cy="351"
r="1.6"
id="circle1336"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="219"
cy="390"
r="1.6"
id="circle1337"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="194.82381"
cy="376.36371"
r="0.60000002"
id="circle1515"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="192"
cy="370.5"
r="0.60000002"
id="circle1516"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="210.4111"
cy="384.1821"
r="0.60000002"
id="circle1517"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="194.82381"
cy="364.63629"
r="0.60000002"
id="circle1518"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="195.6059"
cy="387.56119"
r="0.60000002"
id="circle1519"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="201.1689"
cy="363.18799"
r="0.60000002"
id="circle1520"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="183.733"
cy="378.09299"
r="0.60000002"
id="circle1521"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="206.25729"
cy="367.24591"
r="0.60000002"
id="circle1522"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="183.733"
cy="362.90701"
r="0.60000002"
id="circle1523"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="206.25729"
cy="373.75409"
r="0.60000002"
id="circle1524"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="195.6059"
cy="353.43881"
r="0.60000002"
id="circle1525"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="201.1689"
cy="377.81201"
r="0.60000002"
id="circle1526"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="210.4111"
cy="356.8179"
r="0.60000002"
id="circle1527"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="222"
cy="369.23001"
r="0.55000001"
id="circle1528"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="222"
cy="371.76999"
r="0.55000001"
id="circle1529"
style="fill:#1a1a1a" />
</g>
</g>
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2516"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2517"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2518"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2519"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2520"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2521"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2522"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2523"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2524"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2525"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2526"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2527"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2528"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2529"
transform="translate(-178.4,-349.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2530"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2759"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2760"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2761"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2762"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2940"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2941"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2942"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2943"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2944"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2945"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2946"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2947"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2948"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2949"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2950"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2951"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2952"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2953"
transform="translate(-178.4,-349.4)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

378
svg-vis-paper-4.svg Normal file
View file

@ -0,0 +1,378 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="45.350204mm"
height="42.200001mm"
viewBox="0 0 45.350204 42.200001"
version="1.1"
id="svg1"
sodipodi:docname="svg-vis-paper-4.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="6.6386364"
inkscape:cx="89.702157"
inkscape:cy="89.85279"
inkscape:window-width="3840"
inkscape:window-height="2091"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1335"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1336"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1337"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1338"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1516"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1517"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1518"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1519"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1520"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1521"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1522"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1523"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1524"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1525"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1526"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1527"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1528"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1529"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#1a1a1a;fill-opacity:1;stroke:none"
id="g1530"
transform="translate(-178.4,-349.4)">
<g
id="g76"
style="fill:#1a1a1a">
<circle
cx="180"
cy="351"
r="1.6"
id="circle1334"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="180"
cy="390"
r="1.6"
id="circle1335"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="219"
cy="351"
r="1.6"
id="circle1336"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="219"
cy="390"
r="1.6"
id="circle1337"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="194.82381"
cy="376.36371"
r="0.60000002"
id="circle1515"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="192"
cy="370.5"
r="0.60000002"
id="circle1516"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="210.4111"
cy="384.1821"
r="0.60000002"
id="circle1517"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="194.82381"
cy="364.63629"
r="0.60000002"
id="circle1518"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="195.6059"
cy="387.56119"
r="0.60000002"
id="circle1519"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="201.1689"
cy="363.18799"
r="0.60000002"
id="circle1520"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="183.733"
cy="378.09299"
r="0.60000002"
id="circle1521"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="206.25729"
cy="367.24591"
r="0.60000002"
id="circle1522"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="183.733"
cy="362.90701"
r="0.60000002"
id="circle1523"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="206.25729"
cy="373.75409"
r="0.60000002"
id="circle1524"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="195.6059"
cy="353.43881"
r="0.60000002"
id="circle1525"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="201.1689"
cy="377.81201"
r="0.60000002"
id="circle1526"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="210.4111"
cy="356.8179"
r="0.60000002"
id="circle1527"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="222"
cy="369.23001"
r="0.55000001"
id="circle1528"
style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
<circle
cx="222"
cy="371.76999"
r="0.55000001"
id="circle1529"
style="fill:#1a1a1a" />
</g>
</g>
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2516"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2517"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2518"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2519"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2520"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2521"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2522"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2523"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2524"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2525"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2526"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2527"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2528"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2529"
transform="translate(-178.4,-349.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2530"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2759"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2760"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2761"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2762"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2940"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2941"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2942"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2943"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2944"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2945"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2946"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2947"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2948"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2949"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2950"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2951"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2952"
transform="translate(-178.4,-349.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2953"
transform="translate(-178.4,-349.4)" />
<rect
style="fill:#1a1a1a;stroke:none;stroke-width:0.365001;stroke-linecap:round;stroke-linejoin:round"
id="rect76"
width="45.350204"
height="42.200001"
x="0"
y="0"
rx="0"
ry="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="45.349998mm"
height="42.200001mm"
viewBox="0 0 45.349998 42.200001"
version="1.1"
id="svg1"
sodipodi:docname="svg-vis-paper-plain-board-outline.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="6.6386364"
inkscape:cx="60.027388"
inkscape:cy="122.84149"
inkscape:window-width="3840"
inkscape:window-height="2091"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:#000000;stroke-width:0.365001;stroke-linecap:round;stroke-linejoin:round"
id="rect2"
width="45.349998"
height="42.200001"
x="0"
y="0"
rx="0"
ry="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="45.349998mm"
height="42.200001mm"
viewBox="0 0 45.349998 42.200001"
version="1.1"
id="svg1"
sodipodi:docname="svg-vis-paper-plain-bottom-copper.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="6.6386364"
inkscape:cx="40.821636"
inkscape:cy="110.94146"
inkscape:window-width="3840"
inkscape:window-height="2091"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1379"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1380"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1381"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1382"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1411"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1412"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1413"
transform="translate(-349.4,-121.4)" />
<path
id="path1652"
style="fill:#4d7fc4;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 42.850098 18.830375 A 1 1 0 0 0 41.850159 19.830314 A 1 1 0 0 0 42.850098 20.830253 L 44.349748 20.830253 A 1 1 0 0 0 45.350203 19.830314 A 1 1 0 0 0 44.349748 18.830375 L 42.850098 18.830375 z M 43.599923 19.27996 A 0.55000001 0.55000001 0 0 1 44.14976 19.829797 A 0.55000001 0.55000001 0 0 1 43.599923 20.380151 A 0.55000001 0.55000001 0 0 1 43.050085 19.829797 A 0.55000001 0.55000001 0 0 1 43.599923 19.27996 z M 28.599805 20.699512 A 0.40000001 0.40000001 0 0 0 28.597221 20.700028 A 0.40000001 0.40000001 0 0 0 28.405501 20.751705 A 0.40000001 0.40000001 0 0 0 28.3962 20.756873 A 0.40000001 0.40000001 0 0 0 28.256156 20.896916 A 0.40000001 0.40000001 0 0 0 28.251506 20.905184 A 0.40000001 0.40000001 0 0 0 28.199829 21.100004 A 0.40000001 0.40000001 0 0 0 28.251506 21.294824 A 0.40000001 0.40000001 0 0 0 28.256156 21.303092 A 0.40000001 0.40000001 0 0 0 28.3962 21.443136 A 0.40000001 0.40000001 0 0 0 28.405501 21.448303 A 0.40000001 0.40000001 0 0 0 28.597221 21.49998 A 0.40000001 0.40000001 0 0 0 28.599805 21.500496 L 38.434347 21.500496 L 39.586214 22.652881 A 0.40000001 0.40000001 0 0 0 39.603784 22.666833 A 0.40000001 0.40000001 0 0 0 39.639441 22.695256 A 0.40000001 0.40000001 0 0 0 39.677165 22.719027 A 0.40000001 0.40000001 0 0 0 39.714372 22.736597 A 0.40000001 0.40000001 0 0 0 39.762948 22.75365 A 0.40000001 0.40000001 0 0 0 39.799121 22.761918 A 0.40000001 0.40000001 0 0 0 39.850798 22.767603 A 0.40000001 0.40000001 0 0 0 39.869401 22.76967 L 41.850159 22.76967 L 41.937492 22.76967 A 1 1 0 0 0 41.987101 22.849251 A 1 1 0 0 0 42.055314 22.959322 A 1 1 0 0 0 42.181921 23.096265 A 1 1 0 0 0 42.272355 23.176363 A 1 1 0 0 0 42.456323 23.276099 A 1 1 0 0 0 42.545207 23.317957 A 1 1 0 0 0 42.850098 23.369633 L 44.349748 23.369633 A 1 1 0 0 0 45.350203 22.369694 A 1 1 0 0 0 44.349748 21.369755 L 42.850098 21.369755 A 1 1 0 0 0 42.545207 21.421431 A 1 1 0 0 0 42.454773 21.463806 A 1 1 0 0 0 42.273389 21.561991 A 1 1 0 0 0 42.181405 21.64364 A 1 1 0 0 0 42.054797 21.781099 A 1 1 0 0 0 41.988652 21.887036 A 1 1 0 0 0 41.937492 21.969202 L 41.850159 21.969202 L 40.035282 21.969202 L 38.883415 20.816817 A 0.40000001 0.40000001 0 0 0 38.875663 20.810616 A 0.40000001 0.40000001 0 0 0 38.871529 20.806999 A 0.40000001 0.40000001 0 0 0 38.816235 20.76359 A 0.40000001 0.40000001 0 0 0 38.813652 20.761523 A 0.40000001 0.40000001 0 0 0 38.811584 20.76049 A 0.40000001 0.40000001 0 0 0 38.801766 20.755839 A 0.40000001 0.40000001 0 0 0 38.747506 20.728967 A 0.40000001 0.40000001 0 0 0 38.742855 20.7269 A 0.40000001 0.40000001 0 0 0 38.724768 20.719666 A 0.40000001 0.40000001 0 0 0 38.719084 20.718115 A 0.40000001 0.40000001 0 0 0 38.656038 20.704163 A 0.40000001 0.40000001 0 0 0 38.651904 20.703129 A 0.40000001 0.40000001 0 0 0 38.62865 20.701579 A 0.40000001 0.40000001 0 0 0 38.600228 20.699512 L 28.599805 20.699512 z M 28.599805 20.900016 A 0.2 0.2 0 0 1 28.799792 21.100004 A 0.2 0.2 0 0 1 28.599805 21.299992 A 0.2 0.2 0 0 1 28.399817 21.100004 A 0.2 0.2 0 0 1 28.599805 20.900016 z M 43.599923 21.819857 A 0.55000001 0.55000001 0 0 1 44.14976 22.370211 A 0.55000001 0.55000001 0 0 1 43.599923 22.920048 A 0.55000001 0.55000001 0 0 1 43.050085 22.370211 A 0.55000001 0.55000001 0 0 1 43.599923 21.819857 z " />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2411"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2412"
transform="translate(-349.4,-121.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2413"
transform="translate(-349.4,-121.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2662"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2803"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2804"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2805"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2806"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2835"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2836"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2837"
transform="translate(-349.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1359"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1360"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1361"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1362"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1408"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1409"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1410"
transform="translate(-292.4,-121.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:0.8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g1651"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2408"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#4d7fc4;fill-opacity:1;stroke:none"
id="g2409"
transform="translate(-292.4,-121.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2410"
transform="translate(-292.4,-121.4)" />
<g
style="fill:none;stroke:#4d7fc4;stroke-width:0.8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2659"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2783"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2784"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2785"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2786"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2832"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2833"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2834"
transform="translate(-292.4,-121.4)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="45.349998mm"
height="42.200001mm"
viewBox="0 0 45.349998 42.200001"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
sodipodi:docname="svg-vis-paper-plain-vias.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="6.6386364"
inkscape:cx="60.102704"
inkscape:cy="110.94146"
inkscape:window-width="3840"
inkscape:window-height="2091"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1379"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1380"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1381"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1382"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1411"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1412"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1413"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#c83434;fill-opacity:1;stroke:none"
id="g2597"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#c83434;fill-opacity:1;stroke:none"
id="g2598"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:none;stroke:#c83434;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2599"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:none;stroke:#c83434;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2848"
transform="translate(-349.4,-134.36458)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1359"
transform="translate(-292.4,-121.4)">
<path
id="circle1358"
d="M 293.9999 121.4 A 1.6 1.6 0 0 0 292.4 122.9999 A 1.6 1.6 0 0 0 293.9999 124.5998 A 1.6 1.6 0 0 0 295.5998 122.9999 A 1.6 1.6 0 0 0 293.9999 121.4 z M 333.00011 121.4 A 1.6 1.6 0 0 0 331.4002 122.9999 A 1.6 1.6 0 0 0 333.00011 124.5998 A 1.6 1.6 0 0 0 334.60001 122.9999 A 1.6 1.6 0 0 0 333.00011 121.4 z M 335.99992 140.67996 A 0.55000001 0.55000001 0 0 0 335.45009 141.2298 A 0.55000001 0.55000001 0 0 0 335.99992 141.78015 A 0.55000001 0.55000001 0 0 0 336.54976 141.2298 A 0.55000001 0.55000001 0 0 0 335.99992 140.67996 z M 320.9998 142.30002 A 0.2 0.2 0 0 0 320.79982 142.5 A 0.2 0.2 0 0 0 320.9998 142.69999 A 0.2 0.2 0 0 0 321.19979 142.5 A 0.2 0.2 0 0 0 320.9998 142.30002 z M 335.99992 143.21986 A 0.55000001 0.55000001 0 0 0 335.45009 143.77021 A 0.55000001 0.55000001 0 0 0 335.99992 144.32005 A 0.55000001 0.55000001 0 0 0 336.54976 143.77021 A 0.55000001 0.55000001 0 0 0 335.99992 143.21986 z M 293.9999 160.4002 A 1.6 1.6 0 0 0 292.4 162.00011 A 1.6 1.6 0 0 0 293.9999 163.60001 A 1.6 1.6 0 0 0 295.5998 162.00011 A 1.6 1.6 0 0 0 293.9999 160.4002 z M 333.00011 160.4002 A 1.6 1.6 0 0 0 331.4002 162.00011 A 1.6 1.6 0 0 0 333.00011 163.60001 A 1.6 1.6 0 0 0 334.60001 162.00011 A 1.6 1.6 0 0 0 333.00011 160.4002 z "
style="fill:#000000" />
</g>
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1360"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1361"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1362"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1408"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1409"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#d0d2cd;fill-opacity:1;stroke:none"
id="g1410"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#c83434;fill-opacity:1;stroke:none"
id="g2594"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#c83434;fill-opacity:1;stroke:none"
id="g2595"
transform="translate(-292.4,-121.4)" />
<g
style="fill:none;stroke:#c83434;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2596"
transform="translate(-292.4,-121.4)" />
<g
style="fill:none;stroke:#c83434;stroke-width:0.8;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g2845"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2970"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2971"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g2972"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g3018"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g3019"
transform="translate(-292.4,-121.4)" />
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g3020"
transform="translate(-292.4,-121.4)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

250
svg-vis-paper.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import warnings
import subprocess import subprocess
import sys import sys
import math import math
@ -605,6 +606,8 @@ def print_valid_twists(ctx, param, value):
@click.option('--outer-diameter', type=float, default=50, help='Outer diameter [mm]') @click.option('--outer-diameter', type=float, default=50, help='Outer diameter [mm]')
@click.option('--svg-out', type=click.Path(writable=True, dir_okay=False, path_type=Path), help='Filename to output SVG illustration of the coil to') @click.option('--svg-out', type=click.Path(writable=True, dir_okay=False, path_type=Path), help='Filename to output SVG illustration of the coil to')
@click.option('--inner-diameter', type=float, default=25, help='Inner diameter [mm]') @click.option('--inner-diameter', type=float, default=25, help='Inner diameter [mm]')
@click.option('--stagger-inner-vias/--no-stagger-inner-vias', default=False, help='Stagger inner via ring')
@click.option('--stagger-outer-vias/--no-stagger-outer-vias', default=False, help='Stagger outer via ring')
@click.option('--trace-width', type=float, default=None) @click.option('--trace-width', type=float, default=None)
@click.option('--via-diameter', type=float, default=0.6) @click.option('--via-diameter', type=float, default=0.6)
@click.option('--two-layer/--single-layer', default=True) @click.option('--two-layer/--single-layer', default=True)
@ -617,7 +620,6 @@ def print_valid_twists(ctx, param, value):
@click.option('--twists', type=int, default=1, help='Number of twists per revolution. Note that this number must be co-prime to the number of turns. Run with --show-twists to list valid values. (default: 1)') @click.option('--twists', type=int, default=1, help='Number of twists per revolution. Note that this number must be co-prime to the number of turns. Run with --show-twists to list valid values. (default: 1)')
@click.option('--circle-segments', type=int, default=64, help='When not using arcs, the number of points to use for arc interpolation per 360 degrees.') @click.option('--circle-segments', type=int, default=64, help='When not using arcs, the number of points to use for arc interpolation per 360 degrees.')
@click.option('--show-twists', callback=print_valid_twists, expose_value=False, type=int, is_eager=True, help='Calculate and show valid --twists counts for the given number of turns. Takes the number of turns as a value.') @click.option('--show-twists', callback=print_valid_twists, expose_value=False, type=int, is_eager=True, help='Calculate and show valid --twists counts for the given number of turns. Takes the number of turns as a value.')
@click.option('--close-loop', is_flag=True, help='Close coil loop for simulation meshes')
@click.option('--clearance', type=float, default=None) @click.option('--clearance', type=float, default=None)
@click.option('--arc-tolerance', type=float, default=0.02) @click.option('--arc-tolerance', type=float, default=0.02)
@click.option('--mesh-split-out', type=click.Path(writable=True, dir_okay=False, path_type=Path)) @click.option('--mesh-split-out', type=click.Path(writable=True, dir_okay=False, path_type=Path))
@ -635,7 +637,7 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
footprint_name, layer_pair, twists, clipboard, counter_clockwise, keepout_zone, keepout_margin, footprint_name, layer_pair, twists, clipboard, counter_clockwise, keepout_zone, keepout_margin,
arc_tolerance, pcb, mesh_out, magneticalc_out, circle_segments, mesh_split_out, copper_thickness, arc_tolerance, pcb, mesh_out, magneticalc_out, circle_segments, mesh_split_out, copper_thickness,
board_thickness, mesh_mutual_out, mutual_offset_x, mutual_offset_y, mutual_offset_z, mutual_rotation_z, board_thickness, mesh_mutual_out, mutual_offset_x, mutual_offset_y, mutual_offset_z, mutual_rotation_z,
two_layer, svg_out, close_loop): two_layer, svg_out, stagger_inner_vias, stagger_outer_vias):
if 'WAYLAND_DISPLAY' in os.environ: if 'WAYLAND_DISPLAY' in os.environ:
copy, paste, cliputil = ['wl-copy'], ['wl-paste'], 'xclip' copy, paste, cliputil = ['wl-copy'], ['wl-paste'], 'xclip'
@ -643,7 +645,10 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
copy, paste, cliputil = ['xclip', '-i', '-sel', 'clipboard'], ['xclip', '-o', '-sel' 'clipboard'], 'wl-clipboard' copy, paste, cliputil = ['xclip', '-i', '-sel', 'clipboard'], ['xclip', '-o', '-sel' 'clipboard'], 'wl-clipboard'
if gcd(twists, turns) != 1: if gcd(twists, turns) != 1:
raise click.ClickException('For the geometry to work out, the --twists parameter must be co-prime to --turns, i.e. the two must have 1 as their greatest common divisor. You can print valid values for --twists by running this command with --show-twists [turns number].') raise click.ClickException(f'For the geometry to work out, the --twists parameter must be co-prime to --turns, i.e. the two must have 1 as their greatest common divisor. You can print valid values for --twists by running this command with --show-twists [turns number]. Right now, both are divisible by {gcd(twists, turns)}.')
if (stagger_inner_vias or stagger_outer_vias) and twists%2 != 0:
raise click.ClickException('For --stagger-inner/outer-vias to work, --twists must be even and --turns must be odd.')
if (mesh_out or mesh_split_out or mesh_mutual_out) and not pcb: if (mesh_out or mesh_split_out or mesh_mutual_out) and not pcb:
raise click.ClickException('--pcb is required when --mesh-out, --mesh-mutual-out or --mesh-split-out are used.') raise click.ClickException('--pcb is required when --mesh-out, --mesh-mutual-out or --mesh-split-out are used.')
@ -708,9 +713,9 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
print(f' {degrees(outer_via_angle):.1f} deg / via', file=sys.stderr) print(f' {degrees(outer_via_angle):.1f} deg / via', file=sys.stderr)
# Check if the vias of the inner ring are so large that they would overlap # Check if the vias of the inner ring are so large that they would overlap
if inner_via_angle*twists > 2*pi: if inner_via_angle*twists > (4*pi if stagger_inner_vias else 2*pi):
min_dia = 2*((via_diameter + clearance) / (2*sin(pi / twists)) + via_offset) min_dia = 2*((via_diameter + clearance) / (2*sin(pi / twists * (2 if stagger_inner_vias else 1))) + via_offset)
raise click.ClickException(f'Error: Overlapping vias in inner via ring. Calculated minimum inner diameter is {min_dia:.2f} mm.') warnings.warn(f'Overlapping vias in inner via ring. Calculated minimum inner diameter is {min_dia:.2f} mm.')
pitch = clearance + trace_width pitch = clearance + trace_width
t, _, b = layer_pair.partition(',') t, _, b = layer_pair.partition(',')
@ -862,7 +867,7 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
x = inverse[i]*floor(2*sweeping_angle / (2*pi)) * 2*pi x = inverse[i]*floor(2*sweeping_angle / (2*pi)) * 2*pi
(x0, y0), (xn, yn), clen = do_spiral(0, outer_radius, inner_radius, start_angle, fold_angle, (x + start_angle)/total_angle, (x + fold_angle)/total_angle, circle_segments) (x0, y0), (xn, yn), clen = do_spiral(0, outer_radius, inner_radius, start_angle, fold_angle, (x + start_angle)/total_angle, (x + fold_angle)/total_angle, circle_segments)
if two_layer: if two_layer:
do_spiral(1, inner_radius, outer_radius, fold_angle, end_angle, (x + fold_angle)/total_angle, (x + end_angle)/total_angle) do_spiral(1, inner_radius, outer_radius, fold_angle, end_angle, (x + fold_angle)/total_angle, (x + end_angle)/total_angle, circle_segments)
else: else:
dr = outer_radius - inner_radius dr = outer_radius - inner_radius
xq = xn + cos(fold_angle) * dr xq = xn + cos(fold_angle) * dr
@ -875,7 +880,11 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
path.move(xn, yn) path.move(xn, yn)
path.line(xq, yq) path.line(xq, yq)
xv, yv = inner_via_ring_radius*cos(fold_angle), inner_via_ring_radius*sin(fold_angle) r = inner_via_ring_radius
if stagger_inner_vias:
if i%2 != 0:
r -= 2*via_offset
xv, yv = r*cos(fold_angle), r*sin(fold_angle)
pads.append(make_via(xv, yv, layer_pair)) pads.append(make_via(xv, yv, layer_pair))
if not isclose(via_offset, 0, abs_tol=1e-6): if not isclose(via_offset, 0, abs_tol=1e-6):
lines.append(make_line(xn, yn, xv, yv, layer_pair[0])) lines.append(make_line(xn, yn, xv, yv, layer_pair[0]))
@ -883,8 +892,12 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_diameter/2, stroke='none', fill='white')) svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_diameter/2, stroke='none', fill='white'))
svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_drill/2, stroke='none', fill='black')) svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_drill/2, stroke='none', fill='black'))
if i > 0 or close_loop: if i > 0:
xv, yv = outer_via_ring_radius*cos(start_angle), outer_via_ring_radius*sin(start_angle) r = outer_via_ring_radius
if stagger_outer_vias:
if i%2 != 0:
r += 2*via_offset
xv, yv = r*cos(start_angle), r*sin(start_angle)
pads.append(make_via(xv, yv, layer_pair)) pads.append(make_via(xv, yv, layer_pair))
if not isclose(via_offset, 0, abs_tol=1e-6): if not isclose(via_offset, 0, abs_tol=1e-6):
lines.append(make_line(x0, y0, xv, yv, layer_pair[0])) lines.append(make_line(x0, y0, xv, yv, layer_pair[0]))
@ -892,7 +905,7 @@ def generate(outfile, turns, outer_diameter, inner_diameter, via_diameter, via_d
svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_diameter/2, stroke='none', fill='white')) svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_diameter/2, stroke='none', fill='white'))
svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_drill/2, stroke='none', fill='black')) svg_vias.append(Tag('circle', cx=xv, cy=yv, r=via_drill/2, stroke='none', fill='black'))
l_total = clen*twists*2 l_total = clen*twists*(2 if two_layer else 1)
print(f'Approximate track length: {l_total:.2f} mm', file=sys.stderr) print(f'Approximate track length: {l_total:.2f} mm', file=sys.stderr)
A = copper_thickness/1e3 * trace_width/1e3 A = copper_thickness/1e3 * trace_width/1e3
rho = 1.68e-8 rho = 1.68e-8

64674
wide_coil_1.kicad_pcb Normal file

File diff suppressed because it is too large Load diff

136
wide_coil_1.kicad_prl Normal file
View file

@ -0,0 +1,136 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40,
41
],
"visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "wide_coil_1.kicad_prl",
"version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": -1
},
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

276
wide_coil_1.kicad_pro Normal file
View file

@ -0,0 +1,276 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "wide_coil_1.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": -1,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "gerber_wide_1",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"legacy_lib_dir": "",
"legacy_lib_list": []
},
"sheets": [],
"text_variables": {}
}

441290
wide_coil_2.kicad_pcb Normal file

File diff suppressed because it is too large Load diff

136
wide_coil_2.kicad_prl Normal file
View file

@ -0,0 +1,136 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40,
41
],
"visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "wide_coil_2.kicad_prl",
"version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": -1
},
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

276
wide_coil_2.kicad_pro Normal file
View file

@ -0,0 +1,276 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "wide_coil_2.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": -1,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "gerber_wide_2",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"legacy_lib_dir": "",
"legacy_lib_list": []
},
"sheets": [],
"text_variables": {}
}

459350
wide_coil_3.kicad_pcb Normal file

File diff suppressed because it is too large Load diff

136
wide_coil_3.kicad_prl Normal file
View file

@ -0,0 +1,136 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40,
41
],
"visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "wide_coil_3.kicad_prl",
"version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": -1
},
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

276
wide_coil_3.kicad_pro Normal file
View file

@ -0,0 +1,276 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "wide_coil_3.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": -1,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "gerber_wide_3",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"legacy_lib_dir": "",
"legacy_lib_list": []
},
"sheets": [],
"text_variables": {}
}

481410
wide_coil_4.kicad_pcb Normal file

File diff suppressed because it is too large Load diff

136
wide_coil_4.kicad_prl Normal file
View file

@ -0,0 +1,136 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40,
41
],
"visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "wide_coil_4.kicad_prl",
"version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": -1
},
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

276
wide_coil_4.kicad_pro Normal file
View file

@ -0,0 +1,276 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "wide_coil_4.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": -1,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "gerber_wide_4",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"legacy_lib_dir": "",
"legacy_lib_list": []
},
"sheets": [],
"text_variables": {}
}

424596
wide_coil_5.kicad_pcb Normal file

File diff suppressed because it is too large Load diff

136
wide_coil_5.kicad_prl Normal file
View file

@ -0,0 +1,136 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40,
41
],
"visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "wide_coil_5.kicad_prl",
"version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": -1
},
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

276
wide_coil_5.kicad_pro Normal file
View file

@ -0,0 +1,276 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "wide_coil_5.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": -1,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "gerber_wide_5",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"legacy_lib_dir": "",
"legacy_lib_list": []
},
"sheets": [],
"text_variables": {}
}