TECNICAS DIGITALES II
Conversor ADC en MPLABX
TEMA: Uso de conversor ADC en MPLABX
Veremos en esta guía como configurar y utilizar el conversor ADC de un microcontrolador PIC. En
este caso trabajaremos con el PIC16F887 debido a que es el que incorpora la placa MCE Starter Kit.
Como primer paso podemos ubicar en la
hoja de datos la parte del conversor, y
particularmente, el esquema que vemos a
la derecha.
Observamos que es un solo conversor y
que tiene un multiplexor en la entrada que
da la posibilidad de tener hasta 14 canales
analógicos, mas una referencia fija o la
tensión de referencia del comparador.
Observamos que el bit para prender el
conversor es ADON y el bit para empezar
a convertir es el / . El resultado
de la conversión lo almacenará en
ADRESH y ADRESL. Por su parte CHS
seleccionara que canal convertir.
Vamos a calcular el valor que nos dará el conversor, en función de la tensión de entrada, las
tensiones de referencia y considerando que en este caso el conversor tiene 10 bits. Tomamos como
referencia la alimentación del microcontrolador, por lo tanto:
( )
= que representa para el bit LSB: = = 4,8828125
Considerando VREF+ = +5V y VREF- = 0V, en nuestro caso podemos expresarla así:
. 1024
=
5
Para comenzar creamos el proyecto, le
asignamos el nombre TP_PIC_Nro_8.
Generamos la palabra de configuración y
pegamos en el código, junto con el
archivo de cabecera.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
El programa principal se muestra en la imagen
de la izquierda.
Por un lado se inicializa el microcontrolador,
luego se invoca a la función que convierte el
canal del conversor. Esta lectura esta
condicionada al pin RA0 del puerto A, sólo
para que no se convierta el ADC a la velocidad
de ciclado del programa.
En la rutina Init_MCU se configura el puerto a
como entrada digital.
El único módulo que usamos en este caso es el
DC, por lo que solo invocamos a la rutina
Init_ADC que es la encargada de esta tarea.
En la imagen de la derecha observamos
la inicialización del conversor.
Como primer paso seleccionamos el
justificado del resultado y las tensiones
de referencias del conversor, esto sobre el
registro ADCON1. Luego configuramos
los puertos como entradas y analógicos
(ver datasheet).
Al final configuramos, sobre ADCON0,
la frecuencia de clock del ADC, el canal
que vamos a convertir y prendemos el
conversor.
En este caso la función GET_ADC
digitaliza el canal analógico y además
convierte el resultado a BCD.
Como se observa, el resultado del
conversor ADCHI:ADCLO se
transfiere directamente a los registros
RESULTHI:RESULTLO, los cuales
son tomados por la función que los
convierte a BCD.
Si uno quiere realizar algún tipo de
escalado o calculo con el valor del
ADC es en ese traspaso de datos que se
puede hacer.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
Ahora veamos la función que digitaliza la señal
analógica.
La secuencia es: poner en ALTO el bit GO del
registro ADCON0 y esperar que se ponga a
BAJO cuando finaliza la conversión.
Luego se mueve el resultado de la conversión
de los registros ADRESH:ADRESL a
ADCHI:ADCLO.
En la imagen de la izquierda se observa el
código de la función que nos falta, la encargada
de convertir a BCD el resultado de la
conversión. Esta rutina esta implementada con
el método de desplazamiento y sumar 3.
El tema importante en esta rutina, además de la
conversión a BCD, es la de el uso de punteros.
En estos microcontroladores el registro puntero
es el FSR (File Select Register) y el registro
donde encontramos el dato apuntado es INDF
(este registro es realidad no es un registro
físico).
Por lo tanto la secuencia es: primero poner en el
registro FSR la dirección, y luego por medio del
registro INDF podemos acceder a ese dato
apuntado.
Vamos a verlo en el código; en la instrucción MOVLW BCDL, lo que hace el compilador es
mover la dirección de la variable BCDL al registro W, y después, teniendo ya la dirección de la
variable la movemos al registro puntero FSR. Despues, dentro de la subrutina adjBCD, cuando
hacemos ADDWF INDF,W suma el dato presente en W, que es 3, con el dato apuntado por el FSR,
“contenido” en el INDF, y el resultado es almacenado en W.
Veamos la simulación de este código.
Primero ejecutamos el simulador, como
se observa en la imagen de la derecha.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
Luego en la
ventana de I/O
Pins agregamos
las señales de
AN5 y RA0.
Luego
modificamos el
valor que tiene
AN5 y ponemos,
por ejemplo,
2.5V.
Luego vamos
ejecutando paso a
paso el código.
Observar que
hasta este
momento el pin
RA0 figura como
entrada
analógica.
Luego de
ejecutar la
instrucción que
pasa a digital esa
entrada, el
simulador nos
muestra que es
un pin de entrada
digital.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
En esta parte de
la simulación si
no cambiamos el
valor en RA0 a
un ALTO, no se
ejecutara la
llamada a la
rutina
GET_ADC.
En esta parte
estamos a punto
de ingresar a la
subrutina que
convierte el valor
analógico de la
entrada, que para
la simulación le
pusimos 2.5V.
Ingresemos.
Ahora veremos
que el simulador
queda ejecutando
ese salto un par
de veces, es
porque esta
simulando el
tiempo que le
lleva al
conversor
digitalizar el
valor analógico
de la entrada.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
Una ves terminada
la conversión
seguimos
ejecutando el
programa. En la
imagen podemos
observar el valor
de ADCHI que ya
esta guardado, y
ahora ejecutamos
las instrucciones
para guardar la
parte baja.
Podemos ver que
el valor que nos
dio como
resultado la
conversión es
0x0200,
almacenados es
ADCHI:ADCLO.
Seguimos ejecutando el
programa y movemos los
valores de
ADCHI:ADCLO al otro
par de registros
RESULTHI:RESULTLO
para hace la conversión a
BCD.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
Ejecutamos paso a
paso o bien
presionamos F8
para que
directamente nos
muestre el
resultado.
Efectivamente si
convertimos
0x0200 a BCD
nos da 512.
Como llegamos al 512. Si recordamos, el bit LSB del conversor representa 4,8828125mV, por lo
tanto, si hacemos 2,5V dividido este número nos dará los 512.
Si ahora probamos
convertir 4,25V
Luego de convertir
a BCD obtenemos
870.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
Anexo I – Conversor ADC con multiples canales
Si observamos en la hoja de datos
podemos ver que el conversor
tiene un capacitor en la entrada,
denominado CHOLD que es el
encargado de mantener
almacenada la tensión de la
entrada al momento de convertir.
Esto hace un efecto de “memoria”
en el sentido de que si luego de
convertir un canal se cambia
“rápidamente” a otro canal, éste
capacitor tendrá almacenado el
valor de tensión del primer canal.
Si observamos en la imagen de la
izquierda plantea que el capacitor
CHOLD se desconecta
aproximadamente 100 ns después de
activar el bit de GO, y se vuelve a
conectar luego cuando se termina de
digitalizar la señal, por lo que se
podría cambiar de canal luego de
iniciar la conversión. Pero esto es
sólo una observación y habría que
probarlo.
De la imagen de la derecha podemos
ver que haciendo una demora de 5MS
estamos por encima del tiempo de
adquisición que requiere el
microcontrolador.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II
TECNICAS DIGITALES II
Ahora vamos a modificar el código del proyecto
anterior para que podamos digitalizar los
canales AN5 y AN3.
Veamos la función GET_ADC.
En esta primera parte de la función
seleccionamos el canal, que es el AN3, y luego
de hacer el retardo convertimos la entrada
analógica. Una vez terminada la digitalización,
escalado y conversión a BCD, almacenamos el
canal en la variable VAL_RA3, que es una
variable de 16 bits.
En esta segunda parte hacemos lo propio con el
canal AN5.
Si hacemos un cálculo rápido podemos
establecer que si tomamos una muestra cada 5
mseg tenemos un muestro a 200 Hz. Lo cual nos
lleva a decir que, según el teorema de Nyquist,
podemos digitalizar señales de hasta 100 Hz.
La función nueva que aparece ahora es la
de escalado, que sólo se puso en otra
función para hacer más “limpia” la
función original GET_ADC.
Facultad Regional Paraná – U.T.N.
Técnicas Digitales II