This commit is contained in:
Pedro Romero 2025-05-28 12:55:10 +02:00
commit de05d99c19
8 changed files with 201 additions and 118 deletions

View File

@ -1,74 +0,0 @@
from funcionesSimELectrica import *
from funcionesSimFisica import *
from scipy.integrate import cumulative_trapezoid
import matplotlib.pyplot as plt
import numpy as np
__author__ = 'Oscar Suescun'
lts_path = "C:/Users/osuescuneli/AppData/Local/Programs/ADI/LTspice/LTspice.exe"
'''
Esto sirve para hacer debug del sistema y ver como se comportan
las funciones para la
'''
if __name__ == '__main__':
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 = []
for i in np.arange(numeroModulos):
aceleracion = np.append(aceleracion, calcular_aceleracion(masa, anguloDisparo, fuerza))
if i == 0:aceleracion[aceleracion<0] = 0 # Evitar que la aceleracion sea negativa en la primera vuelta
else:pass
velocidad = cumulative_trapezoid(aceleracion,tiempo,initial=0)
posicion = cumulative_trapezoid(velocidad, tiempo, initial=0)
idx = posicion <= longitudBobina*(i+1)
tiempo = tiempo[idx] # Recorto los vectores
posicion = posicion[idx] # para tener en cuenta
velocidad = velocidad[idx] # que el vastago recorre
aceleracion = aceleracion[idx] # la longitud de la bobina

View File

@ -1,6 +1,5 @@
from PyLTSpice import SimRunner, SpiceEditor, RawRead
import numpy as np
import matplotlib.pyplot as plt
'''
Este codigo funciona sobre modelo.net
@ -122,23 +121,19 @@ def simular_LTS(tensionCap, Rtotal, Lbobina, Ctotal, lts_path, tSim = 100e-3, to
except KeyError as e:
print(f'Error al leer señal del archivo .raw: {e}')
return None
def dibujar(resultado):
plt.figure()
plt.plot(resultado['tiempo']*1e3, resultado['vCap'], label='Tension Cap [V]')
plt.plot(resultado['tiempo']*1e3, resultado['vBob'], label='Tension Bobina [V]')
plt.plot(resultado['tiempo']*1e3, resultado['iBob'], label='Corriente Bobina [A]')
plt.xlabel("Tiempo [ms]")
plt.grid()
plt.legend()
plt.show()
if __name__ == '__main__':
lts_path = "D:\\Appdata\\LTSpice\\LTSPice.exe"
<<<<<<< HEAD
import matplotlib.pyplot as plt
Tension = 30
lts_path = "C:/Users/osuescuneli/AppData/Local/Programs/ADI/LTspice/LTspice.exe"
=======
lts_path = "D:\\Appdata\\LTSpice\\LTSPice.exe"
>>>>>>> a2d05aa067ff48217660c219d56c5865db470197
Tension = 300
Resistencia = 10
Inductancia = 1
Capacitancia = 0.02
@ -147,7 +142,6 @@ if __name__ == '__main__':
tiempoSwitch = 25e-6
tiempoMos = 50e-6
resultado1 = simular_LTS(Tension,
Resistencia,
Inductancia,

View File

@ -1,5 +1,4 @@
import numpy as np
import matplotlib.pyplot as plt
global muVacio
global muFeRel
@ -25,6 +24,33 @@ def calcular_diametro_ext(longitudBobina, diametroCuBobina, espirasBobina, diame
return 2 * numeroCapas * diametroCuBobina + diametroInteriorBobina
def calcular_bobina(longitudVastago, diametroVastago, longitudBobina, diametroInteriorBobina, diametroCuBobina, espirasBobina):
resistencia = calcular_resistencia(diametroCuBobina, longitudBobina,
diametroInteriorBobina, espirasBobina)
reluctancia = np.mean(reluctancia_funcX(longitudVastago, diametroVastago,
longitudBobina, diametroInteriorBobina,
diametroCuBobina, espirasBobina))
return resistencia, reluctancia
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 reluctancia_funcX(longFe, diamFe, longC, diamCint, diamCu, espiras):
'''
Esta funcion devuelve un vector que contenga la reluctancia total en
@ -95,23 +121,6 @@ def calcular_aceleracion(masa, anguloDisparo, fuerzaMagnetica):
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
@ -119,6 +128,7 @@ def calcular_masa(diamFe, longFe): return np.pi * diamFe**2 / 4 * longFe * densi
if __name__ == '__main__':
from funcionesSimELectrica import *
from scipy.integrate import cumulative_trapezoid
import matplotlib.pyplot as plt
tiempoSimulacion = 10e-3
step = tiempoSimulacion / 1e6
@ -133,19 +143,15 @@ if __name__ == '__main__':
longitudVastago = 96e-3 # m
diametroVastago = 3.045e-3 * 2 # m
anguloDisparo = 40
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))
resistencia, reluctancia = calcular_bobina(longitudVastago, diametroVastago, longitudBobina,
diametroInteriorBobina, diametroCuBobina, espirasBobina)
inductancia = espirasBobina**2 / reluctancia
@ -168,9 +174,9 @@ if __name__ == '__main__':
plt.figure()
#plt.plot(t, corriente, label='corriente')
#plt.plot(t, fuerza, label = 'Fuerza')
plt.plot(tiempo, aceleracion, label='aceleracion')
#plt.plot(tiempo, aceleracion, label='aceleracion')
# plt.plot(tiempo, velocidad, label = 'velocidad')
#plt.plot(posicion, velocidad, label = 'posicion')
plt.plot(posicion, velocidad, label = 'posicion')
plt.legend()
plt.show()

130
src/modulosDisparo.py Normal file
View File

@ -0,0 +1,130 @@
from funcionesSimELectrica import *
from funcionesSimFisica import *
from scipy.integrate import cumulative_trapezoid
__author__ = 'Oscar Suescun'
def modulo_inicial(tension, capacitancia, inductancia, resistencia,
espiras, tiempo, masa, anguloDisparo,
longitudBobina, diametroVastago ):
reluctancia = espiras**2/inductancia
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]
resultado = {
'tiempo' : tiempo,
'posicion' : posicion,
'velocidad' : velocidad,
'aceleracion' : aceleracion,
'fuerza' : fuerza,
'corriente' : corriente
}
return resultado
def modulo(resultado, tension, capacidad, inductancia, resistencia, espiras,
tiempo, masa, anguloDisparo, longitudBobina, diametroVastago):
reluctancia = espiras**2/inductancia
corriente = solver_manual(tension, resistencia, inductancia, capacidad, tiempo)
fuerza = fuerza_magnetica(corriente, reluctancia, espiras, diametroVastago)
aceleracion = calcular_aceleracion(masa, anguloDisparo, fuerza)
tiempo = np.append(resultado['tiempo'], tiempo + resultado['tiempo'][-1])
aceleracion = np.append(resultado['aceleracion'], aceleracion)
velocidad = cumulative_trapezoid(aceleracion, tiempo, initial=0)
posicion = cumulative_trapezoid(velocidad, tiempo, initial=0)
idx = posicion <= longitudBobina + resultado['posicion'][-1]
tiempo = tiempo[idx]
posicion = posicion[idx]
velocidad = velocidad[idx]
aceleracion = aceleracion[idx]
resultado = {
'tiempo' : tiempo,
'posicion' : posicion,
'velocidad' : velocidad,
'aceleracion' : aceleracion,
'fuerza' : fuerza,
'corriente' : corriente
}
return resultado
if __name__=='__main__':
import matplotlib.pyplot as plt
import os
tiempoSimulacion = 10e-3
step = tiempoSimulacion / 1e6
numeroModulos = 3
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
anguloDisparo = 40
Tension = 30 # V
Capacitancia = 10e-3 # F
masa = calcular_masa(diametroVastago, longitudVastago)
resistencia, reluctancia = calcular_bobina(longitudVastago, diametroVastago, longitudBobina,
diametroInteriorBobina, diametroCuBobina, espirasBobina)
inductancia = espirasBobina**2 / reluctancia
tiempo = np.arange(0, tiempoSimulacion, step)
resultado = modulo_inicial(Tension, Capacitancia, inductancia,
resistencia, espirasBobina, tiempo, masa,
anguloDisparo, longitudBobina, diametroVastago)
for i in range(1,numeroModulos):
print(resultado['posicion'][-1])
print(f'{i+1}/{numeroModulos}')
resultado = modulo(resultado,Tension, Capacitancia, inductancia,
resistencia, espirasBobina, tiempo, masa,
anguloDisparo, longitudBobina, diametroVastago )
plt.figure()
#plt.plot(t, fuerza, label = 'Fuerza')
#plt.plot(resultado['tiempo'], resultado['aceleracion'], label='aceleracion')
#plt.plot(resultado['tiempo'], resultado['velocidad'], label = 'velocidad')
plt.plot(resultado['posicion'], resultado['velocidad'])
plt.xlabel('Posicion [m]')
plt.ylabel('Velocidad [m/s]')
plt.show()

View File

@ -0,0 +1,27 @@
* C:\Users\osuescuneli\Desktop\practicas\Practia_Lanzadera\source\src\simulador\modelo_transitorio.asc
* Generated by LTspice 24.1.5 for Windows.
V1 N001 0 {V}
S1 N001 condensador cont1 0 SW
V2 cont1 0 PULSE(0 10 0 1n 1n {toff_sw} {tsim})
C1 condensador 0 {C}
M1 V2 cont2 0 0 IRFZ44N
V3 cont2 0 PULSE(0 15 {ton_mos} 1n 1n {delta} {tsim})
L1 V1 V2 {L}
R1 condensador V1 {R}
V4 N002 N003 30
R2 N002 N003 20
.model NMOS NMOS
.model PMOS PMOS
.lib C:\Users\osuescuneli\AppData\Local\LTspice\lib\cmp\standard.mos
.tran 0 {tsim} 0
.Model SW SW(Ron=1m Roff=100Meg Vt = 5)
.param tsim 1.6m
.param toff_sw 1m
.param ton_mos 1.5m
.param R 10
.param C 0.02
.param L 1
.param V 30
.param delta tsim-ton_mos
.backanno
.end

View File

@ -26,7 +26,7 @@ R2 N002 N003 20
.param R 10
.param C 20m
.param L 1
.param V 30
.param V 300
.param delta tsim-ton_mos
.backanno
.end