jueves, 3 de diciembre de 2015

Interfaz PSoC 5 - FPGA

Interfaz PSoC 5LP con FPGA

Saludos lectores, en esta entrada les hablaremos sobre un proyecto de la clase de Electrónica II.

Introducción:

Algunos dispositivos electrónicos no pueden leer señales analógicas, y la mayoría de los sensores manejan a su salida este tipo de señales, por lo que es útil tener algún dispositivo externo para convertir señales analógicas a digitales para poder manejarlas.

Objetivo: Interfaz entre PSoc y FPGA.

Leer la señal de un sensor de temperatura LM35 con ayuda del PSoc  5LP y transmitir esa información a una tarjeta FPGA (Basys 2) la cual leerá esa información y mostrara la temperatura.

Procedimiento:

Crear un nuevo proyecto en el PScoC Creator, seleccionando “PSoC 5LP Design”
Seleccionar nuestro dispositivo correspondiente.

Agregar al diseño esquemático lo siguiente.
Convertidor Analógico-Digital (SAR ADC, en este caso)
Un control de registros (“Control Register”)
Un Pin análogo (“Analog Pin)
Varios Pines Digitales (se pueden configurar Digital Input/Output)

Conexiones.
Conectar el pin análogo a la entrada del ADC.
(Esto es para mandar la señal del sensor al pin analógico y de ahí conectarlo a nuestro ADC del PSoc. El ADC deberá estar configurado en 8 bits (Como se muestra en la figura 1).

Figura 1 – Configuración de ADC con 8 Pines.

Configurar el control de registros con 8 pines (Como se aprecia en la figura 2).

Figura 2 – Control de registros con 8 salidas.

Conectar los pines de salida del control de registros a los pines digitales, pero aquí tenemos que tomar en cuenta que la salida normal de los pines digitales (un HIGH) es de 5V, y como en este proyecto usaremos una FPGA que solo admite en sus entradas 3.3V tenemos que adecuar esas salidas. Lo que se aplicó en este ejemplo fue configuras la salida de los pines referenciados (como se puede observar en la figura 3), para esto ocupamos otro pin analógico conectado 3.3V.

Figura 3 – Salidas de pines digitales referenciadas.

Ya con todo conectado podemos observar el esquema completo (figura 4) donde el LM35 fue solamente ilustrativo para que se aprecien mejor las conexiones, y por comodidad, configuramos los pines digitales con dos pines (figura 5), el orden de las conexiones de la salida del control de registros lo adecuamos para que concuerde con en el orden del programa en la Basys 2 (en este caso el bit más significativo era el pin 12(0) en el PIN_2) 


Figura 4 – Esquema completo

Figura 5 – Numero de pines 2
Código.
En esta parte lo más importante es leer una variable “N” que será el valor de bits de 0 a 255, pero como la salida máxima del LM35 es de 1.5V agregamos en el código una ganancia para que el rango vaya de acuerdo al de nuestro ADC que es de 0 a 5 V es decir de 0 a 255 bits. El código empleado se puede observar en la figura 6.

Figura 6 – Código empleado para el programa

Ya finalizando las pruebas en protoboard y verificando que todo funcione correctamente procedimos a realizar la placa fenólica, la interfaz ya conectada y funcionando se puede apreciar en la figura 7.

Figura 7 – Interfaz conectada y funcionando

Es importante mencionar que a la hora de realizar las pruebas, probando las salidas del control de registros, nos encontramos con un detalle que causaba problemas, la salida del Pin 12(6), sin importar el orden que le diéramos, sacaba mal el voltaje, es decir colocando en el código que el ADC escribiera 0 bits, deberíamos tener 0V en las 8 salidas, pero ese pin ya mencionado sacaba .4V y en el momento de probar que escriba 255 bits donde deberíamos ver  las 8 salidas en 3.3V  ese mismo pin mostraba 3.9V y como ya habíamos mencionado eso nos causaría problemas en el FPGA,  lamentablemente no logramos encontrar a que se debía esta variación, así que la solución que se le dio fue conectarle en serie un diodo (que consume aproximadamente .7V) para atenuar ese voltaje de 3.9V y una resistencia a tierra, para evitar ruidos y problemas que causaría tenerlas conectadas al aire, entonces después del diodo, conectamos la salida de ese pin y de ahí a la Basys 2.

Aquí les dejamos un vídeo del proyecto funcionando.



jueves, 19 de noviembre de 2015

Tutorial-Generar una melodía con Psoc Creator


Saludos lectores, en esta entrada les enseñaremos el procedimiento de como logramos reproducir una melodía con ayuda del microcontrolador Psoc Cy8ckit-059.

Antes de empezar debemos tener en claro como se representa el sonido físicamente. El sonido es una onda de presiones en la cual el tono de dicho sonido dependerá de la frecuencia de la onda, su volumen de la amplitud y el timbre de la forma de la onda.

Al procesar sonidos de manera eléctrica, se debe utilizar una señal analógica como si fuera la señal de presiones del sonido ya que ésta se convertirá en una onda de sonido al pasar por algún amplificador o bocina.  

Para empezar necesitamos generar una señal en la cual debemos ir variando su frecuencia y su duración para generar la melodía. Para eso utilizamos en el Psoc Creator un generador de onda "WaveDAC8".

Como solo utilizaremos una onda de salida debemos colocar un "0" lógico en el pin "ws", además tendremos que declarar un pin de salida para la onda generada.

La configuración del "WaveDAC8" es la siguiente:
Configurando un Clock externo para poder ir variando las frecuencias. Las variables de forma de la onda, amplitud y número de muestras pueden variar y eso no afectará a la melodía más que en el "timbre" del sonido.

Después debemos colocar diversos Clocks a un Multiplexor Digital, configurado con las entradas que sean necesarias, que nos permitirá switchear éstos.

La frecuencia de cada Clock dependerá de la nota que se quiera generar, por ejemplo:
La frecuencia de una nota "La" es de 440 Hz, y sabemos que la frecuencia de salida de la onda será la frecuencia de muestra (dada por el Clock) entre el número de muestras (120 en nuestro caso), entonces haciendo un pequeño cálculo llegamos a que el Clock deberá tener una frecuencia de 52.8 kHz para que la nota de sálida sea ese "La".

A continuación hay un gráfico que muestra las frecuencias de las notas musicales en diversas escalas.  

Cabe señalar que con éste microprocesador tenemos la limitante de que solo podemos utilizar 8 Clocks a la vez ya que en una Octava musical hay 12 tonos diferentes lo que nos límita a solo poder tener 8 tonos diferentes.

Por último necesitamos controlar el multiplexor, para esto haremos uso del componente "Control Register" configurado a 3 salidos en modo "Bus". 


La conexión final correspondiente a este proyecto es la siguiente:

El código utilizado, el cuál ya tiene programada una pequeña parte de una canción del videojuego de The Legend of Zelda, es el siguiente:

#include <project.h>

int main()
{
    CyGlobalIntEnable;  
    Wave_Start();
    float negra;
    negra=700;
    
    for(;;)
    {
    Wave_Enable();
    Control_Write(7);
    CyDelay(negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(4);
    CyDelay(1.75*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(0);
    CyDelay(.25*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(0);
    CyDelay(.25*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(1);
    CyDelay(.25*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(2);
    CyDelay(.25*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(3);
    CyDelay(.25*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(4);
    CyDelay(2.5*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
     Control_Write(4);
    CyDelay(.5*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(4);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(5);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(6);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(7);
    CyDelay((2+1/3)*negra);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(7);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(7);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(6);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(5);
    CyDelay(negra/3);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(6);
    CyDelay(negra*.75);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(5);
    CyDelay(negra*.25);
    
    Wave_Stop();
    CyDelay(10);
    
    Wave_Enable();
    Control_Write(4);
    CyDelay(negra*2);
    
    Wave_Stop();
    CyDelay(10);
    }
}

Entre nota y nota agregamos el código:

Wave_Stop();
 CyDelay(10);
Wave_Enable();

Para poder separar los sonidos pues sin ese pequeño paro en la onda, algunas notas se escuchan como una sola.
  

viernes, 6 de noviembre de 2015

AMPLIFICADOR ELECTRÓMETRO MEJORA PRECISIÓN MIENTRAS REDUCE EL 
TAMAÑO DE INSTRUMENTOS DE ANÁLISIS QUÍMICO


El circuito integrado ADA4530-1  en un amplificador operacional electrómetro. Este amplificador operacional permite obtener el mayor nivel de precisión de datos en instrumentos de análisis químicos en un amplio rango de temperaturas.
Este logra esto con una entrada de sesgo de corriente 20 veces mas bajo que los dispositivos de la competencia. Esta característica hace que este OPAMP sea perfecto para trabajar junto con sensores que son sensibles a  cargas de salida
y  otros sensores al impedancia de salida.

Las principales características de este componente son:

  • Sesgo de corriente ultra bajo
    • 20 fA a 25 °C max
    • 20 fA a 85 °C max
    • 250 fA a 125 °C max


  • Buffer protector integrado


  • Ancho de voltaje de alimentación de:
    •  +-2.5V a +-8V 
    •  5V a 16V 


jueves, 5 de noviembre de 2015

El objetivo antes establecido era el de hacer un filtro pasa banda utilizando el Psoc 5 como un operacional.

Tras construirlo no logramos el resultado esperado. Al probar los filtros de manera externa, sin utilizar el Psoc 5, funcionó correctamente por lo que el problema era el Psoc 5.

El operacional estaba configurado como seguidor en el Psoc Creator, como posible forma de arreglarlo, configuramos el operacional sin configuración de seguidor y lo conectamos como seguidor de manera externa y tampoco solucionó el problema.


viernes, 23 de octubre de 2015

Avances para Filtro pasa bandas.


Tenemos como objetivo el desarrollar un filtro pasa bandas utilizando componentes externos y la ayudo del Psoc 5 como OPAMP.

Un filtro pasa bandas es un tipo de filtro electrónico con dos frecuencias de corte, que deja pasar un determinado rango de frecuencias de una señal que nosotros podemos establecer y atenúa el paso del resto de las señales fuera del rango.

Y se puede construir con la implementación de un filtro pasa bajas y un filtro pasa altas conectados en serie.sin importar cual de ellos se encuentre primero. 
Pero se deben respetar frecuencia de corte de filtro pasa bajas sea menor que la frecuencia de corte del filtro pasa altas que la ganancia de ambas etapas sea igual para que la banda de paso se mantenga plana.


En la siguiente imagen tenemos el esquemático guía, que creamos para analizar el comportamiento del circuito, con la ayuda del software Proteus.


  Y a continuación tenemos los cálculos realizados para seleccionar los componentes del circuito.


    Con los valores ya obtenidos procedimos a comprobar el correcto en el funcionamiento en la simulación.

En las siguientes imágenes observaremos nuestro filtro sometido a tres diferentes frecuencias.
[En amarillo tenemos la señal original]
[En rosa tenemos la señal pasando por el filtro de primer orden]
[En verde tenemos la señal pasando por el filtro de segundo orden]


Figura 1.- Tenemos una señal de 2.6 kHz , menor a la primera frecuencia de corte;
podemos observar que la señal bajo los filtros de primer y segundo están atenuadas. 


Figura 2.-  La señal original es de 390kHz, mayor a la segunda frecuencia de corte
y podemos observar que la señal bajo los filtros de primer y segundo están nuevamente atenuadas.


Figura 3.-  La señal original es de 68kHz, esta dentro del rango de nuestras frecuencias de corte
y podemos observar que la señal bajo los filtros de primer y segundo pueden pasar sin ningún problema.

Después de comprobar que el filtro funciona correctamente, pasamos al software PSoc Creator.


Figura 4.- Creando un nuevo proyecto.


Figura 5.- Seleccionando nuestra tarjeta "PSoc 5LP Desing" y nuestro controlador "CY8C5888LTI-LP097"

Figura 6.- Creando el siguiente esquemático con dos OPAM'S configurados en modo seguidor para no tener ganancias a las salidas de la señal. (Los elementos en azul fueron seleccionados de la pestaña "off-chip" solamente con propósito ilustrativo de como conectar el circuito, ya que no tienen ninguna acción  en el programa)


Figura 7.- Presionando doble click en cualquier OPAM podemos acceder a su configuración individual donde podemos cambiarle el nombre y el modo de seguidor.


Figura 8.- En lo que respecta al código, siguiendo la datasshet del OPAM, se inicializarón los OPAM'S.

  Lamentablemente tras intentarlo varias veces, no logramos completar el objetivo de la practica puesto que al probar nuestro circuito con las conexiones correspondientes (revisando correctamente los pines conectados con los pines asignados en el PSoc Creator), el filtrado no se obtenía y aun estamos en busca del error. 


viernes, 11 de septiembre de 2015

El programa final de la practica de LCD con ADC.
Usando la tarjeta PSoc 5LP

Con el vídeo demostrativo del programa cargado y funcionando.


El esquemático utilizado fue el siguiente.


La asignación de pines fue la siguiente:


Y el código implementado fue:

#include <project.h>
#include <stdio.h> //Libreria para usar funcion "sprintf"

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    int32 output; //Por que es ADC de 20 bits
    char8 str[12];
    float ADC_Voltaje;
    CYGlobalIntEnable;
       
    LCD_Start(); // Iniciar LCD
    LCD_Position(0,2); //Posicionar LCD
    LCD_PrintString("==EQUIPO 9=="); // Imprimir
    LCD_Position(1,1); //Posicionar LCD
    LCD_PrintString("V ="); // Imprimir
   
    ADC_Start();        //Iniciar ADC
    ADC_StartConvert(); //Empezar a convertir
    ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);  

 
    for(;;)
    {
        output=ADC_GetResult32();
        ADC_Voltaje=(5.000000/1048576)*output; //5v / Resolucion del ADC (2^20)
        LCD_Position(1,6);
        sprintf(str,"%.4f",ADC_Voltaje);   //Permite convertir una variable numerica a caracter
        LCD_PrintString(str);
       
    }
}

Y aquí les dejamos un link para descargar el programa hecho el software en PSoc Creator 3.1

Descargar Programa

martes, 8 de septiembre de 2015


Tras seguir investigando, ya logramos hacer nuestro propio programa para regular la intensidad del LED utilizando la salida PWM.

El esquemático utilizado fue el siguiente:

y el código es el siguiente:

int main()
{
  uint8 valorADC;
    
    ADC_Start();
    ADC_StartConvert();
    PWM_Start();
    
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    for(;;)
    {
        valorADC=ADC_GetResult8();
        PWM_WriteCompare(valorADC);
    }
}



Este es nuestro primer avance con el uso del Psoc Creator, encontramos el siguiente programa en internet el cual cumple con el objetivo de regular la intensidad de un LED por medio de un potenciometro. A continuación se muestra un vídeo y está un enlace para descargar el programa.





Seguimos investigando para comprender mejor el uso del Psoc Creator y utilizar una pantalla LCD.