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.
También te invito a que te unas a la comunidad de CONTROLEROS y CONTROLERAS en YouTUBE para seguir aprendiendo de estos temas de microcontroladores, control, programación, instrumentación entre otros:
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 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 análoga 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 más resolución tenga nuestro microcontrolador, mas pequeños pueden ser los rectangulos que se forman y más aproximado puede quedar nuestra señal análoga. En otras palabras aumentamos el muestreo de la señal para aproximarnos de mejor forma a la forma de onda original.
Para contextualizar la importancia del ADC del PIC, vamos a suponer por ejemplo que si se tiene un sensor de nivel capaz de generar una señal análoga, esto quiere decir que dicho sensor no solo está en la capacidad de indicar si el tanque esta lleno o vacío, sino que además indica la altura del nivel del tanque en todo momento donde la señal será proporcional al nivel del tanque.
Para poder detectar las señales análogas con un microcontrolador PIC debemos emplear el conversor A/D (ADC PIC) el cual toma la señal análoga y la transforma en un valor o número digital (binario).
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 y su conversión a un número digital seria de 0 a 0v y de 1023 a 5v.
Sin embargo el conversor A/D de un microcontrolador PIC posee dos niveles de referencia VREF+ y VREF- que indican entre que valores estará comprendida la señal análoga de entrada.
Es importante destacar que el voltaje mínimo diferencial es de 2V, es decir la diferencia entre VREF+ y VREF- no puede ser mayor a 2V.
En la siguiente figura, puede notar que VREF- y VREF+ están ubicados en los pines 4 y 5 respectivamente.
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-=0V:
Por lo tanto, cuando la señal análoga sea 0V, a esta señal le corresponde un número de 0. Cuando sea 2.5V le corresponde un número de 512. Si es 5V, le corresponde un número de 1023. Claro está, que puede tomar cualquier valor entre 0-1023.
Si VREF+=5V y VREF-=0V 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);
Secuencia de Leds con PIC (Instrucciones de Rotación)
Termopar tipo K con PIC
Como Hacer un Control PID de Temperatura con Arduino
EJEMPLO CONVERSOR ADC PIC
Hacer un termómetro digital en el PIC16F887 utilizando un sensor de temperatura lineal (LM35) conectándolo en el pin RA0.
Utilice la conversión análogo digital ADC PIC para poder leer la temperatura del sensor y visualice la temperatura en un LCD16x2.
Solución
Como se muestra en proteus, cuando el sensor LM35 marca 25°C, es porque el sensor está enviándole al PIC un voltaje de 0.25V.
Con base a este dato se puede hacer la conversión de BITS a °C (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.
Conociendo el número de bits que arroja el sensor a los 25 °C se procede a calcular un factor para transformar los bits a °C .
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.
#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); } }
Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:
👉 Invitar a Sergio a un Café ☕️
Que esten muy bien, nos vemos en la siguiente entrada.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.