GIK Linear Stepper Motor Analysis

In [1]:
import numpy as np
from scipy import integrate 
from matplotlib import pyplot as plt
from scipy.optimize import fsolve
import math

# Magic function to make matplotlib inline; other style specs must come AFTER
# %matplotlib inline
%matplotlib notebook

%config InlineBackend.figure_formats = {'png', 'retina'}
# %config InlineBackend.figure_formats = {'svg',}
plt.ioff()    # this stops the graphs from overwriting each other

font = {'family' : 'Bitstream Vera Sans',
        'weight' : 'normal',
        'size'   : 14}

plt.rc('font', **font)

Lorentz Force

$$ F_L = k L N \ \vec{i} \times \vec{B} $$
In [13]:
def F_L(L,N,i,B):
    k = 1.0
    return k*L*N*i*B

Magnetic Field

In [14]:
# import temperature data
data = np.loadtxt("mfBy_1.dat")
mfBy = data[:,1]
x = data[:,0]

plt.close('all')
fig, ax1 = plt.subplots()
ax1.plot(x*1e3,mfBy)
ax1.set_xlabel('X Displacement (mm)')
ax1.set_ylabel('Magnetic Field y-component (T)')

# fig.set_size_inches(16, 12,forward=True)
plt.show()

Thermodynamic Limits

In [15]:
# import temperature data
data = np.loadtxt("avgTemp_1.dat")
deltaT = data[:,1]-293.15
power = data[:,0]

plt.close('all')
fig, ax1 = plt.subplots()
ax1.plot(power/3e-3,deltaT)
ax1.set_xlabel('Input Power per Length (W/m)')
ax1.set_ylabel('Temperature Increase (degC)')

# fig.set_size_inches(16, 12,forward=True)
plt.show()

Coil Geometry

In [16]:
coil_width = 1.6e-3 #m
coil_depth = 1e-3 #m
coil_length = 18e-3 #m (avg. circumference)
wire_metal_diam = 80e-6 #m #40AWG
overall_wire_diam = 90e-6 #m
resistivity = 1.7e-8 #ohm*m

num_turns = np.round(coil_width/overall_wire_diam * coil_depth/overall_wire_diam) #m^2
a_cs_coil = (wire_metal_diam/2.)**2*np.pi*num_turns
a_cs_wire = (wire_metal_diam/2.)**2*np.pi

print("Num Turns = %d" %num_turns)
total_length = coil_length
print("Total Length = %f mm" %(total_length*1e3))
resistance = total_length*num_turns*resistivity/a_cs_wire
print("Resistance = %f ohm" %resistance)
Num Turns = 198
Total Length = 18.000000 mm
Resistance = 12.053600 ohm

Current, Power, and Force

In [17]:
p_per_l = 6 #W/m #this corresponds to roughly a +75degC increase
power = p_per_l * total_length
current = np.sqrt(power/resistance)
print("Current = %f A" %current)
print("Power = %f mW" %(power*1e3))
# dT = deltaT(power)
# print("Temp Increase = %f degC" %dT)
print("Flux Density = %f T" %(0.2))
# maxF = F_L(3*3e-3,num_turns,current,0.2)
maxF = F_L(total_length,num_turns,current,0.2)
print("Force = %f mN" %(maxF*1e3))
Current = 0.094657 A
Power = 108.000000 mW
Flux Density = 0.200000 T
Force = 67.471628 mN
In [20]:
data = np.loadtxt("mfBy_1.dat")
mfBy = data[:,1]
x = data[:,0]

F = F_L(total_length,num_turns,current,mfBy)

plt.close('all')
fig, ax1 = plt.subplots()
phase_a, = ax1.plot(x*1e3,F,'b',label='Phase A')
ax1.plot(-x*1e3,F,'b')
phase_b, = ax1.plot((x+1.905e-3)*1e3,F,'g',label='Phase B')
ax1.plot(-(x-1.905e-3)*1e3,F,'g')
ax1.set_xlabel('X-Displacement (mm)')
ax1.set_ylabel('Transverse Force (N)')
plt.legend(handles=[phase_a, phase_b])
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
           ncol=2, mode="expand", borderaxespad=0.)

plt.show()

Comparison to Weight of Part

In [19]:
#conservatively, a part has a mass of 0.029g (solid steel)
part_mass = 0.029*1e-3 #kg
weight = part_mass*9.81 #N

force_per_weight = maxF/weight
print("Force/Part_Weight = %d (# of parts that 1 set of coils can move)" \
      %(force_per_weight))
print("")

parts_per_lmflexure = 130
lmflexures_per_stage = 2*4
parts_per_stage = parts_per_lmflexure * lmflexures_per_stage
print("Num moving parts in a stage = %d \n\
(conservatively, including parts that only translate by very small amounts)"\
      %(parts_per_stage))
print("")
num_coil_pairs = parts_per_stage/force_per_weight
print("Coil pairs necessary = %f (in 1g environements)" %(num_coil_pairs))
Force/Part_Weight = 237 (# of parts that 1 set of coils can move)

Num moving parts in a stage = 1040 
(conservatively, including parts that only translate by very small amounts)

Coil pairs necessary = 4.385097 (in 1g environements)