LennartNaeve_code/coil_design/src/coil_helpers.py
Lennart Naeve 2cc6bb1dfc -fixed inductance calculation
-added measured value of wire resistance
-checking simulation vs BoDy's coils
-final coil configuration
2025-06-02 15:44:39 +02:00

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