Hola controleros y controleras, bienvenidos nuevamente a otra entrada de nuestro curso de microcontroladores PIC, hoy vamos a aprender a utilizar la conversión análogo digital del PIC, el cual nos va a permitir leer señales físicas del mundo real en nuestros proyectos.
Antes que nada, te invito a que le des un vistazo a todo nuestro 👉 curso de PIC Gratuito.
Tabla de Contenido
Convertidor Análogo/Digital ADC PIC
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).
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.

• 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 PIC
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 la patica RA2/AN2/ 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.
1 |
#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.
1 |
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.
1 |
SETUP_ADC (Modo) |
Selecciona el tipo de reloj del conversor A/D Modo puede ser:
1 2 3 4 |
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.
1 |
SET_ADC_CHANNEL (Canal) |
Especifica el canal a utilizar por la función
1 |
READ_ADC() |
3. Leer el valor de la conversión
1 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 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:
1 |
setup_adc_ports(sAN0); //Pongo el puerto AN0 como analogo |
o opcionalmente digitando el numero en binario o hexadecimal o decimal:
1 2 3 4 |
//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.
1 2 3 4 |
//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 |
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
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.
>> CLICK ACA PARA DESCARGAR ESQUEMA Y CODIGO EL EJEMPLO EN PROTEUS 8 <<
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#INCLUDE <16f887.h> #device adc=10 #USE DELAY(CLOCK=4000000) #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); } } |
Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.
ALFONSO CAMPOS
28 Nov 2018Hola Sergio: En la introducción:
Convertidor Análogo/Digital ADC PIC
Una señal análoga es una señal continua, seria preferiblemente expresar: Una señal análoga es una señal variable o que varía de cero a un valor máximo de voltaje positivo y un valor máximo negativo en el tiempo.
Luego dices: por ejemplo una señal de 0 a 5V es una señal análoga y puede tomar valores (1V, 2V, 2.5 V, etc.). Se diría para mejor comprensión: Tomemos por ejemplo una señal análoga que varía de cero (0) a cinco (5) voltios. Esta señal llegará a tomar valores de +1V, +2V, +2,5V etc, hasta llegar a +5V y después retorna hasta cero voltios. Seguidamente obtiene los valores desde cero (0) hasta -5 Voltios de igual manera. (Dibujar una señal análoga explicando los puntos referentes.
Gracias
Sergio C
28 Nov 2018Gracias Alfonso por los comentários. He modificado el texto para ampliar un poco mejor la definición. Saludos
Marcos serna
18 Mar 2018Que excelente pagina… Una pregunta quiero hacer un termometro pero que me marque positivos y negativos pero en un display de 7 segmentos que el mayor sea 9 grados y -9 grados pero no encuentro como hacerle. Espero me puedas ayudar, gracias saludos.