¿Cómo implementar un subcircuito de parámetros S de 2 puertos utilizando LTspice?
He comentado sobre los archivos Touchstone previamente. Como resumen aquí interesa que es un estándar que en base a mediciones que caracteriza el comportamiento en frecuencia de un dispositivo, allí se listan los parámetros de cada matriz S para cada punto de frecuencia medido.
Si bien, existen herramientas que pueden leerlos e incorporarlos en sus simulaciones, habituados a simular con LTspice, es conveniente incorporarlos al mismo, este software, y creo que el conjunto de los *SPICEs, no poseen herramientas nativas para la incorporación de estos archivos en sus simulaciones.
Este apartado pretende dar cuenta de un mecanismo para realizar esto basado en una nota de aplicación [1].
Primera aproximación
En la figura, se observa un generador de tensión (
V1
) de \(2\:V\) (a la izquierda de la figura) en serie con su impedancia R1
de \(Z_0\:\Omega\). A la derecha se gráfica la tensión en sobre la carga (RL
), en función de las variaciones de la misma. Cuando dicha carga tiende a \(0\:\Omega\), la tensión sobre ella, lógicamente tiende a cero. Cuando la carga se abre, la tensión sobre ella es la tensión de la fuente (\(2\:V\)). Y en el caso que sea igual a \(Z_0\) (perfectamente adaptada), la tensión sobre ella es la mitad de la de la fuente (\(1\:V\)).
Los parámetros S son coeficientes adimensionales que describen cómo la onda incidente a un puerto se refleja o se transmite [2]. Los coeficientes \(s_{ij}\) se definen como la relación entre la onda reflejada (\(b_i=\frac {1} {2} \frac {V_i- Z_0^* I_i} {\sqrt{|ℝ\{Z_0\}|}}\)) y la onda incidente (\(a_j=\frac {1} {2} \frac {V_j+ Z_0 I_j} {\sqrt{|ℝ\{Z_0\}|}}\)), por ejemplo, \(s_{ii} = b_i/a_i = \frac {V_i- Z_0^* I_i} {V_i+ Z_0 I_i}\).
Con el objeto de poder determinar \(s_{11}\). Puede pensarse el generador V1
(del primer circuito) como dividido en dos generadores (V1A
y V1B
), como se observa en la figura anterior. La tensión en el nodo 11
(curva verde) corresponde a \(V_{11}=V_{1A}-I_{R1}R_1\) es decir, el numerador de \(s_{11}\) (de forma \(V_i- Z_0^* I_i\)) que presenta la información de la reflejada \(b_1\). Luego, la tensión en el nodo 10
(curva azul) corresponde a \(V_{10}=V_{1A}\) pero también puede escribirse como \(V_{10}=V_{11}+I_{R1}R_1\) es decir, el denominador de \(s_{11}\) (de forma \(V_i+ Z_0 I_i\)) que presenta la información de \(a_1\). Luego es posible obtener \(s_{11}\) por medio de la división \(\frac {V_{11}}{V_{10}}\), como se observa con la curva celeste.
La figura anterior sirve para verificar la correspondencia del modelo planteado. Los valores de \(s_{11}\) pueden verificarse observando el comportamiento del generador cuando está conectado a diferentes cargas. Se observa la equivalencia entre el parámetro \(s_{11}\) y V(11)/V(10)
Generadores arbitrarios en LTspice
Antes de continuar con el modelado es necesario comprender la necesidad de un elemento que será útil para la incorporación de los parámetros S. Este es el componente B (Arbitrary Behavioral Voltage) en LTspice es un tipo de fuente que permite generar señales de tensión de forma arbitraria basándose en una expresión matemática definida. Este componente es útil cuando se necesita modelar una fuentes que depende de parámetros personalizados, como una función matemática compleja o una tabla de respuesta en frecuencia que es este caso.
La asignación de la tabla de comportamiento se realiza por medio de la etiqueta Freq
, que se utiliza para modelar y especificar una función de transferencia basada en una tabla de respuesta de frecuencia [3]. La función de transferencia se define mediante una lista ordenada de puntos. Cada punto incluye tres componentes:
f (Hz)
: La frecuencia en Hertz (Hz).mag (dB)
: La magnitud en decibeles (dB).phase (deg)
: La fase en grados (°).
La lista de puntos debe seguir este formato: <(f1, m1, p1) [(f2, m2, p2)] ...>
, donde cada conjunto de valores (f, m, p)
representa un punto específico en la respuesta del sistema en términos de frecuencia, magnitud y fase.
- f1 < f2 < f3 < ...: Las frecuencias deben estar ordenadas de menor a mayor. Es decir, la frecuencia f1 debe ser menor que f2, y así sucesivamente.
LTspice permite agregar especificadores de unidades opcionales antes de la etiqueta Freq
para indicar cómo se deben interpretar las magnitudes y fases:
rad
: Indica que las fases deben expresarse en radianes en lugar de grados.mag
: Indica que la magnitud debe ser especificada en relaciones unitarias.dB
: Especifica que las magnitudes se proporcionan en decibeles (este es el valor predeterminado).deg
: Especifica que las fases se proporcionan en grados (este es el valor predeterminado).r_i
: Indica que la magnitud y la fase se proporcionan en lugar de la forma tradicional de magnitud y fase, en términos de componentes reales e imaginarios.
Consideraciones sobre el Retardo: Si se especifica un valor de retardo (delay) en la tabla, las fases de los valores en la tabla se ajustan para reflejar ese retardo. Es importante que LTspice ajusta automáticamente el retardo para mantener la causalidad en el sistema. Esto significa que los efectos de retardo no violan el principio de que las señales de salida no pueden adelantarse a las señales de entrada en el tiempo.
Completando el modelo
Para continuar el modelo, con la incorporación del componente B que contenga de alguna forma los parámetros S y que se comporte de forma equivalente a RL
, se plantea el siguiente circuito.
Observar a derecha, el comportamiento equivalente para la tensión en el puerto 1 (V1
) y de V(11)/V(10)
.
Aquí la fuente B11
, genera la componente de onda \(b_1\), que resultan de la onda incidente \(a_1\) modificada por las tablas de respuesta. Para controlar esta fuente, se utiliza la tensión de control igual a V(10)
que, gracias a la impedancia negativa \(-Z_0\) (R1N
), es igual a la tensión de fuente V1
. Esto se logra porque la caída de tensión en R1N
, debido a la corriente de entrada, cancela exactamente la caída de tensión en R1
. Cuando la fuente B11
está apagada, la adición de una resistencia R1P
de \(2Z_0\) ajusta la impedancia de entrada en el puerto 1 a \(Z_0\), la impedancia característica.
Es de hacer notar que aquí, el reemplazo del barrido del valor del Resistor RL
, por un análisis de barrido en frecuencia .AC
, dónde los puntos de frecuencia posee el parámetro S equivalente al barrido del valor del resistor.
Entonces ¿Cómo se genera dicho parámetro S? Siendo \(s_{11}= b_1/a_1 = \frac {V_1- Z_0^* I_1} {V_1+ Z_0 I_1}\) multiplicando y dividiendo por \(I_1\). Luego \(s_{11}= \frac { \frac{V_1}{I_1}- Z_0^*} {\frac{V_1}{I_1}+ Z_0}\) dado que \(Z_0\) real y \(\frac{V_1}{I_1}=R_L\) que se obtiene por simple inspección del circuito, se obtiene el parámetro S \(s_{11}=\frac{R_L-Z_0}{R_L+Z_0}=\Gamma\) también denominado coeficiente de reflexión.
Será posible generar una tabla para el parámetro S tamando algunos valores de \(R_L\):
- \(-1\) para \(R_L=0\:\Omega\).
- \(-0,967\) será para \(R_L=Z_0=1\:\Omega\)
- \(-\frac{2}{3}=-0,667\) será para \(R_L=Z_0=10\:\Omega\)
- \(-\frac{1}{3}=-0,333\) será para \(R_L=Z_0=25\:\Omega\)
- \(-\frac{1}{5}=-0,2\) para \(R_L=\frac{2}{3}Z_0=33,3\:\Omega\)
- \(-\frac{1}{9}=-0,111\) será para \(R_L=Z_0=40\:\Omega\)
- \(0\) será para \(R_L=Z_0=50\:\Omega\)
- \(0,091\) será para \(R_L=Z_0=60\:\Omega\)
- \(0,231\) será para \(R_L=Z_0=80\:\Omega\)
- \(\frac{1}{3}=0,333\) será para \(R_L=2Z_0=100\:\Omega\)
- \(0,818\) será para \(R_L=Z_0=500\:\Omega\)
- \(0,905\) será para \(R_L=Z_0=1\:k\Omega\)
- \(1\) será para \(R_L=\infty\:\Omega\)
Observar la correspondencia de los puntos marcados en las gráficas.
Por lo tanto, al colocar algunos puntos de \(\Gamma\) en la tabla de frecuencias que define al componente B se puede construir de la siguiente forma:
V={V(10)} R_I FREQ (0,-1,0)(1,-0.967,0)(10,-0.667,0)(25,-0.333,0)(33.3,-0.2,0)(40,-0.111,0)(50,0.000001,0)(60,0.091,0)(80,0.231,0)(100,.333,0)(500,0.818,0)(1000,0.905,0)
Dónde:
- En base a los valores en de tensión en el nodo
10
- Se define una tabla de frecuencias del tipo real e imaginario del tipo
<(f1, r1, i1) [(f2, r2, i2)] ...>
, donde cada conjunto de valores(f, r, i)
representa un punto específico en la respuesta del sistema en términos de frecuencia, real e imaginario.
Por simplicidad aquí los valores de frecuencia tienen correspondencia directa con los valores de RL
del modelo anterior.
Es de hacer notar también, la incomodidad que presenta este mecanismo para cargar en única línea tablas extensas.
Como consecuencia, se puede afirmar que el circuito entre las líneas discontinuas, se comporta de manera análoga a un resistor variable en frecuencia.
Superposición y simetría
Con el objeto de constituir una red de dos puertos a partir de la red anterior de un único puerto. Habrá que adicionar los efectos del puerto contrario, para ello, valiéndose del principio de superposición, se puede adicionar un generador en serie B12
, que contendrá los parámetros \(s_{12}=b_1/a_2\), y cómo tensión de control la análoga al nodo 10
pero del otro puerto (nodo 20
, ver en la siguiente figura).
El puerto 2, por simetría, se conformará de la serie de dos generadores B22
y B21
, y dos resistores R2P
y R2N
. Quedando el modelo de la siguiente forma:
Observar que, ante la presencia de \(R_L=50\:\Omega\), sobre el nodo 20
, la tensión es nula, por tanto el generador B12
no aportará nada al puerto de entrada (1).
Notar además, la incorporación de R1
dentro de V1
, expuesto vía Rser=50
.
El subcircuito de parámetros S de 2 puertos se muestra dentro de las líneas discontinuas en la figura anterior. Este utiliza fuentes de tensión arbitrarias etiquetadas como B11, B21, B12 y B22. Estas fuentes de tensión están configuradas usando tablas de respuesta en frecuencia proporcionadas por el modelado.
Las tablas de valores son proporcionadas por el archivo s_my_file.txt
donde se encuentran declaradas las variables S11
, S12
, S21
y S22
. De la siguiente forma:
.text S11="(10000000.0,1.197141521054e-01,-1.003168758859e-01)
+( 22488000.0,9.296498626952e-02,-5.188400097928e-02)
+( 34975000.0,8.735250364971e-02,-3.606297642128e-02)
...
+( 10000000000.0,-1.263262096285e-01,1.089533959977e-01)"
...
representan el truncamiento de la tabla. De forma análoga, se han declarado las tablas para S12
, S21
y S22
.
Realizar manualmente la conversión del archivo Touchstone a este tipo de formato es una ardua tarea, que puede realizarse automáticamente por medio de Scripts.
Sin mucha complicación, para evitar lidiar con la variedad de formatos Touchstone, utilicé el módulo scikit-rf de Python, que de forma nativa puede crear redes a partir de este tipo de archivo, para luego organizar los datos para crear el archivo de salida salida con la estructura anteriormente expuesta.
Aquí el script comentado paso a paso:
s2ptoltspice
Con el objeto de agilizar aún más este trabajo he desarrollado un programa, que directamente crea el subcircuito a partir del archivo s2p
. Lo cual simplifica el trabajo en LTspice, evitando la superposición de nombres de archivos, ya que encapsula en subcircuitos y modelos cada descripción de archivo utilizada. Luego simplemente puede encontrarse el elemento creado en la librería de componentes de LTspice, dentro del subdirectorio de trabajo.
Uso: s2ptoltspice.exe [-h] [--version] [--overwrite] [--silent] s2p_file
Crea:
[name].sub
: El subcircuito.[name].asy
: El modelo.test-[name].asc
: Un ejemplo funcional de simulación.
Argumento:
* archivo_s2p
Opciones:
-h
,--help
Ayuda--version
Versión--overwrite
Si está declarada, sobrescribe archivos de salida sin consultar.--silent
Si está declarada, no genera mensajes de salida.
Ejemplo
>s2ptoltspice.exe network_example.s2p
Processing file: network_example.s2p
Write network_example.sub
Write network_example.asy
Write test-network_example.asc
Esto crea:
Abriendo desde LTspice test-network_example.asc
se obtiene un ejemplo de uso de la red.
Video
Sitio de descarga
Fuentes
- [1] John S. Gerig Wideband Associates. (1996). Create S-Parameter Subcircuits for Microwave and RF Applications. In M. Corporation, MicroSim Application Notes (pp. 57-59).
- [2] Kurokawa, K., "Power Waves and the Scattering Matrix", IEEE Trans. Micr. Theory & Tech., Mar. 1965, pp. 194–202
- [3] B_sources_(complete_reference)