179 lines
5.2 KiB
Python
179 lines
5.2 KiB
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
global muVacio
|
|
global muFeRel
|
|
global kDisp
|
|
global cteRoz
|
|
global g
|
|
global resCu
|
|
|
|
densidadHierro = 7800 # kg/m3
|
|
muVacio = 4*np.pi*1e-7
|
|
muFeRel = 5000
|
|
resCu = 1.7e-8 # ohm/m
|
|
kDisp = 2 # cte de dispersion
|
|
cteRoz = 0.1
|
|
g = 9.8
|
|
|
|
__author__ = 'Oscar Suescun'
|
|
|
|
def calcular_diametro_ext(longitudBobina, diametroCuBobina, espirasBobina, diametroInteriorBobina):
|
|
|
|
espirasCapa = int(longitudBobina/diametroCuBobina)
|
|
numeroCapas = int(espirasBobina/espirasCapa + .5)
|
|
|
|
return 2 * numeroCapas * diametroCuBobina + diametroInteriorBobina
|
|
|
|
def reluctancia_funcX(longFe, diamFe, longC, diamCint, diamCu, espiras):
|
|
'''
|
|
Esta funcion devuelve un vector que contenga la reluctancia total en
|
|
funcion de la distancia que recorre el vastago dentro de la bobina.
|
|
|
|
Para esto se utiliza un vector de 0 -> longC con un estep de longC/100
|
|
|
|
Entrada:
|
|
- longFe --> longitud del vastago
|
|
- diamFe --> diametro del vastago
|
|
- longC --> longitud de la bobina
|
|
- diamCint --> diametro interior de la bobina
|
|
- diamCu --> diametro del hilo de cobre
|
|
- espiras --> numero de espiras en la bobina
|
|
|
|
Salida:
|
|
- relTotal --> devuelve un vector con la reluctancia total en
|
|
funcion de la distancia recorrida en la bobina.
|
|
|
|
'''
|
|
|
|
diamCext = calcular_diametro_ext(longC, diamCu, espiras, diamCint)
|
|
|
|
seccionFe = (np.pi * diamFe**2) / 4
|
|
seccionSc = (np.pi * diamCext**2) / 4
|
|
seccionDisp = (np.pi * (kDisp * diamCint)**2) / 4
|
|
|
|
x = np.arange(0,longC + longC/100, longC/100)
|
|
longFe = np.full(len(x), longFe)
|
|
longC = np.full(len(x), longC)
|
|
|
|
|
|
relFe = longFe / (muVacio * muFeRel * seccionFe)
|
|
relDisp = longC / (muVacio * seccionDisp)
|
|
relAire = (longC - x) / (muVacio * seccionSc)
|
|
relFlujo = (longC + longFe - x) / (muVacio * seccionDisp)
|
|
|
|
relTotal = relFe + relDisp + relAire + relFlujo
|
|
|
|
return relTotal
|
|
|
|
|
|
def induccion(corriente, reluctancia, espiras, diamFe):
|
|
flujo = espiras * corriente / reluctancia
|
|
|
|
secFe = np.pi * diamFe**2 / 4
|
|
|
|
return flujo / secFe
|
|
|
|
def fuerza_magnetica(corriente, reluctancia, espiras, diamFe):
|
|
'''
|
|
Solo se calcula la fuerza magetica
|
|
|
|
'''
|
|
|
|
b = induccion(corriente, reluctancia, espiras, diamFe)
|
|
|
|
secFe = np.pi * diamFe**2 / 4
|
|
|
|
return np.sign(corriente) * 0.5 * b**2 * secFe / muVacio
|
|
|
|
def calcular_aceleracion(masa, anguloDisparo, fuerzaMagnetica):
|
|
'''
|
|
Retocar esto, tiene en cuenta el principio solo pero hay cosas raras
|
|
|
|
'''
|
|
|
|
anguloDisparo = anguloDisparo * np.pi / 180
|
|
acel = fuerzaMagnetica/masa - g*(cteRoz * np.cos(anguloDisparo) + np.sin(anguloDisparo))
|
|
return acel
|
|
|
|
|
|
def calcular_resistencia(diamCu, longC, diamC, espiras):
|
|
|
|
espirasCapa = int(longC/diamCu)
|
|
nCapasEnteras = int(espiras/espirasCapa) # solo capas completametne llenas
|
|
espirasUltimaCapa = espiras - espirasCapa * nCapasEnteras # las espiras de la ultima capa
|
|
|
|
longitud = 0
|
|
|
|
for i in range(nCapasEnteras): longitud += espirasCapa*np.pi*(diamC + (1+i)*diamCu) # Calculo longitud de total de las capas llenas
|
|
|
|
longitud += espirasUltimaCapa*np.pi*(diamC + (1 + nCapasEnteras)*diamCu)
|
|
|
|
seccionCu = np.pi * diamCu**2 / 4
|
|
|
|
return resCu * longitud / seccionCu
|
|
|
|
def calcular_masa(diamFe, longFe): return np.pi * diamFe**2 / 4 * longFe * densidadHierro
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
from funcionesSimELectrica import *
|
|
from scipy.integrate import cumulative_trapezoid
|
|
|
|
tiempoSimulacion = 10e-3
|
|
step = tiempoSimulacion / 1e6
|
|
|
|
numeroModulos = 2
|
|
|
|
longitudBobina = 53.21e-3 # m
|
|
diametroInteriorBobina = 6.035e-3 * 2 # m
|
|
espirasBobina = 500
|
|
diametroCuBobina = 0.8e-3 # m
|
|
|
|
longitudVastago = 96e-3 # m
|
|
diametroVastago = 3.045e-3 * 2 # m
|
|
|
|
Tension = 30 # V
|
|
Capacitancia = 500e-3 # F
|
|
|
|
masa = calcular_masa(diametroVastago, longitudVastago)
|
|
anguloDisparo = 40
|
|
|
|
|
|
resistencia = calcular_resistencia(diametroCuBobina, longitudBobina,
|
|
diametroInteriorBobina, espirasBobina)
|
|
|
|
reluctancia = np.mean(reluctancia_funcX(longitudVastago, diametroVastago,
|
|
longitudBobina, diametroInteriorBobina,
|
|
diametroCuBobina, espirasBobina))
|
|
|
|
inductancia = espirasBobina**2 / reluctancia
|
|
|
|
tiempo = np.arange(0,tiempoSimulacion, step)
|
|
|
|
corriente = solver_manual(Tension, resistencia, inductancia, Capacitancia, tiempo)
|
|
fuerza = fuerza_magnetica(corriente, reluctancia, espirasBobina, diametroVastago)
|
|
aceleracion = calcular_aceleracion(masa, anguloDisparo, fuerza)
|
|
aceleracion[aceleracion<0]=0
|
|
velocidad = cumulative_trapezoid(aceleracion, tiempo, initial=0)
|
|
posicion = cumulative_trapezoid(velocidad, tiempo, initial=0)
|
|
|
|
idx = posicion <= longitudBobina
|
|
|
|
tiempo = tiempo[idx]
|
|
posicion = posicion[idx]
|
|
velocidad = velocidad[idx]
|
|
aceleracion = aceleracion[idx]
|
|
|
|
plt.figure()
|
|
#plt.plot(t, corriente, label='corriente')
|
|
#plt.plot(t, fuerza, label = 'Fuerza')
|
|
plt.plot(tiempo, aceleracion, label='aceleracion')
|
|
# plt.plot(tiempo, velocidad, label = 'velocidad')
|
|
#plt.plot(posicion, velocidad, label = 'posicion')
|
|
plt.legend()
|
|
plt.show()
|
|
|
|
|