¿Cómo funcionan realmente los simuladores de circuitos?

Recientemente tuve la oportunidad de jugar con LiveWire , que es un simulador de circuito y comencé a preguntarme cómo calculaban exactamente los voltajes en cada componente y la corriente que pasaba por cada pista de cable.

Hasta ahora, solo me han enseñado habilidades básicas de análisis de circuitos (como el análisis de mallas y el análisis de nodos), y no estoy completamente seguro de que sean lo suficientemente genéricos como para implementarlos en un simulador de circuitos.

Como programador, esto me ha intrigado y me encantaría ver qué técnicas se emplean comúnmente al construir simuladores de circuitos como este.

Mis disculpas si esto no pertenece aquí, fue una elección entre aquí y StackOverflow y sentí que aunque es una pregunta orientada al desarrollo de software, la pregunta es más aplicable a este sitio y su base de usuarios.

El truco principal es un montón de pequeñas porciones de tiempo. Por lo tanto, las funciones de tiempo complejas se manejan ejecutando muchas ecuaciones en diferencias con pequeños intervalos de tiempo. La complejidad desagradable generalmente se reduce significativamente si se puede expresar como ecuaciones diferenciales, que se convierten en ecuaciones en diferencias en una simulación digital.

Respuestas (3)

He examinado el código del simulador Falstad con cierto detalle. Para los circuitos que consisten solo en componentes lineales como resistencias, interruptores y fuentes de voltaje (cosas como las salidas de compuerta lógica se consideran fuentes de voltaje conectadas a tierra para fines de la simulación), el simulador considera cada nodo del circuito, fuente de voltaje (conectando dos nodos) , o alambre (del mismo modo) como la definición de una ecuación lineal y una variable, de modo que el número de ecuaciones y el número de variables sean siempre iguales. Para un nodo de circuito, la variable es el voltaje del nodo y la ecuación calcula la corriente total que fluye a través de él igual a la corriente total inyectada por cualquier fuente de corriente. Para una fuente de voltaje o cable (un cable que se maneja como una fuente de voltaje donde la diferencia de potencial es cero),

Cosas como fuentes de corriente y resistencias no están asociadas con resistencias o variables. En cambio, las fuentes de corriente aumentan la corriente total requerida para un nodo del circuito (recuerde que cada nodo del circuito tiene una ecuación que evalúa la corriente total que entra y sale) y la disminuyen para el otro. Las resistencias son un poco más complicadas: para la ecuación de cada punto final, la resistencia agrega términos para el voltaje de nodo de cada punto final.

Una resistencia de 100 ohmios que conecta los nodos 1 y 2, por ejemplo, diría que cada aumento de voltios en el nodo 1 disminuirá la corriente que fluye hacia el nodo 1 en 0,01 amperios y aumentará la corriente que fluye hacia el nodo 2 en una cantidad similar. Del mismo modo, cada aumento de voltios en el nodo 2 aumentaría la corriente que fluye hacia el nodo 1 en 0,01 amperios y disminuiría la corriente que fluye hacia el nodo 2 en una cantidad similar.

Considere un circuito con un suministro de 10 voltios que conecta los nodos 1 y 5, y resistencias de 100 ohmios que conectan los nodos 1 y 2, 2 y 3, 2 y 4, y 3 y 4. Suponga además que hay un icono de tierra en el nodo 1. Así:

neg ---+-1---R100---2---R100---3---100---4---pos
      gnd           |                    |
                    +---------100--------+

Habría dos "fuentes de voltaje": el cable de tierra y el suministro de 10 voltios (que se consideran como ecuación/variable 5 y 6, respectivamente). Las ecuaciones serían entonces:

-X1*0.01                             +X5 -X6 = 0  Node 1
+X1*0.01 -X2*0.01          +X4*0.01          = 0  Node 2
         +X2*0.01 -X3*0.01 +X4*0.01          = 0  Node 3
         +X2*0.01          -X4*0.01      +X6 = 0  Node 4
-X1*1                                        = 0  Volts 5 (voltage between 1 and gnd)
-X1*1                      +X4*1             = 10 Volts 6 (voltage between 1 and 4)

Este sistema de ecuación puede representarse como una matriz NxN más una matriz de N elementos. Cada ecuación está representada por una fila en la matriz, con valores en cada fila que representan los coeficientes de cada variable. El lado derecho de cada ecuación se almacena en una matriz separada. Antes de resolver las ecuaciones, se conocerá la corriente neta que fluye en cada nodo (cero en este caso) y la diferencia de voltaje entre pares de nodos conectados por fuentes de voltaje. Resolver las ecuaciones arrojará el voltaje en cada nodo y la corriente que fluye a través de cada fuente de voltaje.

Si el circuito contiene condensadores, cada uno de ellos se considerará como una fuente de voltaje en serie con una resistencia de bajo valor; después de cada paso de simulación, la fuente de voltaje se ajustará de acuerdo con la cantidad de corriente que fluyó a través de ella. Los inductores se considerarán resistencias de alto valor que alimentan corriente en uno y la sacan del otro (la cantidad de corriente se ajusta de acuerdo con el voltaje a través de la resistencia). Tanto para capacitores como para inductores, el valor de la resistencia será controlado por la cantidad de tiempo representada por un paso de simulación.

Los elementos de circuitos más complejos, como los transistores, se consideran combinaciones de fuentes de voltaje, fuentes de corriente y resistencias. A diferencia de los elementos de circuito más simples que permiten que todo se procese una vez por paso de tiempo de simulación, elementos como los transistores calculan sus resistencias efectivas, etc. en función de los voltajes y corrientes que están viendo, evalúan todas las ecuaciones resultantes y vuelven a evaluar su resistencia en función de los nuevos voltajes y corrientes, vuelva a evaluar las ecuaciones, etc. en un esfuerzo por alcanzar un equilibrio donde su resistencia efectiva sea la que debería ser para el voltaje y la corriente que está viendo el transitor.

El simulador Falstad puede ser decentemente rápido para circuitos de tamaño moderado que consisten completamente en elementos "lineales". El tiempo para resolver repetidamente un sistema de ecuaciones es bastante razonable si lo único que cambia son los coeficientes del lado derecho. El tiempo se vuelve mucho más lento si cambia el lado izquierdo (por ejemplo, porque la resistencia efectiva de un transistor sube o baja) porque el sistema tiene que "refactorizar" las ecuaciones. Tener que refactorizar las ecuaciones varias veces por paso de simulación (puede ser necesario con transistores) hace que las cosas sean aún más lentas.

Usar una matriz grande para todo no es un buen enfoque para simulaciones grandes; aunque la matriz será bastante escasa, ocupará un espacio proporcional al cuadrado del número de nodos más las fuentes de tensión. El tiempo requerido para resolver la matriz en cada paso de la simulación será proporcional al cuadrado del tamaño de la matriz si no se requiere refactorización, o al cubo del tamaño de la matriz si se requiere refactorización. No obstante, el enfoque tiene cierta elegancia a la hora de mostrar la relación entre un circuito y un sistema de ecuaciones lineales.

La mayoría de los simuladores de tipo SPICE también utilizan este tipo de algoritmo. Aquí hay una descripción general de Spice ecircuitcenter.com/SpiceTopics/Overview/Overview.htm
FYI -- KLU es el algoritmo común utilizado en los simuladores de circuitos. KLU significa Clark Kent LU, ya que se basa en el algoritmo de Gilbert-Peierls, un algoritmo no supernodal, que es el predecesor de SuperLU, un algoritmo supernodal. KLU es un solucionador lineal escaso de alto rendimiento que emplea mecanismos de ordenación híbridos y elegantes algoritmos de factorización y resolución.
Es importante notar que existen varios modelos de transistores, BSIM o EKV, por ejemplo. Básicamente, estos modelos toman en consideración toda la física, desde un punto de vista, involucrada en la operación de un solo transistor y los efectos sobre sus características eléctricas. Hay mucho más en él que solo representar como combinaciones de fuentes de voltaje, fuentes de corriente y resistencias. Si desea seleccionar un modelo diferente, puede utilizar el parámetro LEVEL. Este tutorial de Jacob Baker es un buen comienzo. Espero eso ayude.

LiveWire es uno de los muchos simuladores de circuitos, con diferentes niveles de capacidad.

Por ejemplo, Falstad Circuit Simulator parece tener un nivel de capacidad similar al de LiveWire, y el código fuente se ofrece en ese enlace. Eso debería ser un buen comienzo.

Para una simulación de circuitos más sofisticada, muchas herramientas se remontan a SPICE de UC Berkley . El código fuente de SPICE está disponible a pedido de UCB bajo licencia BSD.

Las ediciones SPICE específicas del fabricante suelen integrar modelos de simulación de semiconductores muy detallados de sus propios productos en sus simuladores. Por ejemplo, LTSpice IV de Linear Technologies o TINA-TI de Texas Instruments. Debajo, todo suele ser SPICE.

Citando de la página de WikiPedia sobre SPICE:

Los programas de simulación de circuitos, de los cuales SPICE y sus derivados son los más destacados, toman una lista de red de texto que describe los elementos del circuito (transistores, resistencias, capacitores, etc.) y sus conexiones, y traducen esta descripción en ecuaciones para ser resueltas. Las ecuaciones generales producidas son ecuaciones algebraicas diferenciales no lineales que se resuelven utilizando métodos de integración implícita, método de Newton y técnicas de matrices dispersas.

En un nivel aún más alto de sofisticación, varios productos comerciales como Proteus Virtual System Modeling , parte de Proteus Design Suite, utilizan mejoras patentadas para la simulación de circuitos SPICE en modo mixto: estas herramientas pueden simular tanto el comportamiento del circuito analógico como el código del microcontrolador digital. con las interacciones entre ellos completamente modeladas.

En un nivel mucho más limitado y limitado, algunos editores de esquemas, como la herramienta Circuit Lab integrada en este sitio, brindan una pequeña gama de capacidades de simulación. Si bien esto puede no ser tan útil en el diseño electrónico práctico no trivial, el estudio de sus capacidades e implementación proporcionaría al desarrollador de software una idea de lo que funciona bien para los usuarios y lo que no.

Hay tres análisis principales que realizan los simuladores de circuitos tipo SPICE:

  • Punto de funcionamiento de CC
  • análisis de CA
  • Análisis transitorio

El análisis del punto de operación de CC para un circuito lineal (formado a partir de fuentes de CC, resistencias lineales y fuentes lineales controladas) se realiza mediante el análisis nodal modificado (MNA). También se podría usar el análisis de malla, pero es muy fácil configurar las ecuaciones para el análisis nodal.

Para circuitos no lineales (que incluyen dispositivos como transistores, que pueden modelarse esencialmente como fuentes controladas no lineales), se deben usar algunos trucos adicionales. Una forma conceptualmente simple es usar una extensión del Método de Newton para ecuaciones múltiples.

El método de Newton implica adivinar la solución y luego hacer un modelo lineal del circuito que solo es exacto "cerca" de la solución adivinada. La solución del circuito linealizado se usa como una nueva conjetura sobre la solución, y el proceso se repite hasta que las iteraciones sucesivas "convergen" en la (con suerte) solución correcta para el circuito no lineal. En el mundo real, se utilizan solucionadores no lineales más complicados para poder hacer la solución más rápidamente y con menos errores debido a fallas de convergencia.

El análisis de CA se realiza primero haciendo un análisis de CC para encontrar un punto de operación. Luego estudia el efecto de pequeñas perturbaciones alrededor del punto de operación. "Pequeño" significa, por definición, lo suficientemente pequeño como para que los efectos no lineales no sean importantes. Eso significa que los elementos del circuito se transforman en elementos lineales equivalentes según el punto de operación. Entonces se puede usar el MNA (con números complejos que representan la impedancia de los elementos que almacenan energía) para resolver el efecto de las perturbaciones causadas por las fuentes de CA en el circuito.

El análisis transitorio se realiza, como dice Olin en los comentarios, considerando cómo evolucionan las variables del circuito en pasos muy pequeños en el tiempo. Nuevamente, en cada paso de tiempo, el circuito se linealiza alrededor de su punto de operación, de modo que se puede usar MNA para establecer las ecuaciones. Un método simple para resolver el comportamiento a lo largo del tiempo es el Método de Euler . Sin embargo, nuevamente en la práctica, se utilizan métodos más complicados para permitir el uso de intervalos de tiempo más grandes con errores más pequeños.

Puede ver que un hilo común en estos métodos es hacer una aproximación lineal al comportamiento del circuito y resolverlo con MNA hasta que encuentre una solución al comportamiento del circuito no lineal.

Estos tres análisis han sido los principales realizados por simuladores tipo SPICE desde la década de 1970. Los simuladores más nuevos agregan capacidades adicionales como balance armónico (una extensión del análisis de CA para acomodar efectos de mezcla de elementos no lineales) o simulaciones electromagnéticas para simular efectos de línea de transmisión. Pero las simulaciones de CC, CA y transitorias son las tres primeras que debe comprender al usar un simulador similar a SPICE.

Hablé sobre cómo configurar las ecuaciones de MNA en una respuesta anterior: electronics.stackexchange.com/questions/19198/…
También deberíamos agregar que las simulaciones de circuitos digitales usan métodos completamente diferentes; y eso convierte a la cosimulación analógico-digital en todo un problema propio.