Capitulo9. Convertidor Analogo Digital Del ATmega32 (Español)
Capitulo9. Convertidor Analogo Digital Del ATmega32 (Español)
Capitulo9. Convertidor Analogo Digital Del ATmega32 (Español)
9.1 INTRODUCCIÓN
Características del Convertidor Analógico Digital:
• 10 bits de resolución.
• 0.5 LSB No lineal.
• ±2 LSB Precisión absoluta.
• 13 a 260µs de Tiempo de Conversión.
• Hasta 15,000 Muestras por segundo en su Máxima Resolución.
• 8 Canales de Entrada Multiplexados a una sola Terminación.
• 7 Canales de entrada diferenciales.
• Rango de Voltaje de Entrada de 0 a Vcc.
• Voltaje de referencia seleccionable a 2.56V.
• Modo de conversión única o libre.
• Inicio de Conversión del ADC por Auto disparo con fuente de interrupción.
• Interrupción de Conversión Completa del ADC.
• Cancelador de Ruido en Modo Sleep.
El ADC tiene un pin para la fuente de voltaje separado, AVCC. El AVCC no debe diferir
más de ±0.3 V de Vcc.
Los voltajes de referencia nominales internos 2.56V de AVCC son provistos dentro del
chip. El voltaje de referencia puede ser externamente desacoplado del pin AREF por un
capacitor para un mejor desempeño de ruido.
Operación
REFs del registro ADMUX. El voltaje de referencia interno puede ser desacoplado por
un capacitor externo en el pin AREF para mejorar la inmunidad al ruido.
El ADC genera un resultado de 10 bits el cual se presenta en los registros de datos del
ADC, ADCH y ADCL. Por default, el resultado se presenta con ajuste a la derecha, pero
puede ser opcionalmente presentado con ajuste a la izquierda colocando el bit ADLAR
en ADMUX.
El ADC tiene su propia interrupción la cual puede ser disparada cuando una conversión
se completa. Cuando el ADC accede al registro de datos, se prohíbe entre la lectura de
ADCH y ADCL sea disparada la interrupción aún si el resultado se pierde.
Usando la bandera de interrupción del ADC como una fuente de disparo hace que el
ADC comience una nueva conversión tan pronto como la conversión en curso finalice.
El ADC opera en modo libre, constantemente muestrea y actualiza el registro de datos
del ADC. La primera conversión debe ser iniciada escribiendo un uno lógico en el bit
ADSC en ADCSRA. En este modo el ADC ejecutará conversiones sucesivas
independientemente de la bandera de interrupción del ADC, ADIF se limpia o no.
Si el auto disparo esta habilitado, las conversiones únicas pueden ser iniciadas
escribiendo un uno en ADSC en el registro ADCSRA. ADSC también se usa para
determinar si una conversión está en progreso. El bit ADSC leerá un uno durante una
conversión, independientemente de cómo la conversión fue iniciada.
Cuando se inicia una sola conversión colocando el bit ADSC en ADCSRA, la conversión
inicia en la siguiente transición positiva del ciclo de reloj del ADC.
Una conversión normal toma 13 ciclos de reloj del ADC. La primera conversión después
de que el ADC se enciende (ADEN en ADCSRA se ponga a uno) toma 25 ciclos de reloj
del ADC para inicializar la circuitería analógica.
El muestreo y retención actual toma lugar 1.5 ciclos de reloj del ADC después del inicio
de una conversión normal y 13.5 ciclos de reloj del ADC después del comienzo de la
primera conversión. Cuando una conversión se completa, el resultado se escribe en el
registro de datos del ADC, y ADIF se activa. En el modo de conversión única, ADSC se
limpia simultáneamente. El software puede poner a uno ADSC de nuevo, y una nueva
conversión será iniciada en la primera transición positiva del ciclo de reloj del ADC.
conversión. En este modo, el muestreo y retención toma 2 ciclos de reloj del ADC
después de la transición positiva en la señal de la fuente de disparo. Tres ciclos de reloj
del CPU adicionales se usan para la sincronización lógica.
Cuando se usa el modo diferencial, a lo largo del auto disparo de una fuente a otra
conversión completa del ADC, cada conversión requerirá 25 ciclos de reloj del ADC.
Esto es porque el ADC debe deshabilitarse y rehabilitarse después de cada conversión.
En modo libre, una nueva conversión será iniciada inmediatamente después de que la
conversión se completa, mientras ADSC permanece en alto.
Las conversiones diferenciales son sincronizadas con el reloj interno CKADC2 igual a la
mitad de reloj del ADC. Esta sincronización se realiza automáticamente por la interfase
del ADC de cierta manera que el muestreo y retención ocurra en una fase específica de
CKADC2. Se inicia una conversión por el usuario (por ejemplo, en las conversiones
únicas, y la primera conversión libre) cuando CKADC2 esta en bajo tomará la misma
cantidad de tiempo que una conversión única (13 ciclos de reloj del ADC del próximo
ciclo de reloj preescalado). Una conversión se inicia por el usuario cuando CKADC2 esta
en alto y tomará 14 ciclos de reloj del ADC debido al mecanismo de sincronización. En
el modo libre, una nueva conversión se inicia inmediatamente después que la
conversión previa se completa, y ya que CKADC2 esta en alto en este tiempo, todas
automáticamente se inician, (por ejemplo, todas pero la primera) las conversiones libres
tomaran 14 ciclos de reloj del ADC.
Si los canales de ganancia diferencial se usan y las conversiones son iniciadas por el
auto disparo, el ADC debe ser apagado entre conversiones. Cuando el auto disparo se
usa, el preescalador del ADC se reinicia antes que la conversión comience. Ya que la
etapa de ganancia es dependiente de la prioridad del reloj estable del ADC de la
conversión, esta conversión no será valida. Deshabilitando y rehabilitando el ADC entre
cada conversión (escribiendo ADEN en ADCSRA a “0” después a “1”), solamente
conversiones extendidas son ejecutadas. El resultado de las conversiones extendidas
será validado.
Los bits MUXn y REFS1:0 en el registro ADMUX son de un solo buffer a través de un
registro temporal al cual el CPU tiene acceso aleatorio. Esto asegura que los canales y
la selección de referencia solamente tomen lugar en un punto seguro durante la
conversión. El canal y la selección de referencia continuamente se actualizan hasta que
una conversión es iniciada. Una vez que la conversión comienza, el canal y la selección
de referencia se cierran para asegurar un tiempo de muestreo suficiente para el ADC.
Continuas actualizaciones se resumen en el último ciclo de reloj del ADC antes que la
conversión se complete. (ADIF en ADCSRA se pone a uno). Note que la conversión
inicia en la siguiente transición positiva del flanco del reloj del ADC después de que
ADCSRA se escriba. El usuario de esta manera es aconsejado no escribir en el nuevo
canal o los valores de selección de referencia de ADMUX hasta en un ciclo de reloj del
ADC después de que ADSC se escriba.
Si el auto disparo se usa, el tiempo exacto del evento de disparo puede ser
indeterminado. Se deberá tener especial cuidado cuando se actualiza el registro
ADMUX, para controlar cual conversión será afectada por los nuevos ajustes.
Cuando se actualiza ADMUX en una de estas condiciones, los nuevos ajustes afectaran
la próxima conversión ADC.
Especial cuidado deberá tenerse cuando se cambia a canales diferenciales. Una vez
que un canal diferencial ha sido seleccionado, la etapa de ganancia puede tomarse
hasta 125µs para estabilizarse para un nuevo valor. De esta manera las conversiones
no deberán iniciarse dentro de los primeros 125µs después de seleccionar un nuevo
canal diferencial. Alternativamente, el resultado de la conversión obtenido dentro de
este periodo deberá ser descartado.
El mismo ajuste de tiempo deberá ser observado para la primer conversión diferencial
después de cambiarse la referencia del ADC (cambiando los bits REF1:0 en ADMUX).
Cuando se cambia la selección del canal, el usuario deberá observar la siguiente guía
para asegurar que el canal correcto se seleccionó:
En el modo de conversión única, siempre selecciona el canal antes de iniciar la
conversión. La selección del canal puede ser cambiada en un ciclo de reloj del ADC
después de escribir a uno al ADSC. Sin embargo, el método más simple es esperar que
la conversión se complete antes de cambiar la selección del canal.
El voltaje de referencia para el ADC (VREF) indica el rango de conversión para el ADC.
Los canales independientes que excedan a VREF resultaran en códigos cercanos a
0x3FF. VREF puede ser seleccionado ya sea como AVCC, 2.56V de referencia interna, o
el pin AREF externo.
Si el usuario tiene una fuente de voltaje fija conectada al pin AREF, el usuario puede no
usar la otra opción de voltaje de referencia en la aplicación, como serán cortados para
el voltaje externo. Si ningún voltaje externo se aplica al pin AREF, el usuario puede
conmutar entre AVCC y 2.56V como selección de referencia. El resultado de la primera
conversión del ADC después de conmutar la fuente de voltaje de referencia puede ser
impreciso, y se le aconseja al usuario descartar este resultado.
Note que el ADC no será automáticamente apagado cuando se entra a otro modo sleep
o al modo ocioso y el modo de reducción de ruido del ADC. Se le aconseja al usuario
escribir a cero en ADEN antes de entrar en tales modos sleep para evitar el excesivo
consumo de potencia. Si el ADC es habilitado en tal modo de sleep y el usuario quiere
ejecutar conversiones diferenciales, al usuario se le aconseja cambiar de off a on el
ADC después de despertar del modo sleep y provocar una conversión completa para
obtener el valor valido.
La circuitería digital dentro y fuera del dispositivo genera EMI el cual podría afectar la
precisión de la medición analógica. Si la precisión de la conversión es crítica, el nivel de
ruido puede ser reducido aplicando las siguientes técnicas:
1. Mantenga las rutas de las señales analógicas tan cortas como sea posible. Y
mantenga alejadas las rutas de las conmutaciones digitales.
2. El pin AVCC en el dispositivo deberá conectarse a la fuente de voltaje digital Vcc
vía la red LC como se muestra en la figura.
3. Use la función del cancelador de ruido del ADC para reducir el ruido inducido del
CPU.
4. Si cualquiera de los pines del puerto del ADC se usan como salidas digitales, es
esencial que no se conmuten mientras una conversión esta en progreso.
Una línea de ADC de n-bits convierte un voltaje lineal entre GND y VREF en 2n pasos
(LSBs). El código más bajo se lee como un 0, y el código más alto se lee como 2n-1.
Varios parámetros describen la desviación de una conducta ideal.
• No Linealidad Diferencial: La máxima desviación del ancho del código actual (el
intervalo entre dos transiciones adyacentes) del ancho de código ideal (1 LSB).
Valor ideal: 0 LSB.
Ejemplo:
ADMUX = 0xED (ADC3 - ADC2, 10x ganancia, 2.56V referencia, resultado con ajuste a
la izquierda)
Voltaje en ADC3 es 300 mV, voltaje en ADC2 es 500 mV.
ADCR = 512 * 10 * (300 - 500) / 2560 = -400 = 0x270
ADCL leerá 0x00, y ADCH leerá 0x9C. Escribiendo a cero a ADLAR con ajuste a la
derecha
El resultado es: ADCL = 0x70, ADCH = 0x02.
ADSC leerá como uno tanto como una conversión esta en progreso. Cuando la
conversión se completa, retornara a cero. Escribiendo a cero en este bit no tendrá
efecto.
Cuando se lee ADCL, el registro de datos del ADC no se actualiza hasta que ADCH se
lea. Consecuentemente, si el resultado se ajusta a la izquierda y no mas de 8 bits de
precisión se requieren, es suficiente con leer el ADCH. De lo contrario, ADCL debe ser
leído primero, después ADCH.
El bit ADLAR en ADMUX y los bits MUXn en ADMUX afectan la manera en que el
resultado se lee de los registros. Si ADLAR se pone a uno, el resultado se ajusta a la
izquierda. Si ADLAR se limpia (por default), el resultado se ajusta a la derecha.