Uc PIC - Conversión Analógico - Digital
Uc PIC - Conversión Analógico - Digital
Conversión Analógico-Digital
Un convertidor A/D produce un código digital de salida que es función del voltaje analógico de entrada y
del voltaje de referencia. El proceso de conversión A/D suele tomar un cierto tiempo y es generalmente
más complejo y largo que el proceso de conversión D/A. Existe una infinidad de métodos de conversión
A/D.
Un convertidor A/D o ADC (Analog to Digital Converter) tiene la forma general de la figura siguiente.
Observamos que tiene 10 líneas de entrada analógica (el PIC18F4550 cuenta además con los pines AN5,
AN6 y AN7) multiplexadas, es decir, hay un solo ADC para todas las líneas. Esto significa que solo una línea
puede convertirse a la vez.
Se trata de un ADC de aproximaciones sucesivas con una resolución de 10 bits, es decir, las señales
analógicas de entrada se convierten en números binarios de 10 bits.
El ADC tiene asociados 5 registros:
ADRESH:ADRESL -> Resultado de la conversión (necesita dos registros de 8 bits)
ADCON0, ADCON1, ADCON2 -> Registros de control
Registro ADCON0:
Registro ADCON1:
Registro ADCON2:
Voltaje de referencia
El voltaje de referencia se puede seleccionar entre las líneas positiva y negativa del voltaje de alimentación
(VDD y VSS) o el voltaje en los pines RA3/AN3/VREF+ y RA2/AN2/VREF-/CVREF.
El tiempo de adquisición es necesario para que el capacitor de entrada CHOLD se cargue completamente
hasta el valor del voltaje presente en el canal de entrada analógico. La impedancia de fuente (RS) y la
impedancia del switch interno de muestreo (RSS) afectan el tiempo de adquisición. Se recomienda una
impedancia de fuente máxima de 2,5 kΩ.
Cada vez que se selecciona o cambia un canal analógico, éste debe ser muestreado por al menos el tiempo
mínimo de adquisición antes de iniciar la conversión. Para una impedancia de fuente RS=2,5kΩ a
temperatura ambiente el tiempo mínimo de adquisición aproximado es de 2,45 µs; se aconseja habilitar
un tiempo mayor a dicho mínimo para realizar una correcta adquisición. Cuando se inicia la conversión, el
capacitor CHOLD se desconecta del pin de entrada.
Selección y configuración del tiempo de adquisición
El tiempo de adquisición permite configurar si se utilizará un tiempo de adquisición predeterminado y
seleccionar dicho tiempo entre algunas opciones preestablecidas. En el registro ADCON2:
Los tiempos relativos al funcionamiento del ADC se miden en una unidad denominada TAD. Un TAD es el
tiempo necesario para convertir un bit del resultado. Por ejemplo, una vez iniciada, la conversión
analógico-digital para obtener el resultado de 10 bis tarda un total de 11 TAD.
El tiempo de adquisición se determina con los bits ACQT2:ACQT0 (ADCON2<5:3>) desde 2 TAD hasta 20
TAD.
Después de configurar el ADC, se pone a 1 el bit GO/#DONE para iniciar la conversión y entonces el ADC
continúa muestreando el voltaje de entrada por el tiempo de adquisición seleccionado y luego
automáticamente inicia la conversión.
Si se selecciona un tiempo de 0 TAD, el ADC interrumpirá el muestreo en cuanto se ponga a 1 el bit
GO/#DONE y el proceso de conversión iniciará inmediatamente, por lo que el usuario debe habilitar
manualmente un tiempo de adquisición desde que se selecciona el canal de entrada analógico hasta la
activación del bit GO/#DONE. Esta es la opción por defecto del ADC.
En cualquier caso, al concluir la conversión, el bit GO/#DONE se pone a 0, el flag de interrupción ADIF se
pone a 1 y el ADC empieza a muestrear el canal seleccionado nuevamente.
Selección del reloj de conversión (TAD)
La duración del TAD se puede seleccionar entre siete opciones:
• 2 TOSC
• 4 TOSC
• 8 TOSC
• 16 TOSC
• 32 TOSC
• 64 TOSC
• Oscilador RC interno del ADC
El tiempo TOSC es el período del oscilador del microcontrolador. Por ejemplo, para una fOSC=8 MHz, el
TOSC es de 1/8 MHz = 0,125 µs.
Para que la conversión A/D se realice correctamente, el TAD debe ser el menor posible pero mayor que el
TAD mínimo del dispositivo que para el PIC18F2550 es de aproximadamente 0,7 µs.
En esta segunda figura se observa lo que ocurre cuando se selecciona un tiempo de adquisición de 4 TAD.
Si el bit GO/#DONE se pone a 0 en medio de una conversión, ésta es abortada y el par de registros
ADRESH:ADRESL no serán alterados respecto del valor que contenían después de la última conversión
correcta. Después de que se completa o se aborta una conversión, se requiere esperar al menos 3 TAD
para iniciar la siguiente adquisición. Después de ese tiempo, la adquisición del canal seleccionado se inicia
automáticamente.
En ambas figuras se observa que hay un ciclo TAD para la descarga del capacitor de muestreo. Esto
garantiza una óptima adquisición para la siguiente conversión.
Al ADC del PIC12F675 también tiene resolución de 10 bits. Tiene 4 entradas analógicas, pero solo una de
ellas se puede leer a la vez, la entrada activa se selecciona mediante un multiplexor interno dedicado a
este propósito que la conecta al circuito sample & hold. Para poder realizar la conversión el ADC necesita
una fuente de tensión de referencia que puede seleccionarse desde dos orígenes distintos, uno puede ser
la alimentación del microcontrolador y el otro puede ser una tensión de referencia externa suministrada
al pin destinado a este propósito (GP1/AN1), y además, se necesita una fuente de pulsos de reloj. El
resultado de la conversión se obtiene en dos registros de 8 bits cada uno: ADRESH y ADRESL.
Configuración del ADC del PIC12F675
La principal dificultad a la hora de configurar el módulo ADC se encuentra en la sincronización del reloj
principal con la velocidad real del convertidor, cuya respuesta es más lenta. Para ello, el microcontrolador
dispone de un divisor de frecuencia entre el reloj principal y la entrada de reloj del ADC.
Para seleccionar la escala del divisor se necesitan 11 TAD para realizar cada conversión. El TAD es un pulso
de reloj de un ancho determinado que establece la velocidad de conversión del ADC. La hoja de datos
indica que como mínimo tiene que ser de 1.6 µs, por lo tanto, en la tabla, para la frecuencia de reloj
seleccionada, se buscará la configuración del divisor que dé como resultado 1.6 µs o en su defecto si no
existe, la inmediata superior.
(1) La fuente de reloj RC del ADC tiene un TAD mínimo típico de 4 µs.
(2) Estos valores superan el tiempo mínimo requerido para el TAD.
(3) Para una conversión rápida se recomienda otra fuente de reloj.
(4) Si la frecuencia de operación del microcontrolador es mayor que 1 MHz, la fuente de reloj RC del
ADC se recomienda solamente cuando la conversión se hace en modo de bajo consumo (SLEEP).
Al tiempo de conversión del canal hay que añadirle el tiempo de lectura de los registros de salida. Cuando
se muestra el valor de un solo registro de 8 bits, el microcontrolador tarda 1 ciclo de instrucción (4 ciclos
de reloj) y, 2 ciclos de instrucción (8 ciclos de reloj) cuando el formato de salida es de 10 bits porque el
resultado de la lectura se encuentra en dos registros de 8 bits. Se tendrá que hacer una espera mínima de
10 µs si se realiza un cambio de configuración en tiempo de ejecución para estar seguro que la lectura es
correcta. El tiempo de espera es necesario para que el módulo complete su nueva configuración y se
estabilice. La impedancia de la fuente de señal aplicada a la entrada no debe superar los 10 kΩ para
garantizar que el acoplamiento es correcto. El módulo tiene un flag de aviso de conclusión de lectura (ADIF)
y permite interrupciones. También puede funcionar en el modo de bajo consumo (SLEEP) del micro
mediante el reloj interno RC. Se puede abortar la conversión en proceso, pero después de esto hay que
esperar 2TAD antes de iniciar una nueva conversión y, mientras tanto, los registros de salida mantienen el
valor de la conversión anterior.
El ADC del PIC12F675 tiene asociados dos registros
ADRESH:ADRESL -> Resultado de la conversión (necesita dos registros de 8 bits)
ANSEL, ADCON0 -> Registros de control
Registro ANSEL:
Con el bit ADFM seleccionamos la justificación del resultado: 0 para justificación a la izquierda (opción por
defecto) y 1 para justificación a la derecha.
El bit ADON permite encender o apagar el ADC.
El bit VCFG selecciona el voltaje de referencia Vref+ del ADC. Con 0 es el voltaje de alimentación del
microcontrolador (opción por defecto) y con 1 es el voltaje conectado al pin GP1/AN1.
Poniendo el bit GO/DONE a 1 se inicia la conversión, volviendo automáticamente a 0 cuando ésta concluye.
Los bits CHS1:CHS0 permiten seleccionar el canal a convertir. Esto se hace antes de iniciar la conversión.
Es muy diferente a seleccionar qué canal es analógico porque pueden haberse configurado dos canales
analógicos, pero solo se puede convertir uno a la vez. Estos bits seleccionan qué canal debe convertirse en
un determinado momento.
Tiempo de adquisición
Para que el ADC alcance la precisión correcta, el capacitor de muestreo CHOLD debe cargarse
completamente al nivel de voltaje de la entrada a convertir. El tiempo de carga de CHOLD es el denominado
tiempo de adquisición. Este tiempo es afectado directamente por la impedancia de la fuente de señal (RS)
y por la impedancia del switch de muestreo (RSS). La impedancia RSS varía con el voltaje de alimentación
VDD y el máximo valor recomendado para RS es 10 kΩ. Si la impedancia disminuye, el tiempo de adquisición
se acorta.
Después de seleccionar el canal de entrada a convertir (bits CHS1:CHS0), se debe dejar pasar el tiempo de
adquisición antes de iniciar la conversión. Para calcular el tiempo de adquisición se puede usar la ecuación
siguiente:
En el ejemplo se calcula el tiempo de adquisición para una temperatura de 25°C y condiciones estándar,
lo que arroja un resultado de alrededor de 20 µs, que sería el tiempo mínimo de adquisición que habría
que dejar pasar después de seleccionar un canal y antes de iniciar una conversión.
Pasos para realizar la conversión A/D con el PIC12F675
1. Configurar el módulo ADC:
- Configurar qué pines serán analógicos (ANSEL).
- Configurar el reloj de conversión TAD (ANSEL).
- Configurar el voltaje de referencia (ADCON0).
- Seleccionar la justificación del resultado: izquierda o derecha (ADCON0).
ADC_Read(): Inicializa el módulo ADC para funcionar con el reloj RC y luego lee y devuelve el valor
analógico del canal especificado. Lleva como argumento el canal a leer en formato unsigned char.
Ejemplo:
DatoADC=ADC_Read(0); // Configura el ADC y lee el valor analógico del canal 0.