-added measured value of wire resistance -checking simulation vs BoDy's coils -final coil configuration
224 lines
8.0 KiB
Python
224 lines
8.0 KiB
Python
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from src import coil_class as BC
|
|
|
|
import magpylib as magpy
|
|
import matplotlib.ticker as ticker
|
|
|
|
|
|
def circular_HH(HH, radius, distance, layers, windings,
|
|
I = 1, #A
|
|
wire_height = .5 *1e-3,
|
|
wire_width = .5 *1e-3,
|
|
insulation_thickness = (0.568-0.5)/2 *1e-3,
|
|
print_info = True):
|
|
"""returns magpylib system for a circular HH-coil (parameters in m) and prints info on it if requested"""
|
|
|
|
#### give out coil parameter s####
|
|
HH_Coil = BC.BCoil(HH = HH, distance = distance*1e3, radius = radius*1e3, layers = layers, windings = windings,
|
|
wire_height = wire_height*1e3, wire_width = wire_width*1e3, insulation_thickness = insulation_thickness*1e3,
|
|
is_round = True, winding_scheme= 2)
|
|
|
|
if print_info:
|
|
print("Single coil parameters:")
|
|
|
|
HH_Coil.print_info()
|
|
print(f"N = {HH_Coil.get_N()}")
|
|
print(f"wire length = {HH_Coil.get_wire_length()} m")
|
|
|
|
HH_Coil.plot_raster()
|
|
|
|
#### total inductance from Lenny's code ####
|
|
def Self_Inductance_Abbot(alpha, beta, gamma, N):
|
|
"""
|
|
Formula for self inductance of circular coil by J.J.Abbott
|
|
"""
|
|
L = (7.9e-6 * alpha**2 * N**2) / (3*alpha + 9*beta + 10*gamma)
|
|
return L
|
|
|
|
alpha = 2*radius
|
|
beta = HH_Coil.get_coil_width()
|
|
gamma = HH_Coil.get_coil_height()
|
|
N = HH_Coil.get_N()
|
|
dist = distance
|
|
|
|
L_pair = Self_Inductance_Abbot(alpha, dist + beta, gamma, N) +Self_Inductance_Abbot(alpha, dist - beta, gamma, N) - 2 * Self_Inductance_Abbot(alpha, dist, gamma, N) + 2 * Self_Inductance_Abbot(alpha, beta, gamma, N)
|
|
R_pair = 2*HH_Coil.get_wire_length() * 0.08708
|
|
|
|
print("Pair in series:")
|
|
print(f"wire length = {2*HH_Coil.get_wire_length()} m")
|
|
print(f"R = {2*HH_Coil.resistance(25)} Ohm")
|
|
print(f"L = {L_pair*1e3} mH")
|
|
print(f"tau = {L_pair/R_pair*1e3} ms")
|
|
|
|
print(f"\nat {I} A:")
|
|
print(f"V = {R_pair*I} V")
|
|
print(f"P = {R_pair*I**2} W")
|
|
|
|
#### calculate field properties ####
|
|
|
|
#define coils
|
|
winding_offsets = HH_Coil.full_raster(raster_value=1)[:,0]
|
|
|
|
coil1 = magpy.Collection()
|
|
for coord in winding_offsets:
|
|
winding = magpy.current.Circle(
|
|
current=1,
|
|
diameter=2*coord[1],
|
|
position=(0,0,coord[0]),
|
|
)
|
|
coil1.add(winding)
|
|
|
|
coil2 = magpy.Collection()
|
|
for coord in winding_offsets:
|
|
winding = magpy.current.Circle(
|
|
current=HH*1,
|
|
diameter=2*coord[1],
|
|
position=(0,0,-coord[0]),
|
|
)
|
|
coil2.add(winding)
|
|
|
|
#move to test if slight changes in positioning have a large effect
|
|
#coil1.move([0.5e-3,0,0])
|
|
|
|
# Combine them into a collection (like multiple windings)
|
|
system = magpy.Collection(coil1, coil2)
|
|
|
|
return system, 2*HH_Coil.get_wire_length()
|
|
|
|
|
|
def rect_current(current, a,b,position, corner_radius):
|
|
"""returns rectangular mapy current with given dimensions (in m)"""
|
|
#first quadrant
|
|
angles = np.linspace(0,np.pi/2,50)
|
|
radii = np.zeros((len(angles),3))
|
|
radii[:,0] = np.cos(angles)
|
|
radii[:,1] = np.sin(angles)
|
|
radii *= corner_radius
|
|
vertices = np.array([a/2-corner_radius, b/2-corner_radius, 0]) + radii
|
|
|
|
#second quadrant
|
|
angles = np.linspace(np.pi/2,np.pi,50)
|
|
radii = np.zeros((len(angles),3))
|
|
radii[:,0] = np.cos(angles)
|
|
radii[:,1] = np.sin(angles)
|
|
radii *= corner_radius
|
|
vertices = np.append(vertices,np.array([-(a/2-corner_radius), b/2-corner_radius, 0]) + radii, axis=0)
|
|
|
|
#third quadrant
|
|
angles = np.linspace(np.pi,1.5*np.pi,50)
|
|
radii = np.zeros((len(angles),3))
|
|
radii[:,0] = np.cos(angles)
|
|
radii[:,1] = np.sin(angles)
|
|
radii *= corner_radius
|
|
vertices = np.append(vertices,np.array([-(a/2-corner_radius), -(b/2-corner_radius), 0]) + radii, axis=0)
|
|
|
|
#fourth quadrant
|
|
angles = np.linspace(1.5*np.pi, 2*np.pi,50)
|
|
radii = np.zeros((len(angles),3))
|
|
radii[:,0] = np.cos(angles)
|
|
radii[:,1] = np.sin(angles)
|
|
radii *= corner_radius
|
|
vertices = np.append(vertices,np.array([a/2-corner_radius, -(b/2-corner_radius), 0]) + radii, axis=0)
|
|
|
|
#close loop
|
|
vertices = np.append(vertices, [vertices[0]], axis=0)
|
|
|
|
# Create a rectangular current coil
|
|
coil1 = magpy.current.Polyline(position=position, vertices=vertices, current=current)
|
|
return coil1
|
|
|
|
|
|
def rectangular_HH(HH, a, b, distance, corner_radius, layers, windings,
|
|
I = 1, #A
|
|
wire_height = .5 *1e-3,
|
|
wire_width = .5 *1e-3,
|
|
insulation_thickness = (0.568-0.5)/2 *1e-3,
|
|
print_info = True):
|
|
"""returns magpylib system for a rectangular HH-coil (parameters in m) and prints info on it if requested"""
|
|
|
|
#### give out coil parameter s####
|
|
HH_Coil = BC.BCoil(HH = HH, distance = 0, radius = 0, layers = layers, windings = windings,
|
|
wire_height = wire_height*1e3, wire_width = wire_width*1e3, insulation_thickness = insulation_thickness*1e3,
|
|
is_round = True, winding_scheme= 2)
|
|
|
|
if print_info:
|
|
N = HH_Coil.get_N()
|
|
print("Single coil parameters: \n")
|
|
#HH_Coil.print_info()
|
|
print(f"coil width = {HH_Coil.get_coil_width()*1e3} mm")
|
|
print(f"coil height = {HH_Coil.get_coil_height()*1e3} mm")
|
|
print(f"N = {HH_Coil.get_N()}")
|
|
|
|
wire_length = N*(2*a - 4*corner_radius + 2*b - 4*corner_radius + 2*np.pi*corner_radius)
|
|
print(f"wire length = {wire_length} m")
|
|
|
|
HH_Coil.plot_raster()
|
|
|
|
|
|
#### total inductance from Lenny's code ####
|
|
#convert to centimeters
|
|
a *= 100
|
|
b *= 100
|
|
distance *= 100
|
|
p1 = (a + np.sqrt(a ** 2 + distance ** 2)) * np.sqrt(b ** 2 + distance ** 2) / ((a + np.sqrt(a ** 2 + b ** 2 + distance ** 2)) * distance)
|
|
p2 = (b + np.sqrt(b ** 2 + distance ** 2)) * np.sqrt(a ** 2 + distance ** 2) / ((b + np.sqrt(a ** 2 + b ** 2 + distance ** 2)) * distance)
|
|
p3 = np.sqrt(a ** 2 + b ** 2 + distance ** 2) - np.sqrt(a ** 2 + distance ** 2) - np.sqrt(b ** 2 + distance ** 2) + distance
|
|
M = 4 * (a * np.log(p1) + b * np.log(p2)) + 8 * p3
|
|
M *= N**2 * 1e-9 #Conversion to SI and accounting for N wires
|
|
|
|
r = (wire_width/2 + insulation_thickness) * 100
|
|
diag = np.sqrt(a**2 + b**2)
|
|
L_self = 4 * ( (a+b) * np.log(2*a*b / r) - a * np.log(a+diag) - b * np.log(b+diag) - 7/4 * (a+b) + 2 * (diag + r) )
|
|
L_self *= N**2 * 1e-9 #Conversion to SI and accounting for N wires
|
|
|
|
L_pair = 2 * (L_self+M)
|
|
|
|
R_pair = 2*wire_length * 0.08708
|
|
|
|
print("Pair in series:")
|
|
print(f"wire length = {2*wire_length} m")
|
|
print(f"R = {R_pair} Ohm")
|
|
print(f"L = {L_pair*1e3} mH")
|
|
print(f"tau = {L_pair/R_pair *1e3} ms")
|
|
|
|
print(f"\nat {I} A:")
|
|
print(f"V = {R_pair*I} V")
|
|
print(f"P = {R_pair*I**2} W")
|
|
|
|
#### calculate field properties ####
|
|
#convert back to meters
|
|
a /= 100
|
|
b /= 100
|
|
distance /= 100
|
|
|
|
#define coils
|
|
winding_offsets = HH_Coil.full_raster(raster_value=1)[:,0]
|
|
|
|
coil1 = magpy.Collection()
|
|
for coord in winding_offsets:
|
|
winding = rect_current(
|
|
current=1,
|
|
a=a+coord[1], b=b+coord[1],
|
|
position=[0,0,distance/2+coord[0]],
|
|
corner_radius=corner_radius+coord[1]/2
|
|
)
|
|
coil1.add(winding)
|
|
|
|
coil2 = magpy.Collection()
|
|
for coord in winding_offsets:
|
|
winding = rect_current(
|
|
current=HH*1,
|
|
a=a+coord[1], b=b+coord[1],
|
|
position=[0,0,-(distance/2+coord[0])],
|
|
corner_radius=corner_radius+coord[1]/2
|
|
)
|
|
coil2.add(winding)
|
|
|
|
#move to test if slight changes in positioning have a large effect
|
|
#coil1.move([0.5e-3,0,0])
|
|
|
|
# Combine them into a collection (like multiple windings)
|
|
system = magpy.Collection(coil1, coil2)
|
|
|
|
return system, 2*wire_length |