Mostrando entradas con la etiqueta ADC. Mostrar todas las entradas
Mostrando entradas con la etiqueta ADC. Mostrar todas las entradas

sábado, 30 de marzo de 2013

PWM CONTROLADO POR VOLTAJE CON PSoC

Una aplicación utilizada comúnmente en electrónica son los PWM, para esta publicación de PSoC en Español se va a presentar como configurar el modulo de usuario PWM de PSoC Designer y la manera de cambiar el ciclo útil del mismo por medio de una entrada de voltaje análogo.

En primera instancia PSoC Designer dentro del catalogo de módulos de usuario ofrece módulos PWM de 8 y 16 bits, para este ejemplo se va a utilizar un modulo de 8 bits, sin embargo si quieren configurar un modulo de 16 bits no tienen de que preocuparse ya que los parámetros de configuración son prácticamente los mismos. Para comenzar en sí con el desarrollo de esta publicación se tienen que mostrar cuales son los parámetros de configuración de estos módulos y de que consta cada uno.

Clock:

Este parámetro de configuración se refiere al reloj con el cual se va a alimentar el modulo de usuario, la velocidad de este reloj es un factor determinante para determinar la frecuencia a la cual va a trabajar el PWM.



El “clock” se puede escoger entre los diferentes relojes de los que dispone PSoC como por ejemplo Sysclk*2 (Ya que estos módulos soportan reloj hasta de 48 MHz), VC2, VC2, VC3, además de relojes externos que pueden ser conectados por medio de las entradas digitales del microcontrolador.

Enable:

Con este parámetro se escoge la forma con la cual se va a activar el PWM, se puede escoger entre 16 fuentes diferentes entre las que se encuentran, high, low, los comparadores y las entradas digitales del microcontrolador, en caso de escoger la opción “High” significara que el modulo PWM permanecerá activo de manera permanente.

CompareOut:

Este parámetro es la salida del modulo, por lo tanto es de donde se obtiene el PWM que puede ser conectado a uno de los buses para que pueda estar a disposición de otros módulos de usuario o para su conexión a alguno de los pines de salida del microcontrolador.

TerminalCountOut:

Es una salida auxiliar a la “CompareOut”, con esta se puede conectar la respuesta del PWM a otro bus para futuras conexiones, en caso de no ser necesario se puede dejar deshabilitada.

Period:

Este parámetro permite configurar el periodo de la señal del PWM, los valores que puede tomar son de (0 - 255) para el caso de los PWM de 8 bits y de (0 - 65535) para el caso de los PWM de 16 bits.

PulseWidth:

A partir de este parámetro se puede configurar el ciclo útil del PWM, puede tomar al igual que para el parámetro “Period” puede tomar valores entre (0 -255 o 0-65535) dependiendo del tipo de modulo con el cual se esté trabajando, el ciclo útil se puede calcular a partir de las siguientes ecuaciones:

·         Con CompareType = “Less Than”


·         Con CompareType = “Less Than Or Equal”


Lo anterior aplica solamente cuando el valor de “PulseWidth” es menor al valor del parámetro “Periodo”, en caso de ser mayor o igual el ciclo útil del PWM es de 100%.

InterruptType:

Este parámetro permite configurar el tipo de interrupciones con las cuales se va a manejar el modulo.

CompareType:

Este tipo establece el tipo de comparación que se va a realizar y es el que se mencionaba en el parámetro “PulseWidth” como parte del cálculo del ciclo útil.

ClockSync:

Indica la fuente de reloj con la cual se debe sincronizar el modulo.

InvertEnable:

Invierta la señal de entrada que se había configurado previamente como señal de habilitación del modulo.

Así como estos parámetros pueden ser configurados de manera grafica sencillamente, también pueden ser configurados por medio de código ya sea en Assembler o en C mediante comandos que permiten activar o desactivar el modulo, modificar el periodo, el ancho del pulso, entre otras características, ejemplos de esto son los siguientes comandos:

PWM8_Start(); //Inicializa el modulo PWM
PWM8_WritePeriod(Valor del periodo); //Configura el periodo del PWM
PWM8_WritePulseWidth(Valor del ancho de pulso);// Configura el ancho de pulso del PWM
PWM8_bReadPulseWidth();// Lee el valor del ancho de pulso del PWM
PWM8_Stop(); //Detiene el modulo PWM8

DESARROLLO PRÁCTICA DE PWM CONTROLADO POR VOLTAJE:

El objetivo principal de esta publicación es desarrollar un circuito PWM cuyo ciclo útil sea modificado por medio del valor de una señal de voltaje análogo, para tal fin se va a utilizar el IDE de desarrollo de PSoC (PSoC Designer), los módulos de usuario ADCINC y PWM8. El procedimiento para desarrollar esta aplicación fue el siguiente:

1. Ingresar la señal de voltaje análogo al microcontrolador PSoC y convertirla a un valor digital. Para tal fin se utiliza con un convertidor análogo a digital (modulo ADCINC), personalmente antes del modulo convertidor, prefiero utilizar un modulo PGA para ingresar la señal análoga y de esta manera hacer una especie de acople o adaptación de la señal, luego de este modulo PGA si procedo a ingresar la señal análoga al convertidor ADC.

2. Configurar el modulo PWM según los criterios que se mostraron anteriormente y las necesidades de frecuencia que tenga cada uno.

3. Utilizando el valor digital entregado por el convertidor ADC y el comando “PWM8_WritePulseWidth();” del modulo PWM, se re-escribe el valor del ancho de pulso y por lo tanto el del ciclo útil del PWM, esta cambio de ciclo útil es proporcional al cambio de voltaje que se presente en la señal análoga de la entrada del circuito.

Como se puede apreciar por el procedimiento descrito, la práctica es bastante sencilla y así mismo el código también lo es, tal como se puede apreciar a continuación.

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>    
#include "PSoCAPI.h"


void main(void)
{
BYTE resultado;// Variable para alojar el resultado del ADC
M8C_EnableGInt;// Interrupciones M8C Habilitadas
Acople_Start(3);// Inicialización del Modulo PGA (Acople)
PWM8_Start();//Inicialización del Modulo PWM
Convertidor_Start(3);//Inicialización del Modulo ADCINC (Convertidor)
Convertidor_GetSamples(0);//Se inicia la toma de muestras del ADC

while(1)
{
if(Convertidor_fIsDataAvailable()!=0)//se revisa que el DAC tenga una conversión disponible
{
resultado=Convertidor_bGetData();//se guarda el valor de la conversión en la variable resultado
}
PWM8_WritePulseWidth(resultado);//Se escribe el ancho de pulso con el valor de la variable resultado
}
}

Por último pueden observar el siguiente vídeo en el cual se muestra el resultado obtenido por esta práctica.


sábado, 29 de septiembre de 2012

COMUNICACIÓN UART CON PSoC

En esta ocasión he propuesto realizar una práctica de comunicación UART con PSoC, la idea principal es mostrar el funcionamiento del modulo de usuario UART, esto se llevara a cabo mediante un sencillo ejercicio en el cual se debe tomar el voltaje de un potenciómetro configurado como divisor de tensión, luego este valor de voltaje se debe convertir de análogo a digital mediante un modulo de usuario ADCINC para posteriormente enviarlo en formato hexadecimal a un Hyper Terminal.

En primera instancia se van a revisar los aspectos básicos de configuración para poder utilizar el modulo de usuario UART. Este modulo de usuario es un transmisor y receptor universal asíncrono (UART) compatible con el protocolo de comunicación RS232 en modo full duplex, está compuesto por dos bloques digitales los cuales son utilizados uno para transmisión (Tx) y el otro para recepción (Rx) que funcionan independientemente.

Reloj del modulo UART y velocidad de transmisión: El reloj con el cual se alimenta el modulo de usuario es el mismo para ambos bloques y la frecuencia de este debe ser 8 veces mayor a la velocidad de transmisión deseada, por ejemplo si se quiere transmitir a una velocidad de 9600 baudios es necesario que el reloj del modulo de usuario UART este configurado a 76.8 KHz, la tolerancia del reloj para un correcto funcionamiento es +/- 2%.

Rx input: Este parámetro se debe conectar a alguna de las filas de entrada de los bloques digitales y luego a alguno de los pines externos desde donde se va a tomar los datos que son enviados desde el computador.

Tx Output: Este parámetro se conecta a alguna de las filas de salida de los bloques digitales y luego al pin externo encargado de enviar la información al computador.

Tx Interrupt Mod: Este parámetro determina el momento en el que se genera la interrupción por medio del bloque Tx, se pueden escoger dos tipos de interrupciones “TxRegEmpty” y “TxComplete”, la segunda opción es la más utilizada para casos en los que es necesario garantizar que el dato transmitido ha sido enviado por completo.

ClockSync: Permite establecer la fuente de reloj con la que se debe sincronizar el modulo de usuario.

Rx Output: este parámetro permite tomar el valor de entrada a uno de los buses del microcontrolador, esto puede ser útil para realizar funciones de verificaciones de datos.

Rx Clock Out y Tx Clock Out: Permite utilizar el reloj del bloque en otros procesos, hay que recordar que este reloj equivale al del modulo divido en 8.

RxCmdBuffer: Habilita o deshabilita el buffer para la recepción de comandos.

RxBufferSize: Determina el tamaño del buffer de recepción, este parámetro solo es valido cuando están habilitados el RxCmdBuffer y las interrupciones.

CommandTerminator: Determina el carácter o valor que al ser recibido señala el final de un comando.

Param_Delimiter: Determina el carácter utilizado para delimitar un parámetro por ejemplo con el valor 32 se termina que el delimitador es un espacio.

Aunque los parámetros mostrados anteriormente son los básicos para poner en funcionamiento el modulo UART, también son necesarios algunos comandos para la programación del mismo, estos comandos son utilizados para la inicialización del modulo, seleccionar el tipo de paridad, tomar y enviar diferentes tipos de datos, algunos de estos comandos se muestran a continuación, sin embargo es recomendable consultar la hoja de datos del modulo para profundizar el estudio de estos métodos.

• UART_Start(0): Este comando inicializa el modulo de usuario, el valor indicado dentro del paréntesis indica el tipo de paridad.
• UART_CPutString("PSoC En Español \n\r"): Este comando envía una cadena de caracteres.
• UART_PutSHexByte(Valor): Envía en formato Hexadecimal el valor indicado.

De ahora en adelante se muestra el proceso de desarrollo de la práctica mencionada anteriormente.

El primer paso es tomar la muestra del potenciómetro, para esto se utilizaron un modulo PGA con ganancia unitaria y un modulo ADCINC con una frecuencia de muestreo de 1562 muestras por segundo la cual puede ser baja para ejercicios con señales con altas frecuencias pero para la práctica que se está realizando en este momento es más que suficiente, luego de tener los dispositivos para convertir el valor análogo a un valor digital se procede a utilizar el modulo UART y a configurarlo como se puede apreciar en las figuras 1 y 2.

(Figura 1. Configuración de los parámetros del modulo)
(Figura 2. Interconexión del modulo con los pines externos)

Como se pudo observar en la figura 1, el reloj utilizado para alimentar el modulo UART es VC3 el cual está tomando el reloj del sistema (SysClk) y lo divide en 156 por lo tanto la frecuencia que proporciona VC3 es de 153,8 KHz y como ya se había mencionado la velocidad de transmisión es igual a la velocidad del reloj divido en 8 por lo tanto la velocidad a la que se va a transmitir en este ejercicio es de 19200 baudios.



Como existe una tolerancia de +/- 2% en la velocidad de transmisión no hay ningún inconveniente con la diferencia que se presenta entre los 19200 y los 19230.

El siguiente paso es escribir el programa para nuestra aplicación, en este código se deben inicializar los módulos de usuario, tomar las muestras con el convertidor análogo a digital y por ultimo enviar estos datos por medio del modulo UART. A continuación se presenta el código desarrollado para esta aplicación.


//-----------------------------------------------------------------------
// C main line
// Programa de muestra del modulo UART de PSoC
// Desarrollado para PSoC En Español, www.psocenespanol.blogspot.com
// Desarrollado por Iván Cuadros Acosta
//-----------------------------------------------------------------------

#include <m8c.h>       
#include "PSoCAPI.h"   
#include <delay.h>

void main(void)
{
PGA_1_Start(3); //inicialización modulo PGA
ADCINC_1_Start(3); //inicialización modulo ADCINC
ADCINC_1_GetSamples(0); // se toman muestras constantemente
M8C_EnableGInt ; //se habilitan las interrupciones
UART_1_Start(0);//inicialización modulo UART, sin paridad

//Se imprimen encabezados que aparecen inicialmente en el hyper Terminal
UART_1_CPutString("PRACTICA DE MUESTRA MODULO UART DE PSoC \n\r");
UART_1_CPutString("PSoC En Español \n\r");
UART_1_CPutString("www.psocenespanol.blogspot.com \n\r");
while(1)
{
if(ADCINC_1_fIsDataAvailable()!=0)//se conprueba si hay un valos disponible en el convertidor
{
  UART_1_PutSHexByte(ADCINC_1_wGetData());//Se envia el valor del ADCINC en formato Hexa
  UART_1_CPutString("\n\r");}//Se imprime un salto de linea
  Delay10msTimes(50);//Retardo de 500 milisegundos
}
}


Por último a continuación se presenta un vídeo donde es posible observar el proceso el funcionamiento de esta práctica.



NOTA: La recepción de datos por medio del modulo UART de PSoC se muestra en una publicación posterior, si quieren revisarla pueden hacerlo a través del siguiente link:  RECEPCIÓN DE DATOS CON MODULO UART DE PSoC.

domingo, 27 de mayo de 2012

CONVERTIDOR ANÁLOGO A DIGITAL CON MODULO ADCINC



En la publicación anterior se realizo una pequeña revisión del modulo DAC8 de PSoC con el cual se pueden hacer conversiones de datos digitales a análogos, en esta ocasión se va a llevar a cabo el proceso contrario con el modulo ADCINC, el cual es tan solo uno de los tantos módulos que ofrece PSoC Designer para realizar conversiones análogas a digitales, además también se llevara a cabo una práctica sencilla en la cual se pretende convertir una señal análoga a digital y luego retornarla de nuevo de manera análoga, de esta manera se integraran los temas vistos en esta publicación y la anterior.

Los módulos que ofrece PSoC Designer para hacer conversiones análogo a digital son los siguientes:

• ADCINC 
• ADCINCVR
• DelSig
• DualADC
• DualADC8
• SAR6
• TriADC
• TriADC8

El modulo que se va a referenciar es el ADCINC, este es un convertidor análogo a digital que cuenta con una resolución de 6 a 14 bits y provee una velocidad de muestreo de 15,6 Ksps (para 6 bits de resolución), el formato de la salida digital se puede entregar con signo o sin signo, la frecuencia máxima a la que se puede alimentar el bloque (DataClock) es de 8 MHz, sin embargo es recomendable que se utilice una frecuencia de 2 MHz con la cual se provee una linealidad en la conversión. 

Este ADCINC es posible implementarlo de primer o segundo orden, si se implementa una de primer orden son utilizados un bloque digital y un bloque análogo, por su parte al implementar un ADC de segundo orden se utilizaran un bloque digital y dos análogos, la configuración de estos ADC se pueden observar en las figuras 1 y 2 mostradas a continuación, estos esquemas fueron tomados de la hoja de datos del modulo ADCINC. 


(Figura 1. ADCINC de primer Orden)
(Figura 2. ADCINC de segundo Orden)

Configuración modulo ADCINC: 

Al igual que se hizo con el modulo DAC8 los aspectos que se van a tener en cuenta en esta publicación, son solo aspectos mínimos para la puesta en funcionamiento del modulo, para una mayor profundidad sobre el funcionamiento del mismo y mayores características, se recomienda leer la hoja de datos del modulo.

Los parámetros a configurar para este modulo se pueden apreciar en la figura 3.

(Figura 3. Parámetros de configuración del modulo)

DataFormat: Es el formato del valor binario al que será convertido el valor análogo ingresado al sistema, permite dos posibilidades unsigned y signed, en caso de seleccionar unsigned el dato binario se ofrece sin signo, si se escoge signe se utiliza un bit para determinar el signo del valor digital.

Resolution: Es el numero de bits utilizado para realizar la conversión, entre mayor sea el numero de bits, mejor va a ser la resolución del convertidor.

Data Clock: Velocidad del reloj a la cual se alimentan los bloques del modulo, la velocidad máxima es de 8 MHz, esta velocidad determina la velocidad de muestreo del convertidor análogo a digital.



Pos Input: Entrada principal del convertidor. 

Los parámetros anteriores son los mínimos a configurar para poner en funcionamiento el modulo ADCINC, los valores Neg Input y Neg Input Gain, se pueden dejar desconectados y deshabilitados respectivamente. 

Para el funcionamiento del ADC es necesario habilitar las interrupciones, además se recomienda utilizar un modulo PGA de ganancia 1 antes de la entrada del convertidor ADC, a continuación se presenta un código en C en que se muestra como poner en funcionamiento el convertidor, con este código se espera despejar un poco las dudas sobre este modulo. 

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>       
#include "PSoCAPI.h"   

void main(void)
{
PGA_1_Start(3); //se activa el modulo PGA
ADCINC_1_Start(3); //se activa el modulo ADCINC
ADCINC_1_GetSamples(0); // # de muestras a tomar, en este caso muestreo constante
M8C_EnableGInt; //se habilitan las interrupciones
while(1)
{
if(ADCINC_1_fIsDataAvailable()!=0) // si el DAC tiene un dato valido entonces
{
PRT1DR=ADCINC_1_bGetData();//coloca el dato digital por el puerto 1.
}
}
}


Las configuraciones de los parámetros del modulo ADCINC en conjunto con el código anterior son los que se mostraron en la figura 3.

En el siguiente video se muestra una práctica en la cual se toma una señal sinusoidal análoga por medio de un convertidor ADC, este valor se guarda en una variable y por ultimo un convertidor DAC toma este valor retornando como resultado un valor análogo, con lo cual se obtiene la reconstrucción de la señal que se ingreso al sistema en un principio.