03 – Conversión de Analógico a Digital con librería ADC.h de C18

Continuando con la implementación de librerías C18, ha llegado el turno de adc.h, esta librería nos facilita el trabajo de conversión A/D ahorrándonos bastante código. Como siempre nos basaremos en el documento de Microchip: MPLAB_C18_Libraries_51297f.

Circuito de aplicación

Partimos describiendo el circuito de aplicación que es el siguiente:

Circuito de aplicación

El circuito es sencillo ya que únicamente tiene como finalidad demostrar el funcionamiento del módulo AD del microcontrolador. En el circuito, se utiliza el canal AN0 (RA0), los niveles analógicos son proporcionados por el potenciómetro de 10K y monitoreados por el voltímetro, el microcontrolador realizará la conversión y mostrará el valor digital (en binario) en el puerto D por medio de un conjunto de leds.

Consideraciones sobre el módulo AD del PIC18F4550

  • El PIC18F4550 posee un modulo AD de 13 canales, esto significa que solamente podemos utilizar un canal por vez (no es posible la conversión simultánea).
  • La resolución de la conversión es de 10 bits (2∧10 = 1024), por lo tanto tendremos 1024 – 1 = 1023 posibles valores.
  • El valor del escalón de la conversión si el voltaje de entrada máximo es de 5V será de: 5V/1023 = 0.004887V. Por ejemplo, si se ajusta el potenciómetro para entregar un voltaje de 3.5V tendremos que: 3.5V /0.004887V = 716 (valor digital), al convertir 716 a binario tenemos:  1011001100 (Este será el resultado que se mostrará en el puerto D).

Librería adc.h de C18

Originalmente creada para C18, puede utilizarse con XC8 y MPLAB X. Las funciones que la librería proporciona son las siguientes:

funciones libreria adc

Las funciones que utilizaremos son:

OpenADC(), se utiliza para configurar el módulo AD, requiere tres parámetros de configuración: origen de la señal de reloj para el módulo AD, la alineación de la conversión, y el tiempo de adquisición de datos (xTAD). El segundo parámetro se utiliza para indicar: el canal a utilizar (AN0 – AN12), estado de la interrupción AD, y los voltajes de referencia positivo y negativo. Finalmente, el tercer parámetro es un valor decimal que representa la configuración del registro ADCON1.

El siguiente es el ejemplo de aplicación:

 OpenADC(ADC_FOSC_64 &
 ADC_RIGHT_JUST &
 ADC_16_TAD,
 ADC_CH0 &
 ADC_INT_OFF &
 ADC_VREFPLUS_VDD &
 ADC_VREFMINUS_VSS,
 14);

**Para información sobre el origen de los valores de configuración se sugiere leer la hoja de especificaciones del PIC18F4550 pág. 259.

Cabe aclarar, que los parámetros de OpenADC() cambian de acuerdo al PIC que se está utilizando.

ConvertADC(), inicia el proceso de conversión.

ReadADC(), devuelve un número entero que representa el valor decimal de la conversión efectuada.

BusyADC(), hace una espera mientras el proceso de conversión AD se lleva a cabo.

Código de aplicación

Creamos entonces, un nuevo proyecto en MPLAB X e incorporamos el siguiente código:

#include <xc.h>
#include <plib/adc.h>
#include <plib/delays.h>
#include "stdlib.h"

//Bits de configuración para Fosc = 48Mhz
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
#pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF

#define _XTAL_FREQ 48000000

int resultado;

void main()
{
 TRISD = 0;
 PORTD = 0;

 /*Configuración del módulo AD
 * Fosc = 64
 * Alineación = derecha
 * 16 TAD
 * Canal AN0
 * Interrupción deshabilitada
 * VREF+ y VREF- conectados a VDD y VSS respectivamente
 * Valor de ADCON1 = 14 (Canal AN0 analógico, el resto digitales)
 */
 OpenADC(ADC_FOSC_64 &
 ADC_RIGHT_JUST &
 ADC_16_TAD,
 ADC_CH0 &
 ADC_INT_OFF &
 ADC_VREFPLUS_VDD &
 ADC_VREFMINUS_VSS,
 14);

 //Retardo de 50 Tcy
 Delay10TCYx(5);

 while(1)
 {
 //Iniciar la conversión
 ConvertADC();

 //Espera para que se complete la conversión
 while(BusyADC());

 //Capturando el resultado
 resultado = ReadADC();

 /*Como el resultado es de 10 bits
 * y sólo se dispone de un puerto de 8 bits
 * para mostrarlo. El resultado se convierte
 * en su equivalente de 8 bits dividiendo
 * por cuatro.
 */
 resultado = resultado / 4;

 //Mostrando el resultado
 PORTD = resultado;
 }
}

Bastará con compilar y verificar el funcionamiento en Proteus para ver los resultados, sería interesante comprobar que matemáticamente los valores digitales corresponden al nivel del voltaje entrada analógico (no olvidar que el resultado de 10 bits se está convirtiendo a 8 bits).

El siguiente video muestra la implementación en una placa de desarrollo:

Volveré posteriormente con un ejemplo de conversión A/D utilizando interrupciones.

Saludos a tod@s

Acerca de jjguevara09

Me gusta la electrónica
Esta entrada fue publicada en Microcontroladores PIC y etiquetada , , , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s