Puedo barrer la frecuencia en el tiempo usando modular, pero no pude encontrar ningún ejemplo sobre la creación de un ciclo de trabajo variable o un ciclo de trabajo que se barre de cero a 100% a una frecuencia dada f en un intervalo de tiempo.
¿Hay alguna forma/solución alternativa para barrer el ciclo de trabajo a lo largo del tiempo en LTspice?
Editar:
Tengo el siguiente circuito temporizador que puede hacer eso. Pero eso no era lo que buscaba, ya que este tipo de solución ralentiza mucho la simulación. Me preguntaba si hay una manera rápida de hacerlo con una sola función especial o comando SPICE.
Haga clic con el botón izquierdo en el diagrama a continuación para ampliar y poder ver la variación del ciclo de trabajo:
No estoy muy seguro de si esto es lo que realmente quieres, pero intentémoslo de todos modos. Primero creamos una rampa de diente de sierra con una cierta frecuencia usando nuestra propia función de módulo definida con el tiempo (trazo verde):
.function mod(x,y) { (x/y)-int(x/y) }
Luego usamos el tiempo real y la función if como punto de corte para crear una onda cuadrada con una fuente de voltaje arbitraria:
V=if( (mod(time*10,1)) > time, 1, 0 )
Esto debería darle un buen punto de partida para jugar y adaptarse a sus necesidades.
La mejor manera de hacerlo, tanto en términos de simulación como de manera eficiente, es con dispositivos A:
Esto le permite no solo variar el control y la portadora por separado, como desee, sino que también tiene acceso a vt
(umbral) e vh
(histéresis) para el comparador, tiene ayudas temporales como Rout/Cout
, o tau
, o trise/tfall
(elija una opción de la tres), que también ayudan a la convergencia, puede configurar vhigh/vlow
los niveles que desee, y simulará lo más rápido que pueda sin ningún problema. La convergencia está garantizada.
Para las señales, recomiendo usar la fuente de voltaje básica, a menos que se generen dinámicamente en otra parte del circuito.
Me acabo de dar cuenta de que @Bimpelrekkie propuso lo mismo, pero, en mi defensa, señalé explícitamente los elementos a usar.
No soy usuario de LTspice, por lo que no sé si los componentes ideales necesarios están disponibles en LTspice.
Pero suponiendo que lo sean, puede construir su propio sistema para esto, así:
simular este circuito : esquema creado con CircuitLab
Básicamente, el circuito compara una onda triangular (rápida) de 1 MHz con una rampa (lenta) de 100 ms. Cuando la lentitud es de 0,5 V, la salida del comparador tendrá un ciclo de trabajo del 50 %, ya que la onda triangular está por debajo de 0,5 V la mitad del tiempo y por encima de la otra mitad del tiempo.
Puede hacer un comparador ideal (cuando no está disponible) utilizando una VCVS (Fuente de voltaje controlado por voltaje) con una ganancia de, por ejemplo, 1000 y valores de salida limitados, por ejemplo, 0 y 1 V.
A-devices
siempre que sea posible sobre cualquier cambio en la naturaleza. Su comportamiento es mucho mejor y también permiten cierto control de grano fino ( vt/vh
, td
, tau/Cout,Rout/trise,tfall
, ...).Esta no es una respuesta completamente perfeccionada, pero debería darle un buen punto de partida (espero)
Lo que probé es usar una fuente de voltaje de comportamiento arbitrario.
Esta es mi netlist:
B1 NC_01 0 V=if((time/{period})-int(time/{period})<time*{ontime},{Von},{Voff})
.param period 1
.param ontime=1/100
.param Von 3
.param Voff 0
.tran 100
.backanno
.end
Y la captura de pantalla con el resultado:
Desglose de la función de fuente de voltaje de comportamiento:
Primero tenga en cuenta que las fuentes de voltaje de comportamiento tienen acceso al tiempo de simulación usando time
como parámetro a las funciones. Esto no está disponible en .param
declaraciones.
Primero necesitamos alguna función que nos permita permitir una función PWM basada en la hora actual. Para esto, la if(x,y,z)
construcción es útil. Pero un simple if(time<{ontime},3,0)
no producirá una señal recurrente sino solo un pulso al principio.
Aquí es donde entran las siguientes construcciones: (time/{period})-int(time/{period})
esto es básicamente solo un período de módulo de tiempo, pero no hay un operador de módulo, por lo que tengo que seguir la ruta para restar la parte entera del tiempo dividida por el período de la división de tiempo y período. Duh.
Entonces tienes que variar el ontime con respecto al tiempo. En este ejemplo, simplemente usé el tiempo con un factor de 1/100. ...<time*{ontime}
Bueno ontime
, probablemente no sea el mejor nombre para ese parámetro, es más como un factor de escala.
Lo hice con una fuente de voltaje conductual. El resultado es el mismo que con el comparador, la modificación del ciclo de trabajo se realiza mediante V2:
Aquí está el código .asc:
Version 4
SHEET 1 880 680
WIRE 32 144 -48 144
WIRE 80 144 32 144
WIRE 272 144 144 144
WIRE 48 176 32 176
WIRE 80 176 48 176
FLAG 32 256 0
FLAG -48 224 0
FLAG 48 176 t1
FLAG 32 144 t2
FLAG 352 224 0
FLAG 352 144 u2
FLAG 272 144 u1
SYMBOL Digital\\diffschmitt 80 96 R0
WINDOW 3 8 32 Left 2
SYMATTR InstName A1
SYMATTR Value vt=0 vh=0 vhigh=3.3
SYMBOL voltage 32 160 R0
WINDOW 3 24 96 Left 1
WINDOW 123 0 0 Left 0
WINDOW 39 0 0 Left 0
SYMATTR InstName V1
SYMATTR Value PULSE(0 3.3 1p {0.5/freq} {0.5/freq} 1p {1./freq})
SYMBOL voltage -48 128 R0
WINDOW 3 24 96 Left 1
WINDOW 123 0 0 Left 0
WINDOW 39 0 0 Left 0
SYMATTR InstName V2
SYMATTR Value SINE(01.65 1.65 {freq2})
SYMBOL bv 352 128 R0
SYMATTR InstName B1
SYMATTR Value V=if(V(t2)>V(t1),3.3,0)
TEXT 296 64 Left 2 !.param freq=2khz freq2=freq/20
TEXT 16 72 Left 2 !.tran {25/freq}
TEXT -72 280 Left 1 !.OPTIONS METHOD=GEAR ABSTOL=1e-6 CHGTOL=1e-12 GMIN=1e-9 ITL1=1000 ITL2=1000 ITL4=1000 ITL6=1000 RELTOL= 0.001 VNTOL=1e-3 NOOPITER
PlasmaHH
usuario16307