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 from PyLTSpice import SimRunner, SpiceEditor, RawRead
import numpy as np import numpy as np
import matplotlib.pyplot as plt
''' '''
Este codigo funciona sobre modelo.net 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: except KeyError as e:
print(f'Error al leer señal del archivo .raw: {e}') print(f'Error al leer señal del archivo .raw: {e}')
return None 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__': 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 Resistencia = 10
Inductancia = 1 Inductancia = 1
Capacitancia = 0.02 Capacitancia = 0.02
@ -147,7 +142,6 @@ if __name__ == '__main__':
tiempoSwitch = 25e-6 tiempoSwitch = 25e-6
tiempoMos = 50e-6 tiempoMos = 50e-6
resultado1 = simular_LTS(Tension, resultado1 = simular_LTS(Tension,
Resistencia, Resistencia,
Inductancia, Inductancia,

View File

@ -1,5 +1,4 @@
import numpy as np import numpy as np
import matplotlib.pyplot as plt
global muVacio global muVacio
global muFeRel global muFeRel
@ -25,6 +24,33 @@ def calcular_diametro_ext(longitudBobina, diametroCuBobina, espirasBobina, diame
return 2 * numeroCapas * diametroCuBobina + diametroInteriorBobina 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): def reluctancia_funcX(longFe, diamFe, longC, diamCint, diamCu, espiras):
''' '''
Esta funcion devuelve un vector que contenga la reluctancia total en 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 anguloDisparo = anguloDisparo * np.pi / 180
acel = fuerzaMagnetica/masa - g*(cteRoz * np.cos(anguloDisparo) + np.sin(anguloDisparo)) acel = fuerzaMagnetica/masa - g*(cteRoz * np.cos(anguloDisparo) + np.sin(anguloDisparo))
return acel 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 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__': if __name__ == '__main__':
from funcionesSimELectrica import * from funcionesSimELectrica import *
from scipy.integrate import cumulative_trapezoid from scipy.integrate import cumulative_trapezoid
import matplotlib.pyplot as plt
tiempoSimulacion = 10e-3 tiempoSimulacion = 10e-3
step = tiempoSimulacion / 1e6 step = tiempoSimulacion / 1e6
@ -133,19 +143,15 @@ if __name__ == '__main__':
longitudVastago = 96e-3 # m longitudVastago = 96e-3 # m
diametroVastago = 3.045e-3 * 2 # m diametroVastago = 3.045e-3 * 2 # m
anguloDisparo = 40
Tension = 30 # V Tension = 30 # V
Capacitancia = 500e-3 # F Capacitancia = 500e-3 # F
masa = calcular_masa(diametroVastago, longitudVastago) masa = calcular_masa(diametroVastago, longitudVastago)
anguloDisparo = 40
resistencia, reluctancia = calcular_bobina(longitudVastago, diametroVastago, longitudBobina,
resistencia = calcular_resistencia(diametroCuBobina, longitudBobina, diametroInteriorBobina, diametroCuBobina, espirasBobina)
diametroInteriorBobina, espirasBobina)
reluctancia = np.mean(reluctancia_funcX(longitudVastago, diametroVastago,
longitudBobina, diametroInteriorBobina,
diametroCuBobina, espirasBobina))
inductancia = espirasBobina**2 / reluctancia inductancia = espirasBobina**2 / reluctancia
@ -168,9 +174,9 @@ if __name__ == '__main__':
plt.figure() plt.figure()
#plt.plot(t, corriente, label='corriente') #plt.plot(t, corriente, label='corriente')
#plt.plot(t, fuerza, label = 'Fuerza') #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(tiempo, velocidad, label = 'velocidad')
#plt.plot(posicion, velocidad, label = 'posicion') plt.plot(posicion, velocidad, label = 'posicion')
plt.legend() plt.legend()
plt.show() 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 R 10
.param C 20m .param C 20m
.param L 1 .param L 1
.param V 30 .param V 300
.param delta tsim-ton_mos .param delta tsim-ton_mos
.backanno .backanno
.end .end