Conversión Análogo/Digital (A/D)
Los microcontroladores PIC16F887 poseen un conversor análogo/digital de 10 bits y
14 canales de entrada (AN0, AN1,…,AN13).
Una señal análoga o analógica es una señal continua que posee valores que van
variando con el tiempo. A diferencia de una señal digital, que tiene valores discretos en
cada punto de muestreo, una señal analógica presenta fluctuaciones constantemente. En
la siguiente figura podemos ver un patrón analógico (representado como una onda
sinosuidal) junto con un patrón digital (representado como líneas discretas).
<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow:
hidden; line-height: 0;" class="mce_SELRES_start"></span>
Con el microcontrolador, lo que se hace, es aproximar una señal análoga por medio de
pequeños cuadros rectángulos digitales, como puede apreciarse en la figura de encima.
Entre mas resolución tenga nuestro microcontrolador, mas pequeños pueden ser los
rectangulos que se forman y más aproximado puede quedar nuestra señal analógica.
Un sensor de nivel que me genere una señal análoga no solo me indica si el tanque esta
lleno o vacío, sino que además me indica que nivel tiene el tanque en todo momento y la
señal será proporcional al nivel del tanque.
Un conversor A/D (ADC PIC) me convierte la señal análoga en un número digital
(binario), él número es proporcional a la señal análoga.
En el caso del microcontrolador PIC16F887 el conversor A/D tiene 10 bits y la señal
análoga de entrada puede estar entre 0V y 5V, sin embargo el conversor A/D tiene dos
niveles de referencia VREF+ y VREF- que me indican entre que valores será la señal
análoga de entrada. El voltaje mínimo diferencial es de 2V, es decir la diferencia entre
VREF+ y VREF- no puede ser mayor a 2V.
Pin Rojo(VREF+) Pin Verde (VREF-), Pines morados son las entradas Análogo
Digitales
• Con 10 bits el mayor número binario que se puede tener es 1024, por lo tanto la
resolución del conversor A/D esta dada por la fórmula:
Resolución del Conversor ADC en PIC
La resolución de un microcontrolador PIC depende del voltaje de referencia que se
establezca en el dispositivo. Generalmente si no se define este voltaje de referencia el
dispositivo usará el voltaje de alimentación como siendo la referencia (es decir 5v)
Así, por ejemplo, si VREF = +5V y VREF- es 0V, la resolución es 5V/1024 = 4.8mV,
cuando la señal análoga sea 0V le corresponde un número digital = 0000000000 y para
5V será 1111111111.
Si VREF+ = +5V y VREF- se puede determinar en todo momento a que número digital
aproximado corresponde cualquier señal análoga de entrada, con la fórmula:
Por ejemplo si la señal análoga es 2V, el número digital aproximado, es:
La tensión de referencia VREF+ puede implementarse con la tensión interna de
alimentación VDD, o bien, con una externa que se pone en el pin RA3/AN3/ VREF+.
PASOS PARA TRABAJAR CON EL CONVERSOR
A/D o ADC PIC
1. En el encabezado del programa incluir la siguiente línea, si se va a trabajar
el conversor A/D a 10 bits ya que por defecto funciona a 8 bits.
#DEVICE ADC=10
2. En el programa principal
a. Configurar las entradas análogas.
b. Seleccionar el tipo de reloj del conversor A/D.
c. Especificar el canal a utilizar para la conversión.
a.
SETUP_ADC_PORTS(Valor);
Esta función configura los pines del ADC para que sean entradas análogas, digitales o
alguna combinación de ambos. Las combinaciones permitidas varían de acuerdo al
microcontrolador.
Las constantes (ALL ANALOG) todas las entradas como análogas y (NO_ANALOG)
ninguna entrada como análoga son válidas para todos los microcontroladores.
b.
SETUP_ADC (Modo)
Selecciona el tipo de reloj del conversor A/D Modo puede ser:
ADC_CLOCK_DIV_2
ADC_CLOCK_DIV_8
ADC_CLOCK_DIV_32
ADC_CLOCK_INTERNAL
Este es el tiempo necesario para obtener el valor digital de la tensión analógica de
entrada. Este tiempo depende de la fuente de reloj que se seleccione para la conversión.
Para realizar una correcta conversión A/D, el reloj debe seleccionarse para asegurar un
tiempo de 1.6us.
c.
SET_ADC_CHANNEL (Canal)
Especifica el canal a utilizar por la función
READ_ADC()
3. Leer el valor de la conversión
I=READ_ADC ()
Esta función lee el valor digital del conversor análogo a digital.
Configuraciones de ADC en PIC C
En la especificación del canal análogo tenemos varias opciones. Por ejemplo el
PIC16F887 tiene 13 pines analgos/digital (ADC), que están pintados de morado en la
figura de arriba y van desde AN0 hasta AN13. Para designar cual pin del PIC queremos
usar como puerto análogo, tenemos la siguiente tabla proporcionada por la librería del
propio PIC dentro del compilador PIC C.
// Constants used in SETUP_ADC_PORTS() are:
#define sAN0 1 //| A0
#define sAN1 2 //| A1
#define sAN2 4 //| A2
#define sAN3 8 //| A3
#define sAN4 16 //| A5
#define sAN5 32 //| E0
#define sAN6 64 //| E1
#define sAN7 128 //| E2
#define sAN8 0x10000 //| B2
#define sAN9 0x20000 //| B3
#define sAN10 0x40000 //| B1
#define sAN11 0x80000 //| B4
#define sAN12 0x100000 //| B0
#define sAN13 0x200000 //| B5
#define NO_ANALOGS 0 // None
#define ALL_ANALOG 0x1F00FF // A0 A1 A2 A3 A5 E0 E1 E2 B0 B1 B2 B3 B4 B5
En otras palabras si queremos usar el puerto analogo AN0 que vendria a ser el PIN2 del
PIC declaramos la instrucción:
setup_adc_ports(sAN0); //Pongo el puerto AN0 como analogo
o opcionalmente digitando el numero en binario o hexadecimal o decimal:
//Pongo el puerto AN0 como analogo
setup_adc_ports(0b00000001); //Binario
setup_adc_ports(0x01); //Hexadecimal
setup_adc_ports(1); //Decimal
Ahora, si por ejemplo queremos combinar varios pines como entradas ADC, por
ejemplo, deseamos configurar estas entradas AN0, AN1, AN7 y AN13, debemos
configurarla usando directamente los numeros en cualquier (escoge uno de los 3)
representación (Binario, Hexadecimal o Decimal), para esto, les recomiendo usar la
calculadora de Windows, y Colocarla en Formato Programador, y luego hacer la suma
en Hexadecimal del numero que corresponde cada entrada analoga: AN0 (0x01),
AN1(0x02), AN7( 0x80) y AN13(0x200000). En lo personal yo prefiero siempre
trabajar en Hexadecimal.
//Pongo el puerto AN0,AN1,AN7 y AN13 como analogos
setup_adc_ports(0b001000000000000010000011); //Binario
setup_adc_ports(0x200083); //Hexadecimal
setup_adc_ports(2097283); //Decimal
Voltaje de Referencia en microcontrolador PIC
Existe una instrucción en el compilador que nos permite configurar el VREF de un
microcontrolador PIC en el compilador CCS C Compiler:
setup_adc_ports(ALL_ANALOG, reference)
reference: corresponde a la referencia de voltaje para con la cual queremos configurar
el ADC. Las opciones válidas dependen del dispositivo utilizado; por eso debes
buscar en el archivo .h del dispositivo para ver todas las opciones. Las opciones típicas
en el 16F877A, 16F887 y 18F4550 incluyen:
Opciones Descripción
VSS_VDD Rango de 0 a Vdd
VREF_VREF Rango de VREF- a VREF+
VREF_VDD Rango de VREF- a Vdd
VSS_VREF Rango de 0 a VREF+
por ejemplo si deseamos un voltaje de referencia típico de 3.3v, simplemente en el PIN
RA3/AN3/ VREF+ conectamos el voltaje de referencia, o sea 3.3v.
Y configuramos el comando de la siguiente forma:
setup_adc_ports(ALL_ANALOG,VSS_VREF);
EJEMPLO CONVERSOR ADC PIC
Hacer un termómetro digital en el PIC16F887 utilizando un sensor de temperatura
(LM35) conectándolo en el pin RA0. Utilice la conversión análogo digital para poder
leer la temperatura del sensor y visualice la temperatura en un LCD16x2.
Como se muestra en proteus, cuando el sensor LM35 marca 25°C, es porque el sensor
está enviándole al PIC 0.25V. Con base a este dato se puede hacer la conversión de
BITS a Temperatura en grados celcius. (Recordando que cuando el PIC lee el puerto
análogo digital, lo que almacena es un numero en bits de 0 – 1024). Utilizando un regla
de tres, se puede determinar que.
Teniendo los bits que se leen a los 25 grados calculamos el factor para transformar bits a
grados celcius.
Demostración Práctica
<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow:
hidden; line-height: 0;" class="mce_SELRES_start"></span>
Código de Implementación:
A continuación se presenta el código para que lo copies y lo pegues en tu compilador y
puedas reproducirlo. Recuerda que para ver el código debes compartir o darle me gusta
al contenido de este post para que más personas se beneficien de esta información.
[sociallocker]
>> CLICK ACA PARA DESCARGAR ESQUEMA Y CODIGO EL
EJEMPLO EN PROTEUS 8 <<
#INCLUDE <16f887.h>
#device adc=10
//#USE DELAY(CLOCK=4000000) // Reloj interno 4MHz
#use delay(clock=4000000,crystal)//Crystal Externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#INCLUDE <LCD.C>
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
void main()
{
set_tris_a(0b00000001); //Pongo el RA0 como entrada
set_tris_d(0); //Pongo el PuertoD como Salida
setup_adc_ports(all_analog); //Pongo todo el puerto a analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
lcd_init(); //Inicializo el LCD
lcd_putc("\f"); //Borro el LCD
while(1)
{
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 1,1
lcd_putc("LA TEMPERATURA");
lcd_gotoxy(2,2); //Ubiquese en la posicion 2,2
printf(lcd_putc,"ES C= %f ",tem); //Muestra el valor numerico de la
conversionconversion
delay_ms(1000);
}
}
[/sociallocker]