Un conversor analógico digital(ADC): Convierte una señal analógica a digital.
Una señal análoga: Es una señal que es continua; en la que es variable su amplitud y periodo en función del tiempo. Esta puede tomar valores infinitos dentro de un tiempo determinado.
Una señal discreta: Son aquellas que pueden tomar valores finitos dentro de un intervalo de tiempo.
El microcontrolador PIC16F887 tiene 14 canales análogos los cuales son: AN0, AN1, AN2, AN3, AN4, AN5, AN6, AN7, AN8, AN9, AN10, AN12 y AN13; que están distribuidos en los puertos A, B y E.
Conversor ADC de 8 bits: Cuando la resolución es de 8 bits, la señal digitalizada trabaja entre 0-255. Con 8 bits el mayor número binario que puede tener es :
La resolución: Es el voltaje necesario (señal analógica) para lograr en la salida(señal digital), que se presente un cambio de bits.
N: El número de bits que tiene el conversor ADC.
Vin: Voltaje que hay que poner a la entrada del conversor ADC, para conseguir una conversión máxima.
Ejemplo:
- La resolución: 5v/255=19,6mv/paso.
- 255*(5v/255): 5v
El 19,6mv/paso, indica los pasos análogos que hay que dar para producir un incremento de un bit en la salida digital.
Para determinar en todo momento a qué número digital aproximado corresponde la señal análoga de entrada, se utiliza la siguiente expresión:
V_entrada/Resolución.
Ejemplo:
Si la señal análoga es 2,5v, el número digital aproximado es:
2,5v/19,6mv= 127,55 bits
Si la señal análoga es 5v, el número digital aproximado es:
5v/19,6mv=255bits
Funciones del programa
#INCLUDE <16F887.h>: La librería que se va a trabajar es del pic16F887.
#USE DELAY(CLOCK=4000000): Se configura la frecuencia del reloj del sistema a 4MHZ.
#FUSES XT, NOPROTECT,NOWDT: Son los fusibles de configuración. En donde:
#FUSES XT: Se habilita el oscilador del sistema.
#FUSES NOPROTECT: Se desactiva la protección contra lectura de la FLASH.
#FUSES NOWDT: Se desactiva Watch Dog Timer.
#device adc=8: Indica la cantidad de bits que usará el conversor, en este caso, el conversor es de 8 bits.
#BYTE PORTC=0X07: Define la variable PORTC y se sitúa en la dirección 0X07 de la memoria RAM.
#BYTE TRISC=0X87: Define la variable TRISC que se sitúa en la dirección 0X87 de la memoria RAM.
TRISC=0: Indica que el puerto C se configura como salida digital.
INT8 q: El campo que se define como una variable entera de 8 bits.
setup_adc_ports(PIN_A0): Permite configurar los pines análogos o digitales de la conversión ADC.
setup_adc(ADC_CLOCK_INTERNAL): Configura el reloj interno utilizado en la conversión.
set_adc_channel(0): Configura el canal a leer. En el programa se utiliza el canal AN0.
read_adc: Lee el valor digital del conversor análogo a digital.
Materiales:
- Un PIC16F887.
- Un potenciómetro de un 1k.
- Ocho resistencias de un 220Ω.
- Ocho leds rojos.
- Un voltímetro.
Explicación del circuito:
La señal análoga varía con el potenciómetro de 0V a 5V. Mediante los leds se visualiza el valor digital entre 0 a 255.
Diagrama esquemático.
Video Explicativo.
Código fuente.
#INCLUDE <16F887.h> //Librería del pic 16f887 #device adc=8; //Selecciona la cantidad de bits con que se trabajará, en este caso con el conversor de 8 bits #FUSES NOWDT,XT,NOPROTECT //Configuración del microcontrolador #USE DELAY(CLOCK=4000000) //Configuración del reloj interno #BYTE PORTC=0X07 //Definir los registros que esta en la dirección 0x07 y 0x87 de la memoría RAM #BYTE TRISC=0X87 void main(){ TRISC=0; //Configuración como salidas digitales INT8 q; setup_adc_ports(PIN_A0); //Configura los pines como análogos o digitales. En este caso A0 es configurado como análogo. A0,A1 Y A3 son analógos el resto digital setup_adc(ADC_CLOCK_INTERNAL);//Configuración del reloj interno o la señal de reloj utilizado para la conversión for(;;){ set_adc_channel(0); //Seleccionar el canal, en este caso, se selecciona AN0 delay_us(20); //Un retardo para esperar que haga la conversión q=read_adc(); //Lee el número de la conversión A/D y lo guarda en q PORTC=q; //Lo que hay en q lo guarda en el puerto c delay_ms(50); //Retardo } }