source/src/funcionesSimFisica.py
Oscar Suescun Elizalde 04076e9292 as
2025-05-27 10:19:17 +02:00

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()