Merge branch 'main' of https://git.spark-ops.com/LaunchSim/source
This commit is contained in:
commit
de05d99c19
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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,
|
||||||
|
@ -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
130
src/modulosDisparo.py
Normal 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()
|
||||||
|
|
27
src/simulador/modelo_transitorio.net
Normal file
27
src/simulador/modelo_transitorio.net
Normal 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
|
@ -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
|
||||||
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user