ia-with-three-oa
Amplificador de instrumentación con 3 AO

Esta disposición de AI se puede separar en dos etapas:

Etapa 1stage-1Por superposición y haciendo el KCL:
\(\)
\[ V_{in_1} = 0 \]
\[R_3 + \alpha R_4 = R_G\]
\[ \frac{V_{in_2}-V_B}{R_5} = \frac{0-V_{in_2}}{R_G}\]
\[V_{in_2}R_G -V_B R_G =-V_{in_2}R_5\]
\[V_B = \left( 1 + \frac{R_5}{R_G} \right) V_{in_2}\]
\[\frac{0 – V_{in_2}}{R_G} + \frac{0 – V_A}{R_2} = 0\]
\[V_A = – \frac{R_2}{R_G}V_{in_2}\]

Ahora con \(V_{in_2} = 0\),

\[\frac{V_{in_1}-0}{R_G} = \frac{0-V_B}{R_5} \]
\[V_{in_1}R_5 =-V_B R_G\]
\[V_B =-\frac{R_5}{R_G}V_{in_1}\]
\[\frac{0 – V_{in_2}}{R_G} + \frac{0 – V_A}{R_2} = 0 \]
\[V_A = \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} \]
Por lo que finalmente, tenemos que:
\[V_A = \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} – \frac{R_2}{R_G}V_{in_2} \]
\[V_B = \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \]
En cuanto a la ganancia en modo común de esta etapa, la podemos calcular haciendo \(V_{in_1} = V_{in_2}\). De esta manera,
\[V_A = \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} – \frac{R_2}{R_G} V_{in_1} = V_{in_1}\]
\[V_B = \left( 1 + \frac{R_5}{R_G} \right) V_{in_1} -\frac{R_5}{R_G}V_{in_1} = V_{in_1}\]
Por tanto, sea cual sea el valor de \(R_2\), \(R_5\) y \(R_G\), la tensión en modo común pasa a los nodos \(V_A\) y \(V_B\).

La otra etapa restante es:
De nuevo, aplicando superposición podemos llegar a la expresión final de la salida.
\[V_{out} = – \frac{R_9}{R_1} V_A + \left(1 + \frac{R_9}{R_1} \right) \frac{\beta R_8 + R_7 }{ \beta R_8 + R_7 + R_6} V_B \]
\[V_{out} = – \frac{R_9}{R_1} \left[ \left( 1 + \frac{R_2}{R_G } \right) V_{in_1} – \frac{R_2}{R_G }V_{in_2} \right]+ \left(1 + \frac{R_9}{R_1} \right) \frac{\beta R_8 + R_7 }{ \beta R_8 + R_7 + R_6} \left[ \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \right] \]

Para calcular la ganancia en modo común de esta etapa vamos a aplicar una tensión igual en las dos entradas diferenciales. Por tanto \(V_A = V_B = V_{CM}\). Así conseguimos la siguiente expresión para la tensión de salida.
\[V_{out} = – \frac{R_9}{R_1} V_{CM} + \left(1 + \frac{R_9}{R_1} \right) \frac{\beta R_8 + R_7 }{ \beta R_8 + R_7 + R_6} V_{CM} \]
También identificaremos \(R_{ref} = \beta R_8 + R_7\) para facilitar las operaciones.
\[V_{out} = – \frac{R_9}{R_1} V_{CM} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} V_{CM} \]
Idealmente, querríamos que esta tensión fuese igual a 0, de manera que el amplificador de instrumentación pudiese rechazar completamente para poder, por ejemplo, eliminar el ruido acoplado en ambas entradas tal y como puede verse en la figura.

CMRR

\[V_{out} = – \frac{R_9}{R_1} V_{CM} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} V_{CM} \]
\[G_{cm} = \frac{V_{out}}{V_{CM} } = – \frac{R_9}{R_1} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} \]
\[G_{cm} = \frac{R_{ref}}{R_{ref}+R_6} – \frac{R_9 R_6}{R_1 R_{ref} + R_1 R_6} \]
Por tanto, resolviendo la ecuación de ganancia en modo común igual a 0, \(G_{cm} = 0\), tenemos que
\[- \frac{R_9}{R_1} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} = 0\]
Ecuación que podemos identificar de la siguiente manera:
\[A = \frac{R_9}{R_1}\]
\[ B =\frac{R_{ref}}{R_{ref}+ R_6}\]
\[ – A + \left(1 + A \right) B = 0 \]
\[-A + B + AB = 0 \]
\[\left( B -1 \right) A = -B \]
\[ A = \frac{-B}{B-1} = \frac{B}{1-B} \]
\[A = \frac{\frac{R_{ref}}{R_{ref}+ R_6}}{1-\frac{R_{ref}}{R_{ref}+ R_6}} = \frac{R_{ref}}{R_6} \]
\[\frac{R_9}{R_1} = \frac{R_{ref}}{R_6} \]
Por tanto, para tener una ganacia en modo común de 0 (o lo que es lo mismo un CMRR\( = \infty\)), \(R_9 = R_{ref}\) y \(R_{1} = R_6\)

Por otra parte, si queremos que \(V_A = V_B\) cuando \(V_{in_1} = V_{in_2}\), necesitamos que se cumpla la siguiente relación entre las resistencias \(R_2\) y \(R_5\).
\[ V_A = V_B \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} – \frac{R_2}{R_G}V_{in_2} = \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \left( 1 + \frac{R_2}{R_G} \right) – \frac{R_2}{R_G} = \left( 1 + \frac{R_5}{R_G} \right) -\frac{R_5}{R_G} \]
Por simple inspección se llega a la conclusión de que \(R_2 = R_5\).

Por último, podemos calcular la ganancia diferencial y la ganancia de modo común de otro modo. Si definimos la tensión diferencial como \(V_d = V_{in_1}- V_{in_2}\) y la tensión en modo común como \(V_c = \frac{V_{in_1} + V_{in_2}}{2}\), sustituimos en la expresión de \(V_o\) e identificamos la expresión resultante como \(V_o = G_d V_d + G_c V_c\), en la que \(G_d\) es la ganancia diferencial y \(G_c\) es la ganancia en modo común (la misma que hemos calculado arriba, obtenemos que \(G_d\) es igual a:
\[ G_d = \frac{-2 R_9 R_G R_{ref} – R_9 R_G R_6 – 2 R_9 R_2 R_{ref} -2 R_9 R_2 R_6 – R_{ref}R_1 R_G – 2 R_1 R_5 R_{ref} – 2 R_9 R_{ref} R_5}{2R_1 R_G \left( R_{ref} + R_6 \right) } \]
En caso de tener las resistencias balanceadas, la expresión de la ganancia diferencial se simplifica a:
\[G_d = -\frac{R_G^2}{R_1 \left( R_9 + R_1 \right)} – \frac{R_9}{2 \left( R_9 + R_1\right)} – \frac{R_9 R_2}{R_G \left( R_9 + R_1 \right)} – \frac{R_9}{2 \left( R_9+ R_1 \right)} – \frac{R_2 R_9}{R_G \left( R_9+ R_1 \right)} – \\ \frac{R_9^2 R_2}{R_1 R_G \left( R_9 + R_1 \right)} \]

Conclusiones

Este amplificador de instrumentación es muy utilizado para amplificar salidas de sensores y demás aplicaciones de instrumentación. Sus ventajas residen en que si está balanceado se puede conseguir tener una ganancia de modo común baja (o CMRR alto) a la vez que se mantiene una ganancia ajustable a través de \(R_G = R_3 + \alpha R_4\). Por último, también podemos ver como la impedancia de entrada de este amplificador es muy alta, ya que ambas entradas son las entradas de un AO.
\[V_{out} = – \frac{R_9}{R_1} \left[ \left( 1 + \frac{R_2}{R_G } \right) V_{in_1} – \frac{R_2}{R_G }V_{in_2} \right]+\left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref} }{R_{ref} + R_6} \left[ \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \right] \]
\[G_d = \frac{-2 R_9 R_G R_{ref} – R_9 R_G R_6 – 2 R_9 R_2 R_{ref} -2 R_9 R_2 R_6 – R_{ref}R_1 R_G – 2 R_1 R_5 R_{ref} – 2 R_9 R_{ref} R_5}{2R_1 R_G \left( R_{ref} + R_6 \right)} \]
\[G_{cm} = \frac{R_{ref}}{R_{ref}+R_6} – \frac{R_9 R_6}{R_1 R_{ref} + R_1 R_6} \]

Enlaces a CircuitLab para simulación



En anteriores entradas he hablado del ESP8266, de cómo configurarlo y cómo introducirnos un poco en el amplio espectro de posibilidades que este pequeño chip nos brinda. No obstante, en la documentación que he publicado falta una parte importante, y esta es la de hardware.

Dado que el pinout del ESP-01 no es apto para conectarlo a una protoboard (a no ser que quieras cortocircuitarlo) decidí hacer un pequeño adaptador para conectar el programador serie (FTDI) y la alimentación, así como añadir un jumper para iniciar el chip en modo programación.

Para ello he utilizado:

  • Tira doble de cuatro pines hembra (o dos tiras simples de cuatro pines hembra), para la conexión del ESP.
  • Tira de 6 pines macho, para la conexión del ESP y salidas de GPIO.
  • Tira de 2 pines hembra, para alimentación.
  • Dos pilas AAA (1.5V cada una)

Estos son los distintos pines disponibles en el ESP-01:

pinout
ESP-01 pinout

Las conexiones que he hecho en mi adaptador son las siguientes:

 

esp-conn
Conexiones adaptador

 

El número de pines corresponde al de los pines del ESP.

El resultado final es este:

programador
Adaptador ESP-01

También decir que la alimentación que utilizo son dos pilas AAA conectadas en serie soldadas (podéis utilizar un portapilas, pero si no tenéis uno, esta opción también puede funcionar):

power
Alimentación a 3V

Mobile IP es un estándar de protocolo comunicación diseñado para permitir a usuarios de dispositivos móviles moverse entre redes manteniendo la misma dirección IP.

Se definen dos tipos de movilidad:

  1. Macro movilidad: el desplazamiento de un móvil se produce entre dos dominios de redes diferentes.
  2. Micro movilidad: el desplazamiento de un móvil se produce entre dos subredes de un mismo dominio administrativo.

Mobile IP está definida en el marco de macro movilidad.

En el estándar Mobile IP se añaden tres nuevas entidades funcionales:

  1. Mobile Node (MN): terminal que cambia de ubicación.
  2. Home Agent (HA): router de la home network que coge los datagramas destinados al Mobile Node y los entrega a través de la care-of address. También almacena información sobre la posición actual del MN.
  3. Foreign Agent (FA): router de una red visitada que ofrece servicios de enrutado al MN mientras el MN es registrado.

MIPMobile IP permite enrutar datagramas IP independientemente de la localización del dispositivo. Cada Mobile Node (MN) es identificado por su Home Address sin importar su ubicación. Mientras está fuera de la home network, se asocia una care-of address al MN que identifica su ubicación actual y la Home Address a la cual está asociado el extremo del tunel de encapsulamiento que conecta con el Home Agent.

En Mobile IP (MIP) se utilizan dos tipos de IP: estáticas y dinámicas.

La estática es la Home Address la que le proporciona la Home Network al dispositivo. Es la IP que siempre va a tener aun cuando el dispositivo salga de la Home Network, por tanto la dirección IP permanente.

La dinámica es la care-of address, la cual es proporcionada por la Foreign Network (FN) de manera que el Home Agent pueda seguir comunicándose con el dispositivo, por tanto la dirección IP temporal.

Por tanto recapitulando, el MN tiene una IP que lo identifica en internet: la Home Address. Sin embargo, cuando el MN cambia a una red externa a la cual tenía asociada la Home Address se le tiene que asignar una IP provisional que le permita al Home Agent reenviarle los datagramas IP que el MN tiene que recibir o transmitir. Por tanto, el Foreign Agent al cual está conectado le proporciona una care-of address. Con esta care-of address el MN se comunica directamente (mediante un encapsulamiento tunel) con el Home Agent. De esta manera, aun cuando el dispositivo no está conectado en la red original se simula que la dirección IP del MN no ha cambiado, ya que el Home Agent está haciendo de proxy.

Otro forma es que no exista exista el Foreign Agent, de manera que el túnel se establece directamente entre el MN y el HA. De esta manera el MN se le asigna una co-located care-of address.Mobile IP

 

Modo de funcionamiento

  1. El MN es el encargado de descubrir si está conectado a su Home Network o se ha movido a una Foreign Network. No son los únicos responsables en este proceso sino que también intervienen la Foreign Agent y el Home Agent. Este proceso se denomina Agent Discovery. Para esto se utiliza una extensión del protocolo ICMP.
  2. El siguiente paso es registrarse en la Foreign Network para obtener la care-of address. Este proceso intervienen tanto el MN, el FA así como el HA, que debe conocer la care-of address del MN registrado es un Home Network. El proceso de registro está formado por dos mensajes, una petición de registro y una respuesta a la petición. De esta manera se informa al HA de la CoA del MN.
  3. Una vez ya están las direcciones asignadas se puede transferir información a través del túnel que conecta el Home Agent y el Foreign Agent.

perfm

Proceso de registro
Proceso de registro

Si el túnel IP solo es unidireccional se crea un problema en el que hay un enrutado triangular que no permite que la IP del Mobile Node sea la misma para recibir que para transmitir. Haciendo el túnel bidireccional se soluciona el problema.

ip_triangular_problemtriangular_problem_solution

Proceso completo de Agent Discovery, Registro y transferencia de datos
Proceso completo de Agent Discovery, Registro y transferencia de datos

Algunas desventajas del Mobile IP es que es necesario incorporar el nodo de Foreign Agent en todas las redes visitadas. También sobrecarga la red al necesitar de peticiones constantes si el MN se mueve. Otra desventaja es que es necesario implementar procesos de autentificación entre el MN y el FA y entre el FA y el HA.

En GPRS y UMTS (2.5G y 3G), GGSN (Gateway GPRS Support Node) actúa como Home Agent y el SGSN (Serving GPRS Support Node) actúa como Foreign Agent.

En 4G el P-GW (Packet data network Gateway) actúa como Home Agent y el SGW (Serving Gateway) actúa como Foreign Agent.

Mobile IPv6

Hasta ahora, todo lo referente a Mobile IP aplicaba para IPv4. Para Mobile IPv6 existen ciertas diferencias.

Por ejemplo, en Mobile IPv6 no existe la entidad de Foreign Agent (FA) ya que ha sido sustituida por el Access Router (AR).

En IPv6 existen 3 entidades funcionales, el Home Agent (HA), el Mobile Node (MN) y el Correspondent Node (CN) que es la dirección de destino de los datos.

En IPv6 el Home Agent sigue haciendo de proxy para evitar el problema del tunelado triangular que hemos explicado anteriormente.

Sin embargo, existe un modo de operación llamado Route Optimization que establece un tunel directo entre el MN alojado en una Visited Network y el CN sin pasar por el Home Agent.

mipv6

En el protocolo OSPF se utilizan diferentes tipos de mensaje para informar a los routers de la composición de la red. Existen 5 tiempos diferentes de paquetes y cada uno de ellos tiene una función diferente:

  • Paquetes hello [Tipo 1]: se utilizan para comunicar a los routers adyacentes de la propia existencia. De esta manera, los routers conocen qué vecinos tienen, por lo que son la base para el intercambio de datos de enrutamiento en OSPF.
  • Paquetes de descripción de la base de datos [Tipo 2]: se utiliza para describir  el contenido de la base de datos de cada router. Sin embargo, no transporta la información que ella contiene.
  • Paquetes de solicitud del estado del enlace [Tipo 3]: se utiliza para solicitar fragmentos específicos de la base de datos del estado del enlace del router vecino. Después de recibir un actualización de la descripción de la base de datos de un vecino, es posible que un router descubra que la información del vecino es más nueva o más completa que la que el mismo posee. Para pedirle al router vecino que se la dé, se utiliza un paquete de solicitud del estado del enlace.
  • Paquete de actualización del estado del enlace [Tipo 3]: se utilizan para transportar realmente los datos de los estados del enlace a los routers vecinos. Exiten 5 tipos de paquetes:
    • LSA de router o Router Link (RL) [Tipo 1]: describen el estado de un interfaz de un router dentro de su área. Cada router genera un aviso de este tipo por cada enlace que tenga.
    • LSA de red o Network Link (NL) [Tipo 2]: es similar a un LSA de router, en la que se informa del coste y el estado del enlace para todos los routers conectados a la red, con la diferencia de que la información del LSA de red es un resumen de toda la información del estado del enlace y coste de la red (LAN) y no solo de sus vecinos. Solo el router designado (DR) puede generarla y seguirla.
    • LSA de resumen-red IP o Summary Link (SL) [Tipo 3]: se utiliza para describir información de alcanzabilidad de redes de otras áreas del mismo sistema autónomo (AS). Son generados por los router fronterizos (Area Border Router, ABR) del área y se transmiten hacia otras áreas. Sirven también para indicar la ubicación del Autonomous System Border Router (ASBR), el cual conecta el sistema autónomo con otro AS externo.
    • LSA de resumen-router límite de sistema autónomo [Tipo 4]: la diferencia entre la LSA de Tipo 3 y la LSA de Tipo 4 es que la LSA de Tipo 3 describre rutas entre áreas y la LSA de Tipo 4 describe rutas que son externas a la red OSPF.
    • LSA de AS externo o External Link (EL) [Tipo 5]: son generados por los ASBR en su AS y hacia otros AS y difundidas por el ASBR dentro del área 0 a través de todas las áreas OSPF a las que pertenece. Sirven para describir información de alcanzabilidad de destinos fuera del propio AS. Estos destinos pueden ser hosts específicos o direcciones de red externas.

Como vemos, el protocolo OSPF es altamente complejo y requiere una cantidad considerable de mensajes para su correcto funcionamiento.

Microsoft Access es un buen programa para gestionar bases de datos ya que nos permite crear fácilmente front-ends. Sin embargo, el mayor problema del que adolece es la inexistencia de una manera sencilla de compartir la base de datos con la que trabaja MS Access.

Para solucionar este problema, es posible crear una base de datos en MySQL y conectarla con MS Access, de manera que sea accesible por más de un usuario y evitar que se corrompa con facilidad. Una de las maneras que se podría implementar es contratando un servidor (Strato, One&One, etc…), pero abrir los puertos de MySQL a cualquier es potencialmente peligroso para el servidor. Por ello, intenté buscar otra solución, y esta es tener un servidor solo accesible desde una red local, por lo que los posibles atacantes no puedan acceder al servidor de ninguna manera.

La manera más sencilla y barata de montar un servidor en casa es utilizando una Raspberry Pi, en la que instalaremos el sistema operativo Raspbian y sobre el cual vamos a hacer las siguientes configuraciones.

Para empezar, necesitamos conectarnos con la Raspberry mediante SSH, por lo que necesitaremos conocer cuál es su dirección IP dentro de la red. Existe una utilidad para Linux llamada arp-scan con la que podremos ver las direcciones IP de todos los dispositivos de la red:

sudo arp-scan --localnet -interface=wlan0

Una vez hayamos localizado nuestra Raspberry y nos hayamos conectado con ella mediante SSH, hay que configurar la asignación de IP’s para estar seguros de que la dirección no va a cambiar cada vez que la enchufemos. Existen cientos de tutoriales que explican cómo hacerlo, por lo que no lo explicaré.

Una vez ya tengamos la Raspberry con una IP estática, vamos a montar el servidor MySQL.

sudo apt-get install mysql-server mysql-client libmysqlclient-dev

Esto requerirá 11.6 MB para archivos + 99.4 MB de espacio adicional. Durante la instalación nos pedirá que introduzcamos la contraseña para el usuario root de MySQL.

Una vez esté instalado vamos a acceder a MySQL de escribiendo el comando:

mysql -u root -p

Una vez estemos en el shell de MySQL, tan solo tendremos que crear la base de datos que queramos:

CREATE DATABASE database_name

Alternativamente, si lo que queremos es importar una base de datos previamente creada, podemos hacer login en MySQL de la siguiente manera:

mysql -u root -p database_name < /path/to/database.sql

Para comprobar que la base de datos se ha creado correctamente, lo más sencillo y cómodo es verlo mediante PHPMyAdmin. Para instarlo:

sudo apt-get install phpmyadmin
sudo php5enmod mcrypt
sudo service apache2 restart

Cuando esté todo configurado e instalado, podemos acceder a PHPMyAdmin poniendo en el navegador la direccion: ip-raspberry/phpmyadmin (e.g. 192.168.1.23/phpmyadmin)

Ahora ya solo queda utilizar la utilidad de MySQL llamada ODBC Driver (Open Data Base Connector) para enlazar la base de datos de MS Access con la que acabamos de crear en MySQL. Para ello podéis seguir los pasos que explican desde la web oficial.

La comunicación I2C es muy útil a la hora de comunicarse con dispositivos de un mismo circuito. Con esta entrada quiero dar un poco de luz a este protocolo que pese a su sencillez es un auténtico misterio a la hora de implementarlo.

Cabe destacar que, atendiendo a la definición del protocolo, la dirección del slave es de 7 bits (del bit 7 al 1). De esta manera el bit 0 se utiliza para decirle al slave si el master quiere leer (bit 0 = 1) o quiere escribir (bit 0 = 1). Es por eso que en el código se utilizan dos direcciones diferentes en función de si se quiere leer o escribir.

El master escribe continuamente “Saludos desde el Master” y después lee 23 bytes del Slave, que devuelve “Por el Slave todo bien”.
Para poder cambiar el número de bytes para leer o escribir desde el master hay que cambiar las variables n_read y n_write. (Si sabéis de algún método mejor, soy todo oídos). La implementación utiliza el propio hardware del PIC (en este caso el PIC16F877) aunque se podría haber hecho mediante software y haber utilizado cualquier pin del procesador. En este caso habría que añadir la opción FORCE_SW en la inicialización del I2C.
NOTA: Solo se puede implementar I2C por software para el master. Para el Slave debe de ser forzosamente hardware.
El código para el master es:


#include "16F877.h"
#device ADC=16
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
 
#use delay(crystal=14745600)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
 
#define SLAVE_WRITE_ADDR 0xA0
#define SLAVE_READ_ADDR 0xA1
 
void write_slave(int address, int *buffer, int n_read){
   int n_byte = 0;
   i2c_start();
   i2c_write(address);
   for(n_byte = 0;n_byte<n_read;n_byte++)
      i2c_write(buffer[n_byte]);
   i2c_stop();
}
 
void read_slave(int address, int *buffer, int n_read){
   int n_byte = 0;
   i2c_start();
   i2c_write(address);
   for(n_byte = 0;n_byte<n_read-1;n_byte++)
      buffer[n_byte] = i2c_read();
   buffer[n_byte] = i2c_read(0);
   i2c_stop();
}
 
void print_buffer(int *buffer, int length){
   int n_byte;
   for(n_byte = 0;n_byte<length;n_byte++)
         printf("%c",buffer[n_byte]);
    printf("\r\n");
}
 
void main(){
   int n_read=23,n_write = 23;
   int writeBuffer[] = {0x53,0x61,0x6c,0x75,0x64,0x6f,0x73,0x20,0x64,0x65,0x73,0x64,0x65,0x20,0x65,0x6c,0x20,0x4d,0x61,0x73,0x74,0x65,0x72}; //"Por el Slave todo bien"
   int readBuffer[23];
   printf("MASTER\r\n");
   while(TRUE){
      write_slave(SLAVE_WRITE_ADDR, writeBuffer, n_write);
      delay_ms(100);
      read_slave(SLAVE_READ_ADDR, readBuffer, n_read);
      print_buffer(readBuffer,n_read);
      delay_ms(100);
   }
}

El Slave lo único que hace es gestionar la llegada de paquetes I2C, tanto de escritura como de lectura. Para entender un poco más el código recomiendo leer la documentación del PIC C Compiler (CCS) (pulsando F1), donde explica con detalle las diferentes funciones que se utilizan.

Faltan añadir algunas mejores en el Slave para recibir un número flexible de bytes. Ahora solo imprime los datos por consola (RS232) cuando se envían el número exacto de bytes descritos en max_written.

El código del Slave es:

#include "16F877.h"
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#device ADC=10
#use delay(clock=14745600)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3,FAST=100000, address=0xA0,FORCE_HW) 
#use spi(DI=PIN_A0, DO=PIN_A1, CLK=PIN_A2, ENABLE=PIN_A3, BITS=16)
  
 int max_read = 23,max_written = 23;
 int writeBuffer[] = {0x50,0x6F,0x72,0x20,0x65,0x6C,0x20,0x53,0x6C,0x61,0x76,0x65,0x20,0x74,0x6F,0x64,0x6F,0x20,0x62,0x69,0x65,0x6E};
 
#int_SSP 
void i2c_interrupt() {
   int state;
   //Get state 
   int readBuffer[23]; 
   state = i2c_isr_state(); 
   if(state==0) //Address match received with R/W bit clear, perform i2c_read( ) to read the I2C address. 
      i2c_read(); 
 
   else if (state==0x80) //Address match received with R/W bit set; perform i2c_read( ) to read the I2C address, and use i2c_write( ) to pre-load the transmit buffer for the next transaction (next I2C read performed by master will read this byte). 
      i2c_read(2); 
 
   if(state>=0x80){ //Master is waiting for data    
      i2c_write(writeBuffer[state - 0x81]); //Write appropriate byte, based on how many have already been written 
      if ((state-0x80)==max_written){
         //printf("\nFull data sent\r\n");
      }
   } 
   else if(state>0){ //Master has sent data; read. 
      readBuffer[state - 1] = i2c_read(); //LSB first and MSB secound 
      if (state==max_read){ 
         for(int i = 0;i<max_read;i++)
            printf("%c",readBuffer[i]); 
         printf("\r\n");
      } 
   }
} 
 
void main() {
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   printf("SLAVE\r\n");
   while(1){
 
   } 
}

El código ha sido depurado y probado utilizando Proteus 8, así que os aseguro que el código funciona, aunque si vais a copiar y pegarlo, os recomiendo que os hagáis vuestra propia cabecera y solo copiéis las funciones.

Captura de pantalla (8)

Podemos construir un filtro paso banda de muchas maneras, pero la mayoría se basan en el mismo concepto: un filtro paso alto + un filtro paso bajo. Si lo queremos hacer de primer orden, a parte de que no podremos tener amplificación, necesitaremos inductores, que suelen ser grandes, caros o con un poco de complejidad para construir. Sin embargo, si optamos por un filtro paso banda activo de segundo orden, solo necesitaremos un amplificador operacional, condensadores y resistencias. Existen varias tipologías de filtros paso banda activos, pero hay una en particular, con realimentación multiple que tiene la ventaja de conseguir factores de calidad Q relativamente altos (~25). Podéis revisar algunos conceptos básicos en la entrada de Filtros paso bajo.

Esquemático

La configuración del filtro paso banda con realimentación multiple es la siguiente:

multiple-feedback-band-pass-active-filter
Filtro paso banda activo con realimentación multiple

En el esquemático podemos identificar cuatro tensiones nodales \(v_{in}\), \(v_o\).

Análisis

Haciendo el KCL en \(v_x\) obtenemos la ecuación:
\[\left( v_{in} – v_{x} \right) G_1 – \left( v_x – v_n \right) sC_2 – \left(v_x – v_o \right)sC_1 = 0\]
Dado que tenemos realimentación negativa podemos realizar la hipotesis de que \(V_n = V_p = 0\), por lo que la ecuación resultante es:
\[v_{in} G_1 – v_{x} G_1 -v_x sC_2 -v_x sC_1 +v_o sC_1 = 0\]
Del mismo modo, haciendo el KCL en \(v_n\):

\[\left( v_{x} – v_{n} \right) s C_2 – \left( v_{n} – v_{0} \right) G_2 = 0\] \[v_{x} s C_2 + v_{0} G_2 = 0\] \[v_x = \frac{-v_o G_2}{s C_2}\]

Con estas dos ecuaciones tenemos completamente definido el circuito. Podemos escribirlo en forma matricial como:
\[\begin{bmatrix} G_1 + sC_2 + sC_1 & -sC_1\\ sC_2 & G_2 \end{bmatrix}\begin{bmatrix} v_x \\ v_o \end{bmatrix}=\begin{bmatrix} v_{in}G_1\\ 0 \end{bmatrix}\]
Por lo que finalmente podemos calcular la función de transferencia, que tiene la siguiente expresión:
\[H(s) = \frac{v_o}{v_{in}} = \frac{- s \frac{1}{R_1 C_1}}{s^2 + s \left( \frac{1}{C_1 R_2} + \frac{1}{C_2 R_2} \right) + \frac{1}{C_1 C_2 R_1 R_2}}\]
de la que identificando con la expresión genérica podemos extraer los valores de \(f_0\), BW y Q:

\[T(s) = \frac{K s \omega_0}{s^2 +\underbrace{ 2 \zeta \omega_0}_{BW(rad/s)} + \omega_0^2}\] \[f_0(Hz) = \frac{1}{2 \pi \sqrt{R_1 R_2 C_1 C_2}}\] \[BW(Hz) = \frac{1}{2\pi} \left( \frac{C_1 +C_2}{C_1 C_2 R_2} \right)\] \[Q = \frac{f_0}{BW}=\sqrt{\frac{C_1 C_2 R_2}{C_2}} \left( C_1 +C_2 \right)\]

Diseño

Vamos a diseñar un filtro paso banda con una frecuencia central de 800 Hz y un ancho de banda 200 Hz. Para ello, fijamos los valores de los condensadores a un valor razonable \(R_2\). Para ello podemos hacerlo a mano o utilizar MATLAB:

%  Calculo de R2
syms R2;
C1 = 100E-9;
C2 = 100E-9;
eqn = 1/(2*pi) * ((C1+C2)/(C1*C2*R2)) == 200
solR2 = solve(eqn,R2)
	solR2 = 1.5915e+04 
%  Calculo de R1
f0 = 800;
syms R1;
eqn2 = 1/(2*pi * sqrt(R1 * R2 * C1 * C2)) == 800;
solR1 = solve(eqn2, R1)
	solR1 = 248.6796

El valor calculado para \(R_1 = 248.67~\Omega\) y \(R_2 = 15~k\Omega\).

Evaluación

Vamos a comprobar que los valores escogidos son correctos. Para ello, podemos simular con MATLAB la función de transferencia y dibujar su diagrama de Bode o de una manera más rápida y sencilla, utilizar CircuitLab.

Si lo queremos hacer con MATLAB el procedimiento es el siguiente:

%  Calculamos la función de transferencia
T = tf([-1/(R1*C1) 0],[1 (1/(C1*R2)+1/(C2*R2)) 1/(C1*C2*R1*R2)]);
%  Generamos el eje de coordenadas
w = logspace(0,5, 10000);
%  Mostramos el diagrama de Bode de la función de transferencia
bodemag(T,w);
grid;

El resultado es el siguiente:

Diagrama de Bode del filtro paso banda con realimentación multiple
Diagrama de Bode del filtro paso banda con realimentación multiple

(Al hacer la gráfica, tened en cuenta que por defecto el eje de coordenadas está en radianes/s)

Como vemos el pico de resonancia está alrededor de los 800 Hz y tiene un ancho de banda aproximado de 200 Hz. Los valores no se ajustan perfectamente porque he elegido las resistencias comerciales y no son los valores exactos que deberían ser, pero la aproximación es bastante buena.

Si lo queremos simular con CircuitLab, tiene la ventaja de que también tiene en cuenta efectos no previstos por la función de transferencia al contemplar las no idealidades del amplificador de instrumentación que elijamos. El efecto más notorio que se puede observar es que la ganancia no es tan alta como la predicha por la función de transferencia en MATLAB. Podéis acceder al circuito desde CircuitLab

Diagrama de Bode de magnitud y fase con CircuitLab
Magnitud del diagrama de Bode de magnitud con CircuitLab
Diagrama de Bode de fase con CircuitLab
Fase del diagrama de Bode con CircuitLab

LPCXpresso es un IDE de la compañia NXP (antiguamente Philips Semiconductors) basado en Eclipse y que nos permite programar placas de desarrollo de una manera muy sencilla. En la web no hay demasiada información pero sí son muy útiles los ejemplos que hay en las librerías. En mi caso utilizo la placa de desarrolo LPC11U68 con un ARM M0+ (el ARM con menor consumo de los que existen).

M-07710

ARM tiene por defecto un contador llamado SysTick, muy fácil de configurar pero que ofrece poca flexibilidad a la hora de programar. Además el M0+ (desconozco si el resto también) solo cuenta con un contador SysTick. Por este motivo si necesitamos de más de 1 timer en nuestra aplicación deberemos recurrir a los contadores internos del microprocesador. En nuestra caso contamos con 2 contadores de 16 bits y otros dos contandores de 32 bits. El código está comentado y es muy fácil de entender. En caso contrario siempre puedes acudir al datasheet del procesador para entender cómo funciona internamente.

/**
 * @brief	Initialize 32 bits timer for 5 Hz
 * @param	void
 * @return	nothing
 */
void initialize_timers(void){
	uint32_t timerFreq;
        //Inicia el CLK en IOCON para poder modificar las funciones de los pines y en CT32B0 (timer de 32 bits)
        LPC_SYSCTL->SYSAHBCLKCTRL |= (1<<9);
	timerFreq = Chip_Clock_GetSystemClockRate();
	Chip_TIMER_Init(LPC_TIMER32_0);	               //Inicializa el timer CT320 para los 5 Hz
	Chip_TIMER_Init(LPC_TIMER16_0);		       //Inicializa el timer CT160 para los 10 ms
	Chip_TIMER_Reset(LPC_TIMER32_0); 	       //Hace un reset para eliminar configuraciones anteriores
	Chip_TIMER_Reset(LPC_TIMER16_0);	       //Hace un reset para eliminar configuraciones anteriores
	Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 1);   //Configura el valor al que salta la interrupción
	Chip_TIMER_MatchEnableInt(LPC_TIMER16_0, 1);   //Configura el valor al que salta la interrupción
	//Chip_TIMER_PrescaleSet(LPC_TIMER16_0, PRESCALE_HZ2);  //Preescalado para el timer de 16 bits
        Chip_TIMER_SetMatch(LPC_TIMER32_0, 1, (timerFreq / (TICKRATE_HZ5*2)));	//Configura la duración del timer (0.2 s)
	Chip_TIMER_SetMatch(LPC_TIMER16_0, 1, (timerFreq / (TICKRATE_HZ100*2)));//Configura la duración del timer (10 ms)
	Chip_TIMER_ResetOnMatchEnable(LPC_TIMER32_0, 1);//Configura para que el timer sea cíclico
	Chip_TIMER_StopOnMatchEnable(LPC_TIMER16_0, 1);	//Configura para que el timer no sea cíclico
        Chip_TIMER_Enable(LPC_TIMER32_0);		//Activa el timer
	NVIC_ClearPendingIRQ(TIMER_32_0_IRQn);		//Borra interrupciones pendientes del timer
	NVIC_ClearPendingIRQ(TIMER_16_0_IRQn);		//Borra interrupciones pendientes del timer
	NVIC_EnableIRQ(TIMER_32_0_IRQn);		//Activa la interrupción del timer
	NVIC_EnableIRQ(TIMER_16_0_IRQn);		//Activa la interrupción del timer
}

Un timer, el de 32 bits, saltaría cada 0.2 s (5 Hz) y el otro acabaría a los 100 ms una vez se inicie.

Por razones de mi aplicación el timer de 16 bits no lo activo inmediatamente ni lo configuro para que sea cíclico, si no que es el propio timer de 32 bits el que inicia el de 16.

Para desactivar y activar un timer lo podemos hacer mediante la funcion

Chip_TIMER_Enable(LPC_TIMER16_0);

Por último, para cazar una interrupción deberemos utilizar el siguiente código:

void TIMER32_0_IRQHandler(void){
	if (Chip_TIMER_MatchPending(LPC_TIMER32_0, 1)) {
		Chip_TIMER_ClearMatch(LPC_TIMER32_0, 1);
		//Resto de código...
	}
}
 
void TIMER16_0_IRQHandler(void)
{
	if (Chip_TIMER_MatchPending(LPC_TIMER16_0, 1)) {
		Chip_TIMER_ClearMatch(LPC_TIMER16_0, 1);
                //Resto de código...
	}
}

La precisión para timers de la frecuencia de kHz es muy buena. Como veis, configurar un timer es mucho más complejo que el SysTick, pero con esta receta solo es cuestión de copiar, pegar y editar la frecuencia entre interrupciones.

Introducción

En esta entrada se pretende explicar de forma breve las distintas etapas que componen el receptor de 27 MHz con etapa de amplificación incluida. El receptor utiliza un mezclador conmutante NE602 para implementar la estructura heterodina. El front-end del receptor consta de 4 partes: etapa receptora, etapa mezcladora, oscilador y etapa amplificadora.

Etapa receptora

La señal de entrada vendrá por una línea de transmisión con una impedancia característica de 50 Ω. En cambio la impedancia de entrada del integrado NE602 es de 1500 Ω. Para que la línea de transmisión vea una impedancia de entrada de 50 Ω, podemos utilizar un transformador. También será necesario añadir un condensador para anular la impedancia del inductor del primario. Será necesario ajustar el valor del condensador de manera que a la frecuencia de trabajo, inductor y condensador no influyan en el circuito.

Etapa mezcladora

La etapa mezcladora se implementa con un NE602 que tiene una estructura de tipo Gilbert. Aprovecha los productos de intermodulación que aparecen en las series de Fourier al multiplicar una señal por una señal cuadrada. El NE602 cuenta con una entrada y una salida diferencial, de la cual se prescinde para simplificar. La señal de salida, en el pin 4, la forman una señal continua y dos senoides de diferente amplitud a frecuencia f_{ol}-f_{in}

y f_{ol}+f_{in}

.

La señal que buscamos es la de frecuencia f_{ol}-f_{in}

, ya que la frecuencia del oscilador local será aproximadamente 27.01 MHz y la de la señal de entrada 27 MHz. Por tanto, la señal a f_{ol}-f_{in}

está en 10 kHz.

Oscilador

El NE602 tiene en su interior un transistor BJT NPN cuya base es accesible a través del pin 6 y su emisor a través del pin 7. Es por ello que se construye un oscilador Colpitts a 27.01 MHz. Este tipo de oscilador destaca por utilizar un cristal de cuarzo trabajando en el tercer sobretono y que su configuración no es estricta en ninguno de sus elementos. Solo hay que tener en cuenta que el pico de resonancia del circuito tanque (L1 y C3) debe estar por debajo de los 27 MHz y por encima de los 9 MHz para asegurar que el cristal opera en el tercer sobretono.

Etapa amplificadora

La etapa amplificadora utiliza un amplificador operacional en su forma de amplificador no inversor. Cabe destacar que el amplificador opera con alimentación unipolar y es por ello que se han añadido el condensador C10 y C14 así como las resistencias R6 y R7. Con el condensador C10 se pretende eliminar el nivel de continua que tiene la señal a la salida del mezclador. Después con el divisor de tensión entre R6 y R7 se añade a la señal una tensión en continua de 4.5 V. De esta manera la excursión de la amplitud de la señal es máxima. Para finalizar la configuración unipolar, hay que evitar amplificar la tensión continua. Para ello el condensador C14 se comporta como un circuito abierto a frecuencia 0, convirtiendo el amplificador no inversor en un seguidor de tensión solo en continua.

Se puede apreciar que la amplificación de la etapa se puede variar con el potenciómetro R5. Así, la amplificación podrá estar en un rango de entre 48 y 318.

Por último, la etapa amplificadora también actúa como filtro paso bajo. Es por ello que se añade el condensador C13, atenuando así las señales de intermodulación a frecuencias más altas provenientes del mezclador.

Conversor lineal

Como la alimentación disponible es de 9 V y el NE602 se alimenta con 5V, es necesario utilizar un conversor lineal.

También es recomendable utilizar un conversor lineal de tensión para evitar posibles rizados en la tensión de alimentación que induzcan a distorsiones en la salida del mezclador aunque el valor nominal de la alimentación sea el deseado.

Dimensionado de valores

C7: según las notas de aplicación del fabricante se recomienda un valor de 0.33 µF.

C9: se utiliza para evitar variaciones de tensión y actúa como la verdadera fuente de alimentación. Es por ello que cuanto mayor sea su capacidad mejor, por ejemplo 10 µF.

C10: se utiliza para bloquear la tensión continua. Debe ser un cortocircuito a la frecuencia de trabajo, por tanto:

eq1

C6: se utiliza para no modificar la polarización interna del NE602. A la frecuencia de trabajo debe comportarse como un circuito abierto. En este caso, se trabaja a 27 MHz, por tanto puede ser de una capacidad bastante menor que C10. Podría servir 1 nF.

C2: mismo criterio que C6. Si no estuviera C2, en continua el pin 6 estaría conectado a masa. De esta manera podría alterarse el funcionamiento del mezclador por haber modificado su polarización.

L1 y C3: sus valores no son críticos. Solo hay que tener en cuenta que la frecuencia de resonancia del pico del tanque debe estar por debajo de 27 MHz y por encima de 9 MHz. Dado que es más complicado hacer una bobina que comprar un condensador variable, se recomienda fijar un valor de inductancia y buscar un condensador que satisfaga la expresión:

eq2

 

Debería tenerse en cuenta antes de elegir un valor de inductancia los valores de condensadores variables comercialmente disponibles.

El circuito equivalente con estos valores sería:

¿Qué podemos hacer si queremos obtener una tensión de 50V a partir de una de 100V? Quizá una de las respuestas más inmediatas sea utilizar un divisor resistivo, pero es evidente que la eficiencia del sistema es más bien escasa. ¿Y si queremos obtener una tensión de 100V a partir de una de 50V? Para hacer este tipo de ajustes, se utilizan fuentes conmutadas. Estas son las responsables de que actualmente los cargadores de móvil (por poner un ejemplo) sean tan pequeños, en comparación a los de hace unos años, que tenían un peso y unas dimensiones considerables.

Las fuentes conmutadas, a su vez, utilizan el principio de las bobinas a no poder cambiar bruscamente su corriente. De esta manera se puede conseguir aumentar o disminuir una tensión con una eficiencia superior al 90%. Existen 3 tipos de conversores DC-DC:

  • Buck: son aquellos que son capaces de reducir una tensión de entrada. Si aplicamos 100V a la entrada de un conversor, podemos conseguir una tensión menor sin sufrir las pérdidas inherentes del divisor resistivo.
  • Boost: son capaces de generar tensiones superiores a las de entrada. De esta manera podriamos pasar una señal de 3V a 5V sin necesidad de fuentes de alimentación adicionales.
  • Buck-boost: el nivel de conversión de estos es variable y pueden conseguir tanto ganancias menores que uno como superiores a la unidad.

Un ejemplo un poco más complejo de conversor buck-boost habitual es el conversor Ćuk (pronunciado como Chook). Consta de 2 condensadores y 2 inductores, un transistor y un diodo. La principal ventaja respecto a los buck-boost más sencillos es que el rizado de tensión a la salida es menor.

La disposición del circuito es la siguiente:

cuk-converter
Conversor ĆUK buck-boost

Ganancia

Para analizar circuitos de potencia, hay que fijarse en los parámetros que pueden cambiar bruscamente para cada componente: la tensión en las bobinas, la corriente en los condensadores.

Con el interruptor en la posición 1:
\[v_{L_1} = V_g\]
\[v_{L_2} = -V_1 – V_2\]
\[i_{C_1} = i_2\]
\[i_{C_2} = i_2 – \frac{V_2}{R}\]
Con el interruptor en la posición 2:
\[v_{L_1} = V_g – V_2\]
\[v_{L_2} = – V_2\]
\[i_{C_1} = i_1\]
\[i_{C_2} = i_2 – \frac{V_2}{R}\]
Por tanto, la forma de las señales en el conversor Ćuk son:

Señales en el conversor CUK
Señales en el conversor CUK

En régimen estacionario, el valor medio de todas las tensiones y corrientes debe ser cero (de lo contrario indicaría que no estamos en regimen estacionario). Por tanto:
\[v_{L_1} = V_g DT_s +\left(V_g-V_1\right)D’T_s = 0\]
\[v_{L_2} = \left(-V_1 – V_2\right) DT_s+ V_2 D’T_s = 0\]
\[i_{C_1} = I_2 DT_s +I_1 D’T_s = 0\]
\[i_{C_2} = i_2 + \frac{V_2}{R} = 0\]
A la hora de definir las ecuaciones es importante tener en cuenta si se toma el valor sin modificar el signo o si por lo contrario se calcula a partir del area. En caso de coger el valor sin modificar el signo, la suma de ambos debe ser 0. Sin embargo, si se escoge el area, la resta de las dos areas debe ser 0. En este caso he optado por la forma más genérica que es tomar los valores conforme están, sin cambiar signos. Tened cuidado en este paso porque si se mezclan ambos procedimientos simplemente las expresiones no cuadran.

Resolviendo el sistema de ecuaciones, obtenemos:
\[V_1 = \frac{V_g}{D’}\]
\[V_2 =-\frac{D}{D’}V_g\]
\[I_1 = \left(\frac{D}{D’}\right)^2V_g\]
\[I_2 = -\frac{D}{D’}\frac{V_g}{R}\]
Como podemos observar, la ganancia del sistema es \(\frac{V_2}{V_g} = \frac{D}{1-D}\). Si lo reprensentamos en función de D, vemos perfectamente que el conversor pertenece a la clase buck-boost, ya que teóricamente es capaz de tener cualquier ganancia entre 0 y 1.

Ganancia conversor DC-DC Cuk

Como se puede esperar de una función del tipo \(\frac{x}{1-x}\), cuando nos aproximamos al 1 tiende a infinito.

Rizado de tensión y corriente

Por último falta calcular la magnitud del rizado de las tensiones y corrientes. Ello nos ayudará a escoger los valores de inductancia y de capacidad. Para calcularlos simplemente utilizamos la propiedad de corriente en un inductor y de tensión en un condensador:
\[\frac{di\left(t\right)}{dt} = \frac{v\left(t\right)}{L}\]
\[\frac{dv\left(t\right)}{dt} = \frac{i\left(t\right)}{C}\]
Como conocemos estos valores, podemos calcular la corriente en las bobinas y la tensión en el condensador fácilmente.

Durante el primer subintervalo, los valores son:
\[\frac{di_1\left(t\right)}{dt} = \frac{v_1\left(t\right)}{L} = \frac{V_g}{L_1}\]
\[\frac{di_2\left(t\right)}{dt} = \frac{v_2\left(t\right)}{L} = \frac{-V_1-V_2}{L_2}\]
\[\frac{dv_1\left(t\right)}{dt} = \frac{i_{c_1}\left(t\right)}{L} = \frac{I_2}{C_1}\]
Sabiendo la derivada, sabemos la pendiente, por lo que tendrían un aspecto parecido al siguiente:

Rizado de tensión y corriente
Rizado de tensión y corriente

Sabiendo la pendiente y cuánto tiempo dura, podemos calcular la variación máxima. Como la forma del rizado debe ser simétrica, podemos calcularlo como la pendiente (V/s o A/s) por el tiempo DTs (s). Como queremos el rizado de pico y no el rizado pico a pico, tenemos que dividir por 2. Luego reordenando términos para dejarlo en función de los parámetros conocidos:
\[\Delta i_1 = \frac{V_g D T_s}{2L_1}\]
\[\Delta i_2 = \frac{-V_1-V_2}{2L_2}\cdot D T_s = \frac{V_g D T_s}{2L_2}\]
\[\Delta v_1 = \frac{I_2}{2C_1}\cdot D T_s = \frac{V_g D^2 T_s}{2 D’ R C_1}\]
Como vemos, falta el rizado más importante, que es el rizado de la tensión de salida. Sin embargo no podemos aplicar el mismo procedimiento para calcularlo, ya que el resultado es que el rizado es 0. Esto ocurre en todos los conversores con dos polos en la función de transferencia del filtro paso bajo. En estos casos, la única componente que entrega corriente al condensador viene de la bobina. Por tanto vamos a estudiar con detenimiento como es la corriente del condensador sabiendo como es la de la bobina L2.

La forma del rizado de corriente será el mismo que el del inductor. Sin embargo, no tendrá componente continua. ¿Por qué? Porque el condensador está en paralelo con una resistencia, con lo que si suponemos que el condensador está bien diseñado como para tener una impedancia mucho mayor a frecuencias bajas, toda la componente continua la absorbería la resistencia y el condensador se quedaría con el rizado. Tiene sentido, ¿no?

Ahora bien, para calcular la tensión del condensador a partir de su corriente, solo tenemos que integrar.

ripple-out-cuk(2)

Cuando la corriente en el condensador es positiva, la carga que almacena aumenta. Esta carga la podemos expresar de dos manera: utilizando la corriente y utilizando el valor de tensión:
\[q = C \left( 2 \Delta v \right)\]
\[q = \frac{1}{2} \Delta i_L \cdot \frac{T_s}{2}\]
Igualando las ecuaciones, finalmente conseguimos una expresión para el rizado de la tensión de salida:
\[\Delta v = \frac{\Delta i_L T_s}{8 C}\]
Y esta es toda la información que necesitamos para poder dimensionar un convertidor DC-DC buck-boost Ćuk. Sabiendo cuál es rizado máximo que queremos a la salida, podemos obtener todos los valores. El procedimiento que se ha aplicado para calcular los parámetros es perfectamente extrapolable a cualquier otro convertidor, así que solo necesitaréis particularizar las formas de tensión y corriente para conseguir analizar completamente un de estos circuitos.