domingo, 29 de abril de 2012

Filtros activos en Matlab!

Un filtro electrónico es un circuito que permite dejar pasar cierta gama de frecuencias, bloqueando las que no interesan; de ahí el término "filtro". En el post anterior vimos cómo se puede sacar la función de transferencia de un circuito, que resultó ser un filtro pasa bajas. Los filtros de ese estilo son denominados filtros pasivos. Esto quiere decir que únicamente está formado por elementos pasivos como resistencias, capacitores e inductores. Sin embargo, estos no son los únicos componentes con los cuales se pueden construir los filtros. También se pueden construir con transistores, amplificadores operacionales, etc. A los filtros construidos con este tipo de componentes se les denominan filtros activos. Una de las ventajas que poseen este tipo de filtros con respecto a los pasivos es que pueden llegar a ser muy selectivos, además de que a la salida se le puede implementar una ganancia. Por supuesto la ausencia de Facebook en tiempos de antaño provocó que la gente no perdiera el tiempo y se pusiera a jugar con estos filtros. A lo que llegaron estas personas es a diferentes tipos de filtros con diferentes características. Algunos de estos eran de respuesta "plana", pero poco selectivos, mientras que otros tenían "rizos" pero con una pendiente de corte extremadamente grande. Los más populares (o por lo menos los que les encantan a los profes) son el Butterworth, el Chebyshev y el Bessel, cada uno con diferentes características como las que acabo de mencionar. Sin embargo, estos filtros están basados en una especie de célula que se denomina topología, que es simplemente la manera en la que están acomodados los componentes. Una de las más populares es la topología Sallen-Key, que es la que vamos a ver ahorita. 
En esta ocasión analizaremos un filtro tipo pasa altas. Estos filtros, como su nombre lo indica, dejan pasar frecuencias altas, rechazando las frecuencias bajas (según nuestro criterio, por su puesto). En la siguiente imagen se puede ver el esquemático del filtro.



Para analizar este tipo de filtros se debe obtener su función de transferencia, pues su funcionamiento no es tan evidente como el del circuito anterior. El procedimiento para obtener la función de transferencia de los filtros activos es muy parecido al procedimiento usado la vez anterior. Se deben convertir los componentes al dominio de la frecuencia, obtener las ecuaciones de nodo y resolverlas. La única diferencia es que se deben considerar las características del componente activo al momento de obtener las ecuaciones de nodo. Dicho esto,
¡¡Comencemos!!

Paso 1
En este paso haremos una transformación pasando los componentes pasivos del dominio del tiempo al dominio de la frecuencia, que es donde la función de transferencia sirve. En otro post podré con detalle cómo se obtienen estas relaciones, pero por el momento créanme lo siguiente



Donde S es igual a jω, si es que vamos a estar trabajando con señales senoidales (Déjenlo en S por lo pronto) y R y C son la resistencia y la capacitancia, respectivamente. Por cierto, Z significa reactancia o impedancia (son diferentes cosas, pero por el momento hagamos de cuenta que son sinónimos).
Ahora que ya hemos pasado todos los componentes a reactancias, podremos redibujar el circuito como se muestra a continuación
Genial! Ya hemos completado el paso 1

Paso 2
Ya que tenemos nuestro circuito en el dominio de la frecuencia, podemos obtener las ecuaciones de nodo (Nota: las leyes de Kirchhoff, la ley de Ohm, Thévenin y todo eso es válido también con circuitos en el dominio de la frecuencia). Para esto hay que identificar los nodos primero.

Ya que tenemos identificados los nodos, podemos obtener las ecuaciones de cada uno.
Para el nodo 1 tenemos que


El nodo 2 está conectado a la entrada no inversora del Op-amp, y dado que idealmente tiene impedancia infinita, tenemos la siguiente ecuación.


El nodo 3 está conectado a la entrada inversora del Op-amp, y además de tener impedancia infinita resulta que existe un corto virtual entre las entradas inversora y no inversora. Esto quiere decir que el voltaje en el nodo 3 es el mismo que el voltaje en el nodo 2, lo que da como resultado que V2 = V3. Esto provoca que tengamos la siguiente ecuación



Para el nodo 4 tenemos que... un momento! En las ecuaciones que tenemos ya estamos considerando todos los voltajes que hay en todos los nodos que hay en el circuito! Eso significa que la ecuación que obtendríamos del nodo 4 ya no serviría de nada, puesto que ya tenemos todo lo que necesitamos! Yay!! :D

Paso 3
Ya que hemos obtenido las ecuaciones de nodo necesarias del circuito, podemos proceder a calcular la Función de transferencia!!
La función de transferencia de un circuito eléctrico se calcula mediante la relación que existe entre el voltaje de salida y el voltaje de entrada, dada por la siguiente ecuación:

Si somos observadores, podemos ver que en nuestras ecuaciones tenemos tanto Vo como Vi, por lo que sólo necesitamos obtener Vo de estas ecuaciones y dividirlo entre Vi! Suena fácil, no? Pues en efecto es muy sencillo siempre y cuando tengas uno de estos aparatitos mágicos llamados computadoras que hacen el trabajo duro por nosotros mientras vemos 9gag o una película. De otro modo se tendrían que "chutar" los despejes y las sustituciones a manita y eso no es de Dios. Pero por suerte nosotros sí poseemos la magia de la tecnología moderna que nos facilitará la vida inmensamente.
Lo primero que tenemos que hacer es abrir Matlab y (lo recomiendo ampliamente) crear un nuevo Script. Tendrán una ventana como la siguiente.


Se parece mucho al Bloc de notas, pero créanme que esto es mucho más cool ;D
Comencemos despejando el terreno y declarando las variables que vamos a utilizar (usamos variables simbólcas, por eso las tenemos que declarar). esto se hace así

    clear
    clc
    syms z1 z2 z3 z4 z5 z6 vi vo v1 v2 v3 r1 r2 r3 r4 c1 c2 s;

Ya que hemos declarado las variables, comencemos con la ecuación del primer nodo.

    %Ecuación del nodo 1
  eq1=((vi-v1)/z1)-((v1-v2)/z2)-((v1-vo)./z4);


De esta ecuación, despejamos v1 para sustituirla en la ecuación del nodo 2. Esto se hace así

    %Despejar v1
  v1=solve(eq1, v1);

Ya que tenemos v1, podemos escribir la ecuación 2 y resolverla para v2 (despejar v2)

    %Ecuación del nodo 2
  eq2=((v1-v2)/z2)-(v2/z3);
   %Despejar v2
  v2=solve(eq2, v2);

Por último, escribiremos la ecuación 3 y la resolveremos para Vo

  %Ecuación del nodo 3
  eq3=(v2/z5)+((v2-vo)/z6);
  %Despejar vo
  vo=simple(solve(eq3, vo))


Nota: la función simple() se utiliza para simplificar funciones simbólicas y que no se vean tan monstruosas.
Si ejecutamos este código, obtenemos lo siguiente

  vo =

  (vi*z3*z4*(z5 + z6))/(z1*(z2*z5 - z3*z6 + z4*z5) + z2*z4*z5 +  z3*z4*z5)


Ahora lo que resta es dividirlo entre Vi y sustituir las reactancias por las resistencias y capacitancias. Esto se hace así


  %Función de transferencia
  Hs=factor(simple(vo/vi))

  %Sustitución por los valores
  z3=r1;
  z4=r2;
  z5=r3;
  z6=r4;
  z1=1/(s*c1);
  z2=1/(s*c2);

  %Función de transferencia final
  disp('La función de transferencia es')
  Hs=collect(simple(subs(Hs)), s);
  pretty(Hs)


La función factor() se utiliza para factorizar lo más posible una función simbólica. La función disp() puede hacer que despliegue tanto un texto como alguna variable, pero no ambas a la vez. La función subs() hace la sustitución de los valores. La función collect() hace factorización por factor común la variable que nosotros indiquemos. Por últmo, la función pretty() hace que se vea bonito (al muy propio estilo de Matlab) una función simbólica.
Si corremos el código completo, lo que matlab nos dirá es

La función de transferencia es

                                                2 
             (c1 c2 r1 r2 r3 + c1 c2 r1 r2 r4) s 
  ----------------------------------------------------------- 
                  2 
  c1 c2 r1 r2 r3 s  + (c1 r2 r3 - c2 r1 r4 + c2 r2 r3) s + r3



Vivaa! Ya tenemos nuestra función de transferencia! :D
En el siguiente Post mostraré como hacerle para que de esta misma función que nos regresa Matlab, podamos dibujar diagramas de bode y demás. 
Si me equivoqué en algo, díganmelo :D
Por cierto, el código usado en Matlab se los dejo aquí. http://bit.ly/IjD7O2

sábado, 24 de marzo de 2012

Cómo obtener la función de transferencia de un circuito utilizando Matlab

Para poder obtener la función de transferencia de un circuito, primero necesitamos el esquemático del circuito. Este primer ejemplo será un circuito RLC Pasa Bajas.


Como las funciones de transferencia son análisis en el dominio de la frecuencia, hay que transformar los componentes a impedancias para poder manipularlos en el dominio de la frecuencia. De este modo, L se convierte en Z1, C se convierte en Z2 y R se convierte en Z3.


Como las inductancias se pueden manipular como si fuesen resistencias, podemos utilizar leyes de Kirchhoff para sacar las ecuaciones del circuito :D
Por definición, la función de transferencia de un circuito es Vo/Vi, por lo que necesitamos encontrar el voltaje de salida en función de los elementos que tiene el circuito. Para esto se utiliza la ley de nodos/corrientes de Kirchhoff, pues ese análisis encuentra los voltajes de nodo. De esta manera se tiene que la corriente que pasa por Z1 es igual a la suma de las corrientes que pasan por Z2 y Z3. Tomando que la tierra está en la parte de abajo del circuito, esto queda así


Para que Matlab pueda resolver correctamente esta ecuación, hay que dejarla igual a cero, por lo que tenemos que


Ahora que ya tenemos la única ecuación del circuito, ya podemos resolverla para Vo utilizando Matlab. Para esto, lo primero que se tiene que hacer es declarar las variables como variables simbólicas, para que pueda hacer el cálculo. Esto se hace de la siguiente manera:

>> syms vi vo z1 z2 z3

Ahora, lo que se tiene que hacer es almacenar en otra variable la ecuación que tenemos. Esto se hace así

>> eq1=(vi-vo)/z1-vo/z2-vo/z3;

Nótese que el ";" al final es únicamente para que no repita lo que le acabo de ingresar (echo off).
Ahora que ya tenemos la ecuación, ya podemos resolverla para Vo utilizando la función solve. Esto se hace así

>> vo=solve(eq1, vo)

La sintaxis básica de esta función es solve(ecuación igualada a cero, variable para la cual se resuelve). Por supuesto que tiene muchas más opciones, pero a nosotros nos interesa usarla así.
Al ingresar esto a Matlab, se obtiene el siguiente resultado

vo =

(vi*z2*z3)/(z1*z2 + z1*z3 + z2*z3)


Este resultado ya es la ecuación resuelta para Vo. Sin embargo, esta aún no es la función de transferencia, pues aún falta dividirla entre Vi. Esto se hace fácilmente de esta manera

>> Hs=vo/vi

Lo que nos regresa 

Hs =

(z2*z3)/(z1*z2 + z1*z3 + z2*z3)



Ahora ya tenemos la función de transferencia en función de las impedancias, pero nosotros la queremos en función de la frecuencia y de los valores de los componentes que forman el circuito. Para esto, sabemos que la impedancia de un inductor es SC, la de un capacitor es 1/SC y la de una resistencia es R. Esta información se le tiene que introducir a Matlab también de manera simbólica y de la siguiente manera:

>> syms r l c
>> syms s
>> z1=l*s;
>> z2=1/(s*c);
>> z3=r;

Sin embargo, en la función de transferencia siguen apareciendo Z1, Z2 y Z3, mas no sus valores. Para sustituir los valores de Z1, Z2 y Z3 en la función de transferencia, hacemos lo siguiente

>> Hs=subs(Hs)

Este comando nos regresa

Hs =

r/(c*s*(l/c + r/(c*s) + l*r*s))



Ahora ya tenemos la función de transferencia. Para verla un poco más clara, podemos utilizar la función simple y pretty. Esto se hace así

>> Hs=simple(Hs);
>> pretty(Hs)

Esto nos regresa

          r 
  ------------------ 
         2 
  c l r s  + l s + r



Con esto ya tenemos nuestra función de transferencia H(s) de un circuito RLC pasa bajas :D
En el siguiente ejemplo veremos cómo obtener la función de transferencia cuando se tiene más de una ecuación.