7.7: Spice Quirks
- Page ID
- 153811
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)“Basura adentro, basura afuera”.
—Anónimo
SPICE es una pieza de software muy confiable, pero tiene sus pequeñas peculiaridades a las que lleva algún tiempo acostumbrarse. Por “peculiaridad” me refiero a una demanda puesta al usuario para escribir el archivo fuente de una manera particular para que funcione sin dar mensajes de error. No me refiero a ningún tipo de falla con SPICE que produzca resultados erróneos o engañosos: eso se denominaría más correctamente como un “error”. Hablando de bichos, SPICE también tiene algunos de ellos.
Algunas (o todas) de estas peculiaridades pueden ser exclusivas de SPICE versión 2g6, que es la única versión que he usado extensamente. Es posible que se hayan arreglado en versiones posteriores.
Un buen comienzo
SPICE exige que el archivo fuente comience con algo que no sea la primera “carta” en la descripción del circuito “mazo”. Este primer carácter en el archivo fuente puede ser una línea de avance, una línea de título o un comentario: solo tiene que haber algo allí antes de la primera línea de especificación de componentes del archivo. De no ser así, SPICE se negará a hacer un análisis en absoluto, alegando que hay un error grave (como conexiones de nodo inadecuadas) en la “cubierta”.
Un buen final
SPICE exige que la línea .end al final del archivo de origen no se termine con un carácter de avance de línea o retorno de carro. En otras palabras, cuando termines de escribir “.end” no debes golpear la tecla [Enter] en tu teclado. El cursor en su editor de texto debe detenerse inmediatamente a la derecha de la “d” después del “.end” y no ir más lejos. Si no se presta atención a esta peculiaridad, aparecerá un mensaje de error de “falta en la tarjeta de.end” al final de la salida del análisis. El análisis real del circuito no se ve afectado por este error, por lo que normalmente ignoro el mensaje. No obstante, si buscas recibir una salida “perfecta”, debes prestar atención a esta idiosincrasia.
Debe tener un nodo 0
Se te da mucha libertad en la numeración de los nodos de circuito, pero debes tener un nodo 0 en algún lugar de tu netlist para que SPICE funcione. El nodo 0 es el nodo predeterminado para la tierra del circuito y es el punto de referencia para todos los voltajes especificados en ubicaciones de un solo nodo.
Cuando SPICE realiza un análisis simple de CC, la salida contendrá una lista de voltajes en todos los nodos distintos de cero en el circuito. El punto de referencia (tierra) para todas estas lecturas de voltaje es el nodo 0. Por ejemplo:
node voltage node voltage ( 1) 15.0000 ( 2) 0.6522
En este análisis, existe una tensión de CC de 15 voltios entre el nodo 1 y tierra (nodo 0), y una tensión de CC de 0.6522 voltios entre el nodo 2 y tierra (nodo 0). En ambos casos, la polaridad de voltaje es negativa en el nodo 0 con referencia al otro nodo (es decir, ambos nodos 1 y 2 son positivos con respecto al nodo 0).
Evite los circuitos abiertos
SPICE no puede manejar circuitos abiertos de ningún tipo. Si su netlist especifica un circuito con una fuente de voltaje abierta, por ejemplo, SPICE se negará a realizar un análisis. Un excelente ejemplo de este tipo de error se encuentra al “conectar” una fuente de voltaje a la entrada de una fuente dependiente de voltaje (utilizada para simular un amplificador operativo). SPICE necesita ver una ruta completa para la corriente, así que suelo atar una resistencia de alto valor (¡llámalo rbogus!) a través de la fuente de voltaje para actuar como una carga mínima.
Evite ciertos bucles de componentes
SPICE no puede manejar ciertos bucles ininterrumpidos de componentes en un circuito, a saber, fuentes de voltaje e inductores. Los siguientes bucles harán que SPICE aborte el análisis:
netlist l1 2 4 10m l2 2 4 50m l3 2 4 25m
netlist v1 1 0 dc 12 l1 1 0 150m
netlist c1 5 6 33u c2 6 7 47u
La razón por la que SPICE no puede manejar estas condiciones se debe a la forma en que realiza el análisis de CC: tratando todos los inductores como cortocircuitos y todos los condensadores como aperturas. Dado que los cortocircuitos (0 Ω) y los circuitos abiertos (resistencia infinita) contienen o generan infinitos matemáticos, una computadora simplemente no puede lidiar con ellos, por lo que SPICE descontinuará el análisis si ocurre alguna de estas condiciones.
Para que estas configuraciones de componentes sean aceptables para SPICE, se deben insertar resistencias de valores apropiados en los lugares apropiados, eliminando los respectivos cortocircuitos y circuitos abiertos. Si se requiere una resistencia en serie, elija un valor de resistencia muy bajo. Por el contrario, si se requiere una resistencia paralela, elija un valor de resistencia muy alto. Por ejemplo:
Para solucionar el problema del inductor paralelo, inserte una resistencia de muy bajo valor en serie con cada inductor infractor.
original netlist l1 2 4 10m l2 2 4 50m l3 2 4 25m
fixed netlist rbogus1 2 3 1e-12 rbogus2 2 5 1e-12 l1 3 4 10m l2 2 4 50m l3 5 4 25m
Las resistencias de extremadamente baja resistencia R bogus1 y R bogus2 (cada una con solo 1 pico-ohmio de resistencia) “rompen” las conexiones paralelas directas que existían entre L 1, L 2 y L 3. Es importante elegir resistencias muy bajas aquí para que el funcionamiento del circuito no se vea afectado sustancialmente por el “arreglo”.
Para fijar el bucle de fuente de voltaje/inductor, inserte una resistencia de muy bajo valor en serie con los dos componentes.
original netlist v1 1 0 dc 12 l1 1 0 150m
fixed netlist v1 1 0 dc 12 l1 2 0 150m rbogus 1 2 1e-12
Al igual que en el ejemplo anterior con inductores paralelos, es importante hacer que la resistencia de corrección (R falso) sea muy baja en resistencia, para no impactar sustancialmente el funcionamiento del circuito.
Para fijar el circuito del condensador en serie, uno de los condensadores debe tener una derivación de resistencia a través de él. SPICE requiere una ruta de corriente CC a cada condensador para su análisis.
original netlist c1 5 6 33u c2 6 7 47u
fixed netlist c1 5 6 33u c2 6 7 47u rbogus 6 7 9e12
El valor falso R de 9 Tera-ohmios proporciona una trayectoria de corriente CC a C1 (y alrededor de C 2) sin afectar sustancialmente el funcionamiento del circuito.
Medición de corriente
Aunque la impresión o trazado de voltaje es bastante fácil en SPICE, la salida de los valores de corriente es un poco más difícil. Las mediciones de voltaje se especifican declarando los nodos de circuito apropiados. Por ejemplo, si deseamos conocer el voltaje a través de un condensador cuyos cables se conectan entre los nodos 4 y 7, podríamos distinguir la declaración.print que se vea así:
c1 4 7 22u .print ac v(4,7)
No obstante, si quisiéramos que SPICE mediera la corriente a través de ese condensador, no sería tan fácil. Las corrientes en SPICE deben especificarse en relación con una fuente de voltaje, no cualquier componente arbitrario. Por ejemplo:
c1 4 7 22u vinput 6 4 ac 1 sin .print ac i(vinput)
Esta tarjeta.print indica a SPICE que imprima la corriente a través de la entrada V de la fuente de voltaje, que pasa a ser la misma que la corriente a través de nuestro condensador entre los nodos 4 y 7. Pero, ¿y si no hay tal fuente de voltaje en nuestro circuito para referenciar para la medición de corriente? Una solución es insertar una resistencia de derivación en el circuito y medir el voltaje a través de él. En este caso, he elegido un valor de resistencia de derivación de 1 Ω para producir 1 voltio por amperio de corriente a través de C 1:
c1 4 7 22u rshunt 6 4 1 .print ac v(6,4)
Sin embargo, la inserción de una resistencia adicional en nuestro circuito lo suficientemente grande como para reducir un voltaje significativo para el rango de corriente previsto podría afectar negativamente a las cosas. Una mejor solución para SPICE es esta, aunque nunca se buscaría tal solución de medición de corriente en la vida real:
c1 4 7 22u vbogus 6 4 dc 0 .print ac i(vbogus)
Insertar una fuente de voltaje CC “falso” de cero voltios no afecta en absoluto el funcionamiento del circuito, sin embargo, proporciona un lugar conveniente para que SPICE tome una medición de corriente. Curiosamente, ¡no importa que V falsa sea una fuente de CC cuando buscamos medir la corriente de CA! El hecho de que SPICE emitirá una lectura de corriente CA está determinado por la especificación “ac” en la tarjeta .print y nada más.
También hay que señalar que la forma en que SPICE asigna una polaridad a las mediciones de corriente es un poco impar. Tomemos como ejemplo el siguiente circuito:
example v1 1 0 r1 1 2 5k r2 2 0 5k .dc v1 10 10 1 .print dc i(v1) .end
Con un voltaje total de 10 voltios y una resistencia total de 10 kΩ, puede esperar que SPICE le diga que va a haber 1 mA (1e-03) de corriente a través de la fuente de voltaje V 1, pero en la actualidad, ¡SPICE emitirá una cifra de 1 mA negativo (-1e-03)! SPICE considera que la corriente fuera del extremo negativo de una fuente de voltaje de CC (la dirección normal) es un valor negativo de corriente en lugar de un valor positivo de corriente. Hay veces que voy a lanzar una fuente de voltaje “falso” en un circuito de CC como este simplemente para hacer que SPICE emita un valor de corriente positivo:
example v1 1 0 r1 1 2 5k r2 2 3 5k vbogus 3 0 dc 0 .dc v1 10 10 1 .print dc i(vbogus) .end
Observe cómo se posiciona V falso para que la corriente del circuito entre en su lado positivo (nodo 3) y salga de su lado negativo (nodo 0). Esta orientación asegurará una cifra de salida positiva para la corriente del circuito.
Análisis de Fourier
Al realizar un análisis de Fourier (dominio de frecuencia) en una forma de onda, he encontrado necesario imprimir o trazar la forma de onda usando las tarjetas .print o .plot, respectivamente. Si no lo imprime o traza, SPICE hará una pausa por un momento durante el análisis y luego abortará el trabajo después de dar salida a la “solución transitoria inicial”.
Además, al analizar una onda cuadrada producida por la función de fuente “pulso”, debe darle a la forma de onda algún tiempo finito de subida y caída, o bien los resultados del análisis de Fourier serán incorrectos. Por alguna razón, una onda cuadrada perfecta con tiempo de subida/caída cero produce niveles significativos de armónicos pares de acuerdo con la opción de análisis de Fourier de SPICE, lo que no es cierto para las ondas cuadradas reales.