Buscar en este blog

martes, 18 de enero de 2011

Subcircuitos en GSchem

En este post les muestro como creé un subcircuito mediante "gschem" para luego usarlo en otro circuito cualquiera. El subcircuito creado es un rectificador de onda completa que luego voy a utilizar para simular el circuito de una fuente de continua.

Encapsulado de un circuito rectificador de onda - Wikipedia

 Para utilizar un subcircuito en un circuito, necesitamos tener:
  1. El modelo spice del subcircuito en un archivo de texto. Este archivo se puede conseguir en internet o se puede dibujar en "gschem" y luego generar el .net mediante "gnetlist"
  2. Símbolo de "gschem" para el subcircuito
    Modelo del subcricuito

    En este post voy a dibujar el subcircuito en gschem para luego generar el modelo spice del mismo mediante "gnetlist".

    Abrimos "gschem" y dibujamos el subcircuito deseado. Yo voy a dibujar cuatro diodos confromando un rectificador de onda completa:

    Dibujo parcial del subcircuito en "gschem"

    En este caso como los diodos necesitan un modelo, se puede ver que le añadí a cada uno un atributo "model-name" con un valor "D1N4007" y luego añadí el componente "spice-model-1.sym" para indicarle donde está el archivo con ese modelo (atributo file). Pero eso depende de como sea el subcircuito que quieran crear.

    Para ver como añadir el modelo de un diodo, pueden ver uno de los posts anteriores.

    Hasta acá es un circuito como cualquier otro. Si guardamos este archivo y generamos su netlist mediante "gnetlist", este no lo va a reconocer como un subcircuito y va a generar un netlist "normal".

    Para que "gnetlist" reconozca que el circuito dibujado correpsonde a un subcircuito, hay que añadir los siguientes componentes al dibujo:
    • Un componente "spice-subcircuit-LL-1.sym" a cuyo atributo "model-name" le doy el valor "rectificador". Este valor será el nombre del subcircuito que voy a crear.
    • Luego, para indicar los pines del subcircuito, añado un elemento "spice-subcircuit-IO-1.sym" por cada uno de ellos y a sus atributos "refdes" les doy como valor el número deseado para cada pin.
      Dibujo final del subcircuito en "gschem"

      Los pines de IO del subcircuito se deben numerar para que coincidan con el atributo "pinseq" de cada pin del símbolo de gschem que voy a crear más adelante. Por ahora numerenlos como quieran.

      Guardo este esquema como "sub_rect.sch" y cierro el gschem (el nombre con el que se lo guarda puede ser cualquiera).

      Crear el netlist del subcircuito

      Ahora lo que hay que hacer es generar el netlist del subcircuito anterior. Esto se hace de la misma forma que cuando generamos un netlist de un esquema normal. Es decir que abro una línea de comandos en la misma carpeta donde tengo guardado el archivo anterior "sub_rect.sch" e ingreso:

      gnetlist -g spice-sdb sub_rect.sch -o sub_rect.net

      Esto genera el netlist "sub_rect.net". Si lo abren con un editor de texto van a obtener un archivo cuyo encabezado es de la forma:

      *******************************
      * Begin .SUBCKT model *
      * spice-sdb ver 4.28.2007 *
      *******************************
      .SUBCKT recitficador 2 3 4 1


      Hay que observar que los números 2, 3, 4 y 1 no tienen nada que ver con la numeración que se le dió a los pines de IO al dibujar el subcircuito.

      Con esto tenemos el subcircuito creado. Antes de utilizar este subcircuito en otro circuito, hay que dibujarle un símbolo en gschem.

      Símbolo para el subcircuito

      Hay varias formas de hacer esto. En este caso voy a optar por modificar un símbolo preexistente ya que creo que es la forma mas sencilla.

      Para esto abrimos el gschem e insertamos el símbolo a modificar. Yo voy a modificar el optoacoplador "4N29-1.sym" ya que tiene 4 patas como el subcircuito que tengo creado.

      Símbolo a modificar

      Seleccionamos el símbolo (mediante click izquierdo), hacemos click derecho en él y seleccionamos la opción "Descender en símbolo". Esto nos lleva a una especie de instancia de editor de símbolos.

      Una vez en modo edición:
      1. Borro los dibujos del diodo led y del fototransistor. En su lugar pueden dibujar lo que les parezca que corresponde a cada pin de su subcircuito.
      2. Redimensiono el cuadrado incial hasta llevarlo a un rectángulo.
      3. Cambio el valor del atributo "refdes" de U? a X?. Esta X? indica que es el símbolo de un subcircuito.
      4. Cambio el texto que tenía el símbolo original por algo más adecuado como "RECT" (de rectificador).
        Hasta acá me va quedando algo así:

        Edición parcial del símbolo

        Antes de salir del modo edición, falta modificar los atributos "pinnumber" y "pinseq" de cada pin. Para esto:
        • Seleccionamos "Editar > Mostrar/Ocultar texto oculto" para ver todos los atributos del símbolo.
        • Cambiamos el valor del atributo "pinseq" de cada pin de forma que coincida con la numeración dada a los pines IO al crear el esquema del subcircuito. Esto es: si al crear el esquema del subcircuito, le dimos el valor "P3" al atributo "refdes" de la salida correpondiente al "voltaje positivo rectificado", entonces debemos darle el valor "3" al atributo "pinseq" del pin correpsondiente en el símbolo que estamos creando.
         Numeración de los pines IO al dibujar el subcircuito (izquierda) y su correspondencia con la numeración del atributo "pinseq" al crear el símbolo para ese subcircuito (derecha). 
        • Le damos el valor que queramos al atributo "pinnumber" de cada pin. Esto no va a afectar en nada al simular. Sí quizá al intentar generar un PCB a partir del esquema de un circuito que contenga este símbolo. Pero eso es otro tema.
        • Finalmente modificamos el valor del atributo device por otro como "rect-completa" (puede ser cualquiera).
        • Para ocultar todos los atributos del símbolo seleccionamos nuevamente "Editar > Mostrar/Ocultar texto oculto".
         Edición de los atributos ocultos "pinseq" del símbolo

        Ahora, aún en modo edición, guardo el símbolo con el nombre "rect_completa.sym" (Ojo de no sobreescribir el símbolo que estamos editando).

        En mi caso guardo el nuevo símbolo en una carpeta "symbols" ubicada un nivel por encima de la carpeta en la que estoy guardando los esquemas (.sch y .net) del subcircuito. Esa carpeta "symbols" es la que utilizo para guardar los símbolos creados/modificados por mí.

        Para salir del modo edición seleccionamos "Página > cerrar".

        Dónde están los símbolos?


        Si es la primera vez que usan un símbolo creado por ustedes, hay que indicarle al gschem en que carpeta los tienen guardados.

        Yo guardo los símbolos que creo en la carpeta "/media/archivos/gEDA_archivos/symbols". Para que el "gschem" lo sepa y los liste, es necesario hacer lo siguiente:

        Crear un archivo de texto, de nombre "gafrc" (sin comillas), con el siguiente contenido:

        ;direccion a carpeta con simbolos propios para gschem
        (component-library "/media/archivos/gEDA_archivos/symbols")


        Donde en lugar de "/media/archivos/gEDA_archivos/symbols" deben poner la ruta a la carpeta donde guardan sus símbolos propios.

        Luego a este archivo de texto lo guardan en la carpeta oculta "/home/nombre_usuario/.gEDA". Deben cambiar nombre_usuario por el nombre de usuario que usan en GNU/Linux. Si la carpeta no existe la deben crear.

        Para que esto tenga efecto hay que cerrar y reabrir "gschem".

        Utilizar el subcircuito

        Ahora sí ya podemos utilizar el subcircuito. En este caso lo voy a utilizar para simular una fuente de DC.

        Abro un archivo nuevo en gschem y añado los siguientes componentes:
        • vsin-1.sym
        • resistor-1.sym
        • capacitor-2.sym
        • rect_completa.sym (nombre con el que guardé el símbolo del subcircuito)
        • gnd-1.sym
        • spice-model-1.sym
        A estos componentes los conecto de la siguiente forma y con la siguiente numeración y atributos:

         Circuito que contiene al subcircuito creado 

        Lo más importante es:
        • Al atributo "model-name" del símbolo insertado del subcircuito le doy el valor "rectificador". Este debe ser el mismo valor que le dimos al atributo "model-name" del componente "spice-subcircuit-LL-1.sym" al dibujar el subcircuito. Es decir, el nombre del subcircuito.
        • Al atributo "model-name" del componente "spice-model-1.sym" le doy el mismo valor, es decir "rectificador", y al atributo "file" le doy como valor la dirección (respecto del directorio donde está guardado este esquema) donde se encuentra el netlist con la información del subcircuito.
        Se puede ver además que añadí valores a los atributos "netname" de tres cables (dos de la fuente y uno de la craga) para poder hacer referencia a estos nodos al simular.

        Guardo este esquema como "fuente_dc.sch" (en la misma carpeta donde tengo el archivo .net del subcircuito) y cierro el "gschem".

        Simulación

        El circuito anterior convierte el voltaje alterno sinusoidal de la fuente V1 en un voltaje "casi" continuo. Esta fuente V1 representa el secundario de un transformador reductor de 220VAC a 18/sqrt(2) VAC (@50Hz).

        El subcircuito creado es el que rectifica la onda sinusoidal, la resistencia representa una carga y el capacitor es quien intenta mantener una reserva de energía constante para proporcionarle a esa carga.

        La simulación se hace como en cualquier otro circuito. Primero hay que generar el netlist con la descripción de circuito. Para esto abro una línea de comandos en la carpeta donde tengo guardado el archivo "fuente_dc.sch" e ingreso:

        gnetlist -g spice-sdb fuente_dc.sch -o fuente_dc.net

        Esto genera el archivo "fuente_dc.net". Para simular el circuito, abro el netlist generado con el simulador ngspice mediante:

        ngspice fuente_dc.net

        Una vez en ngspice, le pido que realize un análisis temproal de 0s a 40ms (dos períodos) con un paso de 0.1ms mediante:

        tran 0.1ms 40ms 0s

        Luego le pido que grafique el voltaje en el secundario (la fuente sinusoidal) y el voltaje en la carga (la resistencia):

        plot v1-v2 vout

        El resultado es el siguiente:

        Voltajes de entrada y salida del circuito generado usando el subcircuito rectifcador 

        Se ve que el ripple de la fuente es bastante importante.

        Árbol de directorios

        Para finalizar les dejo mi árbol de directorios por si se perdieron con tanta carpeta entre símbolos y modelos:
        • "/media/archivos/gEDA_archivos/symbols" tengo los símbolos creados/modificados por mí. En particular el archivo "rect_completa.sym" del símbolo creado en este proyecto.
        • "/media/archivos/gEDA_archivos/modelos_spice" tengo el archivo "D1N4007.mod" con el modelo de los diodos.
        • "/media/archivos/gEDA_archivos/rectificador_completa" tengo los archivos "sub_rect.sch", "sub_rect.net", "fuente_dc.sch" y "fuente_dc.net" de este proyecto.
        • "/home/nombre_usuario/.gEDA" tengo el archivo "gafrc" que le indica al "gschem" donde están los símbolos creados/modificados por mí.
        Referencias

        4 comentarios:

        1. Estoy usando por primera vez el gEDA para un proyecto. Me viene muy util esto =)

          ResponderEliminar
        2. Veo que abajo recomiendas el KiCad. ¿Lo recomendarias por encima del PCB que es parte del gEDA?

          ResponderEliminar
        3. @Rafael Román: Últimamente he usado el KiCad ya que me resulta más sencillo que el gEDA. Sobretodo para pasar entre una etapa y otra del proyecto (esquemático a PCB por ejemplo). Además el proceso es bastante parecido (en los dos hay que asignar footprints a los componentes por ejemplo).
          Al principio no quería cambiar de gEDA a KiCad porque me interesaba la opción de gEDA de exportar los netlist del esquemático creado con gschem, para poder simular los circuitos con ngspice.
          Creo que KiCad también tiene esa posibilidad pero no he investigado porque por ahora solamente lo usé para crear un PCB a partir del esquemático.
          Saludos.

          ResponderEliminar