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"
//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"
//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.