GRUPO A02-A03
INDICE
Introducción 3
Error de Cuantificación 5
Temporización 11
Ejemplo de Conversión 14
Bibliografía 17
2
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
1. INTRODUCCIÓN
El microcontrolador PIC16F877 de Microchip puede desempeñar muchas funciones pero
en la que nos vamos a centrar aquí es la de su conversor analógico-digital. Antes de meternos de
pleno en su funcionamiento vamos a comentar los conceptos básicos de una conversión de una
señal analógica a digital.
Tanto nuestra voz como muchas de las señales que se envían a través de un medio guiado
como un cable o no guiado como es el aire son de tipo continuo y pueden tomar infinitos valores a
lo largo del tiempo. Por ejemplo podemos decir que la señal eléctrica que se transmite de la tarjeta
de sonido al altavoz es continua y puede tomar cualquier tensión entre los dos hilos.
El interés en digitalizar una señal puede surgir por varios motivos: el hecho de querer
almacenarla en un soporte digital o transmitirla digitalmente para poder reconstruirla, poder tratar
con programas los valores analógicos que dé un sensor, etc.
El muestreo implica que tenemos que coger una muestra de la señal cada T segundos ya
que no hay memoria suficiente capaz de almacenar los infinitos puntos de una señal en un
intervalo cualquiera de tiempo. En el ejemplo de las figuras se ha acotado un segundo de tiempo y
5 V de tensión de entrada analógica del PIC.
3
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
La cuantificación surge por el mismo motivo que el muestreo pero para el eje de ordenadas:
una vez tenemos una muestra su amplitud puede tomar infinitos valores, debemos redondear entre
unos valores fijos a lo largo de ese eje. Estos valores van a depender del número de bits que
vayamos a almacenar para cada muestra, por ejemplo, en la imagen se cogen 4 bits y con ellos se
pueden formar 16 combinaciones y por lo tanto 16 distintos niveles en los que se puede dividir el
eje. El PIC cuantifica con 10 bits luego son 1023 niveles.
4
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
2. ERROR DE CUANTIFICACIÓN
2.1. MUESTREO
2.2. CUANTIFICACIÓN
5
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
Ej. A partir de la potencia de una señal, podemos saber que error estamos
cometiendo.
- Cuantificación vectorial: se basa en cuantificar según las muestras vecinas, resulta más eficiente
cuantificar los datos en bloques de N muestras.
6
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
bit 7-6: ADCS1:ADCS0: En estos dos bits se hace la selección de la frecuencia de reloj para el
Convertidor A/D.
00 Fosc/2
01 Fosc /8
10 Fosc/32
11 FRC (Procede del oscilador RC interno)
7
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
bit 5-3: CH2:CH0: Aquí se selecciona el canal analógico por donde entrará la señal a digitalizar.
En este microcontrolador tenemos 8 canales de entrada al Conversor A/D
000 = Canal 0, (RA0/AN0)
001 = Canal 1, (RA1/AN1)
010 = Canal 2, (RA2/AN2)
011 = Canal 3, (RA3/AN3)
100 = Canal 4, (RA4/AN4)
101 = Canal 5, (RA5/AN5)
110 = Canal 6, (RA6/AN6)
111 = Canal 7, (RA7/AN7)
8
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
El registro ADCON1 es uno de los registros del convertidor A/D del PIC16F877, se trata
de un registro de configuración de los pines del puerto, este registro se compone de 8 bits, los
cuales describamos su función a continuación:
Bit 3-0: PCFG3:PCFG0: bits de configuración de los canales de entrada del convertidor A/D. Se
utilizan para configurar las patillas como E/S digital o como entrada analógica de acuerdo con la
siguiente tabla:
9
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
Estos dos registros cuando el convertidor A/D está en OFF y no se utiliza, pueden utilizarse
como dos registros de 8 bits de propósito general.
Por lo tanto, los 16 bits que forman el registro ARDESH-ARDESL con ADFM=1 tiene
los 6 bits de mayor peso a cero y con ADFM=0 los 6 bit de menor peso están a cero, en los 10 bits
restantes se almacena el resultado de la conversión.
10
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
4. TEMPORIZACIÓN
Para introducirnos vamos a llamar a ‘Tad’ como el tiempo de conversión por bit.
En la figura 3.1 tenemos un esquema de lo que seria el proceso medido en tiempo para estar
seguros de que se ha realizado la conversión.
Pero tenemos que tener en cuenta que para una nueva conversión podemos preparar la
configuración del módulo conversor A/D y si se desea realizar una interrupción del modulo
conversor A/D, se exige un mínimo de 2*TAD para realizar una nueva conversión.
Figura 3.1
En la figura 3.2 tenemos una ecuación que nos resolverá el tiempo de adquisición
asumiendo un error explicado anteriormente, para 1024 pasos del convertidor A/D. Estos cálculos
han sido basados en el esquema de uso de la figura 3.21. TACQ seria el tiempo de respuesta del
amplificador, TC seria el tiempo de carga del condensador (figura 3.22) que guarda el dato y
TCOFF seria el coeficiente de temperatura (que este solo se utilizaría para temperaturas > 25º).
11
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
Figura 3.21
Figura 3.22
¾ 2 TOSC
¾ 8 TOSC
¾ 32 TOSC
¾ Oscilador interno RC (2-6 µs)
Para realizar conversiones correctas el reloj del convertidor A/D debe seleccionarse para
asegurar un tiempo mínimo de TAD de 1,6 mS. La figura 3.3 siguiente muestra los tiempos de TAD
dependiendo de la señal de reloj del micro.
12
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
Nota.-
1. Si la fuente es el oscilador RC tiene un TAD típico de 4 µs, pero puede variar entre 2 –6
µs.
2. Cuando la frecuencia del dispositivo es mayor de 1MHz, la fuente del oscilador RC para
la conversión A/D se recomienda solo si se trabaja en el modo Sleep.
3. Para dispositivos de tensión mayores (LC), comprobar las características eléctricas
Sugerencia:
Una cosa a tener en cuenta, seria mantener las frecuencias máximas que se indican en la
tabla, ya que, si por ejemplo utilizamos una frecuencia de 10 MHz entonces tendríamos que dividir
por el mismo numero que si utilizamos una frecuencia de 20 MHz, por lo que estaríamos haciendo
que el conversor trabajara mas despacio de lo que podría trabajar.
El par de registros no se modificarán parcialmente con los bits que se hayan completado
hasta el momento. Es decir, los registros ADRESH:ADRESL seguirán conteniendo el valor de la
última conversión completa (o el último valor que se haya escrito en ADRESH:ADRESL)
después de abortar la conversión A/D, es requerido el TAD de espera para realizar la próxima
adquisición comience. Después de 2 TAD de espera, la adquisición en cauce se comienza
automáticamente.
En la Figura 3.3, después de poner el bit GO a uno, la primera vez el segmento tiene un
TCY mínimo y un TAD máximo.
Nota:
13
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
El conversor lo utilizamos para comparar los niveles de tensión con la salida analógica del
sensor y así poder muestrearla y cuantificarla. La tensión proporcionada por el REF02 la
conectamos al conversor A/D por la patilla AN3.
14
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
• Selecciona _A/D():Esta función sirve para seleccionar el canal por donde queramos hacer la
conversión (hay 8 canales posibles), en este caso hemos elegido el canal 1 que es donde hemos
conectado el sensor.
• Arranca_A/D(): Esta función pone el bit GO/DONE en 1 para que comience a convertir.
#include<16f877.h>
#include<reg.h>
#fuses HS, NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay(clock=20000000)
void inicia_AD(void);
void selecciona_AD(unsigned num);
void arranca_AD(void);
void leer_AD(void);
main()
{
unsigned canal;
unsigned long resultado;
15
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
void inicia_AD(void)
{
ADCON0=0b10000001; //Fosc/32 ; channel 0
ADCON1=0b10000101; // 4 ultimos bits dependiendo de la tabla 1
}
void arranca_AD(void)
{
ADGO=1; //ponemos en marcha el conversor
}
void leer_AD(void)
{
char alto,bajo;
long total;
return(total);
}
tabla 1:tabla de configuraciones de la entrada del A/D.
16
Conversor Analógico Digital del PIC16F877 Grupo A02-A03. EPSA-UPV, marzo 2005.
6.-BILBIOGRAFÍA
17