little-bee-B1/modeling/trace_femm_itter.m
2021-01-24 18:09:24 -08:00

134 lines
3.5 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%load all the FEMM functions. the folder with all the M files for FEMM should have already been added to path
addpath('c:\\femm42\\mfiles');
openfemm;
function make_round_turn(x, y, radius, material, circuit)
x1 = x - radius;
x2 = x + radius;
y1 = y;
y2 = y;
mi_drawarc(x1, y1, x2, y2, 180, 10);
mi_addarc(x2, y2, x1, y1, 180, 10);
mi_addblocklabel(x,y);
mi_selectlabel(x,y);
%comment out first for automeshing
mi_setblockprop(material, 1, 0, circuit, 0, 0, 1);
%mi_setblockprop(material, 0, 10E-3, circuit, 0, 0, 1);
mi_clearselected;
endfunction
function make_rectangle(x, y, w, h, material, circuit)
x1 = x - w/2;
y1 = y - h/2;
x2 = x + w/2;
y2 = y - h/2;
x3 = x + w/2;
y3 = y + h/2;
x4 = x - w/2;
y4 = y + h/2;
mi_drawpolygon([x1,y1;x2,y2;x3,y3;x4,y4])
mi_addblocklabel(x,y);
mi_selectlabel(x,y);
%comment out first for automeshing
mi_setblockprop(material, 1, 0, circuit, 0, 0, 1);
%mi_setblockprop(material, 0, 10E-3, circuit, 0, 0, 1);
mi_clearselected;
endfunction
% materials
copper_conductivity = 58.0;
%parameters. All dimentions in mm
w_trace = 1; % width trace
h_trace = 0.035; %thickness of 1oz copper
h_pcb = 1.6; % 0.2mm prepreg
freq = 0;
probe_offset = 0.05; % distance from probe tip to wire
%constants
i_wire = 1;
%sensor_offset = 1.6; %offset of from sensor to end of probe tip
sensor_offset = 0.5;
probe_sensitivity_H = 0.8; %volts/gauss
probe_sensitivity_L = 0.2;
probe_max_G = 6.0; % max field strength for sensor saturation
trace_widths = [0.05 : 0.05 : 3]
field_strengths = []
for w_trace = trace_widths
%create new document
% "0 for a magnetics problem, 1 for an electrostatics problem, 2 for a heat flow problem, or 3 for a current flow problem"
newdocument(0);
% Define the problem type. Magnetostatic; Units of mm; Axisymmetric;
% Precision of 10^(-8) for the linear solver; a placeholder of 0 for
% the depth dimension, and an angle constraint of 30 degrees
%(freq,units,type,precision,depth,minangle,(acsolver))
mi_probdef(freq, 'millimeters', 'planar', 1.e-8, 100, 30);
%define materials and circuits
mi_addmaterial('Air', 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0);
mi_addmaterial('Copper', 1, 1, 0, 0, copper_conductivity, 0, 0, 1, 0, 0, 0);
mi_addcircprop('iwire', i_wire, 1);
mi_addcircprop('iwireN', -1*i_wire, 1);
%air
mi_addblocklabel(0, -2);
mi_selectlabel(0,-2);
% (blockname, automesh, meshsize, incircuit, magdir, group, turns)
mi_setblockprop('Air', 1, 0, '<None>', 0, 0, 0);
mi_clearselected
% top trace
make_rectangle(0, h_pcb/2 + h_trace/2, w_trace, h_trace, 'Copper', 'iwire');
% return path
make_rectangle(0, -h_pcb/2- h_trace/2, max(w_trace * 20, 20 * h_pcb), h_trace, 'Copper', 'iwireN');
%boundary condition
mi_makeABC(5, max(w_trace * 20, 50), 0,0, 0);
mi_saveas('trace.fem');
% mesh
smartmesh(1);
mi_createmesh();
%run simulation
mi_analyze();
mi_loadsolution();
%obtain B field
measuredB = abs(mo_getb(0,(h_pcb/2 + probe_offset + sensor_offset))(1));
measuredG = measuredB ./ 1E-4; % convert tesla to gauss
current_sensitivity_H = measuredG * probe_sensitivity_H;
current_sensitivity_L = measuredG * probe_sensitivity_L;
probe_max_current = probe_max_G ./ measuredG;
disp("Field Strength:");
disp(measuredG);
disp("Sensitivity High Gain:");
disp(current_sensitivity_H);
disp("Sensitivity Low Gain:");
disp(current_sensitivity_L);
disp("Max Current:");
disp(probe_max_current);
field_strengths = [field_strengths measuredG]
mi_close();
endfor
export_data = [trace_widths;field_strengths]'; % '
csvwrite("trace_fields.csv", export_data )