Está en la página 1de 14

7- Convertidor Anlogo-Digital

Ing. Juan Ramon Terven Salinas 123


7 CONVERTIDOR ANLOGO-DIGITAL

El convertidor Anlogo Digital es uno de los perifricos clave para realizar
interfaces con el mundo real. Los PIC32MX fueron diseados para aplicaciones de
control y por esta razn estn dotados con un veloz ADC capaz de realizar 1 millon de
muestras por segundo.

El mdulo ADC de los PIC32MX tiene las siguientes caractersticas [10] :
Registro de conversin de aproximaciones sucesivas.
Hasta 16 entradas analgicas.
Pines de entrada de niveles de voltaje externo.
Un amplificador Sample-and-Hold unipolar diferencial (SHA).
Modo de escaneo de canales automtico (Automatic Channel Scan).
Fuentes de disparo de conversin seleccionables.
Buffer de conversin de 16 palabras (caben hasta 16 resultados).
Modos de llenado de buffer de conversin seleccionables.
Ocho formatos de conversin para resultado.
Operacin durante modo SLEEP y modo IDLE.

La Figura 7-1 muestra el diagrama de bloques del convertidor ADC.

Registros de Control
El mdulo ADC del PIC32MX posee una diversidad de modos de funcionamiento y
configuraciones diferentes. Para configurar todas las opciones del ADC se usan
registros de funciones especiales (SFRs). A continuacin se menciona de manera rpida
los registros de control utilizados y su utilizacin. Para conocer a detalle el contenido de
estos registros y el funcionamiento del ADC refierase al manual de referencia [10] .
Los registros AD1CON1, AD1CON2 y AD1CON3 controlan la operacin del
ADC.
El registro AD1CHS selecciona los pines que sern conectados al SHA.
El registro AD1PCFG configura los pines como analgicos o digitales.
7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 124
El registro AD1CSSL selecciona las entradas que sern escaneadas
secuencialmente.

La Tabla 7-1 muestra todos los registros asociados de alguna manera con el ADC.


Figura 7-1. Diagrama de bloques del ADC


.
7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 125
Tabla 7-1. Registros relacionados con el ADC
7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 126
El proceso de digitalizacin
La digitalizacin de una seal es un proceso de 2 pasos:
1. Primero se toma una muestra de la seal de voltaje (muestreo).
2. Luego se desconecta la entrada y se realiza la conversin del voltaje muestreado
a un valor digital de 10 bits por medio de aproximaciones sucesivas
(conversin).
Estos pasos son controlados con los bits SAMP y DONE del registro AD1CON1.
- Durante la fase de muestreo, la seal externa es conectada a un condensador interno
que necesita ser cargado al voltaje de entrada. Por lo tanto se debe de proveer tiempo
suficiente para que se cargue este capacitor, este tiempo depende de la impedancia de la
seal de entrada y de la capacitancia de dicho condensador. En general, a mayor tiempo
de muestreo, se obtiene mejor resultado.
- La fase de conversin dura 12 T
AD
. T
AD
es el periodo del reloj del ADC y se deriva del
PBCLK a travs de un divisor o puede ser un oscilador RC interno.

La duracin de la digitalizacin es la suma del tiempo de muestreo ms el tiempo de
conversin como se observa en la Figura 7-2.
El resultado de la digitalizacin se guarda en un buffer llamado ADC1BUF0. De hecho
el ADC puede almacenar hasta 16 valores distintos en los registros ADC1BUF0
ADC1BUFF.


Figura 7-2. Proceso de Digitalizacin [10]

7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 127
De acuerdo al fabricante T
AD
debe ser mayor que 83.33ns, como el reloj del ADC se
deriva de PBCLK, debemos escoger cuantos T
PB
forman un T
AD
.

Por ejemplo:
Si PBCLK = 80MHz, entonces T
PB
= 12.5nS
Entonces T
AD
debe durar por lo menos 7T
PB


Para configurar la duracin de T
AD
se usan los bits ADCS del registro AD1CON3 de
acuerdo a las siguientes frmulas:

De las frmulas anteriores si PBCLK = 80MHz, ADCS debe ser mnimo 3 para que:
ns T T T
PB PB AD
100 8 ) 1 3 ( 2 = = + =

En cuanto al Muestreo, el fabricante dice que se debe de proporcionar un tiempo
mnimo de 1 TAD para el muestreo, sin embargo este tiempo depende de la impedancia
de la seal de entrada. Asegurese que la seal de entrada tiene una impedancia de
entrada baja.

Sin ms preambulo desarrollaremos una librera para hacer uso del ADC.
7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 128
Librera ADC
Las libreras del PIC32 poseen funciones para el manejo del ADC, sin embargo
requieren de varias configuraciones. Para hacer ms sencillo el funcionamiento se
elaboraron 2 funciones propias para el manejo del ADC que se muestran a continuacin.

Programa 7-1. Archivo adc.c
#include "adc.h"

/* FUNCIN openADC
Esta funcin activa el ADC con las siguientes caractersticas
-Muestreo manual, conversin automatica
-Usa MUXA, usa AVdd & AVss como Vref+/-
-Tsamp = 32 x Tad
-Formato de salida Integer 16 bits

Antes de llamar initADC se deben configurar los pines como
entradas analgicas
*/
void openADC(void)
{
AD1CON1 = 0x00E0; // conversin automatica despus del muestreo
AD1CSSL = 0; // sin escaneo de canales
AD1CON2 = 0; // usa MUXA, usa AVdd & AVss como Vref+/-
AD1CON3bits.SAMC = 5; //5TADs para muestreo
AD1CON3bits.ADCS = 3; //TAD = 8TPB
AD1CON1bits.ADON = 1; // activa el ADC
}


/* FUNCIN leeADC
Convierte el voltaje en el canal indicado
regresa el valor digital
*/
short leeADC(int ch)
{
AD1CHSbits.CH0SA = ch; // 1. Selecciona el canal de entrada
AD1CON1bits.SAMP = 1; // 2. Inicia muestreo
while (!AD1CON1bits.DONE); // 3. Espera que termine la conversin
return ADC1BUF0; // 4. Lee y regresa resultado
}


Programa 7-2. Archivo adc.h
#ifndef _ADC_H
#define _ADC_H

#include <p32xxxx.h>

void initADC(void);
short readADC(int);

#endif

7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 129
Ejemplo 1. Uso del ADC con 1 canal
El siguiente programa demuestra el uso del ADC para digitalizar un canal (AN15) y
mostrar el resultado en el display LCD.
Arme el circuito de la Figura 7-3.
Realice un nuevo proyecto con el
7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 130
Programa 7-3.


Figura 7-3. Diagrama para Ejemplo 1

7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 131
Programa 7-3. Uso de ADC con 1 canal
/*
DEMOSTRACIN DE USO DE ADC
GENERA 1 INTERRUPCIN CADA MEDIO SEGUNDO
USANDO EL CORE-TIMER, EN LA CUAL
DIGITALIZA EL VOLTAJE DEL PIN AN15
Y MUESTRA EL VALOR DIGITAL EN LCD
*/
#include <p32xxxx.h>
#include <stdio.h>
#include <plib.h>
#include "../librerias/LCD/alpha_lcd.h"
#include "../librerias/ADC/adc.h"

//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD

#define CORE_TICK 0x1312D00 //Valor para duracion de 0.5 segundos

int main(void)
{
AD1PCFG = 0xFFFF; // configura pines AN como digitales
AD1PCFG = 0x8000; // AN15 analogico
TRISBbits.TRISB15 = 1; // RB15 como entrada

// configura LCD
openLCD();

//Envia cadena "Probando LCD"
putsLCD("Probando ADC");

//Inicializa ADC muestreo manual conversion automtica 32Tad
openADC();

//Activa core-Timer
OpenCoreTimer(CORE_TICK);

//Ajusta la interrupcin del Core Timer (CT) con prioridad de 4
IPC0bits.CTIP = 4; //prioridad 4
IPC0bits.CTIS = 1; //subprioridad 1
IFS0bits.CTIF = 0; //Limpia la bandera de interrupcion
// Activa el modo MultiVectored
INTEnableSystemMultiVectoredInt();
IEC0bits.CTIE = 1; //Activa la interrupcion CT

//Cambia al renglon 2
setDDRamAddr(0x40);

while(1)
{
}

return 0;
}



7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 132
//RUTINA DE INTERRUPCIN DE CORE-TIMER
void __ISR(_CORE_TIMER_VECTOR, ipl4) CoreTimerHandler(void)
{
short datoDig;
char strDato[10];

//Lee canal 15 del ADC
datoDig = leeADC(15);

setDDRamAddr(0x40); //se coloca en renglon 2
putsLCD(" "); //Limpia pantalla

//convierte datoDig a cadena en strDato
sprintf(strDato,"%d",datoDig);

setDDRamAddr(0x40); //se coloca en renglon 2
putsLCD(strDato); //muestra dato en display

//Reinicia Timer
UpdateCoreTimer(CORE_TICK);

//Limpia la bandera de interrupcion del Core-Timer
IFS0bits.CTIF = 0;
}


7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 133
Ejemplo 2. Uso de ADC para digitalizar 2 canales
El siguiente programa demuestra el uso del ADC para digitalizar dos canales (AN14 y
AN15) y muestra los resultados en el display LCD.
Arme el circuito de la Figura 7-4
Realice un nuevo proyecto con el Programa 7-4.


Figura 7-4. Diagrama para ejemplo 2

7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 134
Programa 7-4. Uso de ADC con 2 canales

/*
DEMOSTRACIN DE USO DE ADC
GENERA 1 INTERRUPCIN CADA MEDIO SEGUNDO
USANDO EL CORE-TIMER, EN LA CUAL
DIGITALIZA EL VOLTAJE DEL PIN AN15
Y MUESTRA EL VALOR DIGITAL EN LCD
*/
#include <p32xxxx.h>
#include <stdio.h>
#include <plib.h>
#include "../librerias/LCD/alpha_lcd.h"
#include "../librerias/ADC/adc.h"

//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD

#define CORE_TICK 0x1312D00 //Valor para duracion de 0.5 segundos

int main(void)
{
AD1PCFG = 0xFFFF; // configura pines AN como digitales
AD1PCFG = 0x8000; // AN15 analogico
TRISBbits.TRISB15 = 1; // RB15 como entrada

// configura LCD
openLCD();

//Envia cadena "Probando LCD"
putsLCD("Probando ADC");

//Inicializa ADC muestreo manual conversion automtica 32Tad
openADC();

//Activa core-Timer
OpenCoreTimer(CORE_TICK);

//Ajusta la interrupcin del Core Timer (CT) con prioridad de 4
IPC0bits.CTIP = 4; //prioridad 4
IPC0bits.CTIS = 1; //subprioridad 1
IFS0bits.CTIF = 0; //Limpia la bandera de interrupcion
// Activa el modo MultiVectored
INTEnableSystemMultiVectoredInt();
IEC0bits.CTIE = 1; //Activa la interrupcion CT

//Cambia al renglon 2
setDDRamAddr(0x40);

while(1)
{
}

return 0;
}


7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 135

//RUTINA DE INTERRUPCIN DE CORE-TIMER
void __ISR(_CORE_TIMER_VECTOR, ipl4) CoreTimerHandler(void)
{
short datoDig1, datoDig2;
char strDato[10];

//Lee canal 14 del ADC
datoDig1 = leeADC(14);

//Lee canal 15 del ADC
datoDig2 = leeADC(15);

setDDRamAddr(0x40); //se coloca en renglon 2
putsLCD(" "); //Limpia pantalla

//convierte datoDig a cadena en strDato
sprintf(strDato,"1:%d 2:%d",datoDig1, datoDig2);

setDDRamAddr(0x40); //se coloca en renglon 2
putsLCD(strDato); //muestra dato en display

//Reinicia Timer
UpdateCoreTimer(CORE_TICK);

//Limpia la bandera de interrupcion del Core-Timer
IFS0bits.CTIF = 0;
}



PRCTICA 6. Voltmetro Digital 1
Usando el circuito anterior disee un voltmetro digital de 2 canales; es decir en el
display LCD se debe mostrar el valor en volts (de 0 a 3.3V) en lugar de el valor digital
(0 a 1023).
El display LCD debe mostrar algo similar a la Figura 7-5.

Figura 7-5. Pantalla del voltmetro



7- Convertidor Anlogo-Digital
Ing. Juan Ramon Terven Salinas 136
PRCTICA 7. Voltmetro Digital 2
Disee un voltmetro digital con un solo canal capaz de funcionar en un rango mnimo
de -20V a 20V.
Debe disear un circuito acondicionar de seal que convierta el rango amplio
bipolar (-20 a 20) en un rango adecuado para el ADC (0 a 3.3V).
Tenga extremo cuidado de no introducir voltajes mayores a 3.3V y menores de 0V
al microcontrolador.


Figura 7-6. Circuito para prctica

También podría gustarte