You are on page 1of 21

MODULO ADC ATMEGA8

SESION 10

EL MDULO ADC DE LOS AVR


Los AVR de la serie megaAVR tienen un ADC de aproximaciones
sucesivas de 10 bits.
los uC AVR de la serie ATmegaXX8 destinan todo su puerto C como
canales de entrada del ADC.
El detalle con los ATmega8 es que su puerto C solo tiene 7 pines De
modo que estos megaAVR pueden tener 6

DIAGRAMA DE BLOQUES DEL ADC ATMEGA8


MUX 3--0
ADPS2:ADPS0
0000

ADC1

0001

ADC2

0010

ADC3

0011

ADC4

0100

ADC5

0101

ADEN

REFS1;REFS0

V r e f+
1

ADC0

RELOJ-ADC
10BITS
ADC
1

REG. RESULTADOS

ADSC

V r e f-

ADLAR=0

000000
ADCH

ADCL

ADLAR
ADLAR=1

000000

Operacin del Mdulo ADC


En las aplicaciones ordinarias solo los registros ADCSRA y ADMUX son los
que se manipulan activamente.
Los registros ADCH y ADCL son de solo lectura y como no tienen formato,
basta con recordar sus nombres.

ADCSRA. Es el principal registro de control y estado del ADC. Manipulando los


bits de este registro iniciamos la conversin, establecemos la velocidad de
conversin o elegimos el formato del resultado de la conversin. Veremos los
detalles en adelante.
ADCSRB. Es el segundo registro de control y estado del ADC. Sus pocos bits
funcionales configuran el modo de conversiones automticas y como ese modo
es raramente usado, el registro ADCSRB tampoco est muy avistado en los
programas. Los viejos AVR no lo tienen.
ADCH y ADCL. Son los registros que almacenan el resultado de la conversin.
Uno guarda 8 bits y el otro los dos bits restantes. La forma como se distribuyen
se debe especificar con el bit ADLAR del registro ADMUX.

ADMUX. Es el registro que selecciona el canal de conversin y establece los


voltajes de referencia.
DIDR0. Es tambin un nuevo registro no disponible en los viejos AVR. Su funcin
es desconectar los pines seleccionados como canales latentes del conversor para
as evitar que se desgaste corriente en parte del circuito del ADC.

ADEN

Registro ADCSRA
ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0

-----

Registro ADCSRB
----ADTS2

REFS1

ADC7D

ACME

---

ADTS1

Registro ADMUX
REFS0 ADLAR MUX4 MUX3 MUX2 MUX1

ADTS0

MUX0

Registro DIDR0
ADC6D ADC5D ADC4D ADC3D ADC2D ADC1D ADC0D
Registro ADCH

Registro ADCL

El ADC de los megaAVR es bastante fcil de controlar si se le emplea en


su modo habitual de conversiones normales de entrada nica. Tras
configurar este modo, se escoge un canal a la vez y se setea el bit
ADSC para iniciar la conversin.
Despus esperamos a que este mismo bit se limpie automticamente
por hardware como seal de que la conversin termin, y cuando lo
haga podremos leer el resultado. Eso sera todo.
1. Seleccionar el reloj del conversor ADC, con los bits ADPS2:ADPS0.
2. Seleccionar los voltajes de referencia del conversor, usando los bits
REFS1 y REFS0.
3. Establecer la justificacin del resultado con el bit ADLAR.
4. Seleccionar el canal o los canales de entrada del ADC, con los bits
MUX4:MUX0.
5. Encender el mdulo ADC, seteando el bit ADEN.
6. Iniciar la conversin, seteando el bit ADSC.
7. Esperar a que termine la conversin. Cuando esto pase el flag ADIF
se pondr a uno y si la conversin es normal y el bit ADSC se
limpiar automticamente.
8. Leer el resultado de la conversin del par de registros ADCH: ADCL
.

RELOJ DEL ADC Y TIEMPO DE CONVERSIN


Como todo circuito sncrono, el conversor ADC necesita de una seal de
reloj para dirigir los pasos de su algoritmo de aproximaciones sucesivas,
se que describimos al principio. Este reloj deriva del oscilador del sistema
F_CPU.
La frecuencia del reloj del ADC depender de la resolucin del resultado
que se desee obtener.
Por ejemplo, si se va a trabajar con los 10 bits de resolucin, entonces se
requerir de un reloj cuya frecuencia est entre 50kHz y 200kHz.
Si se requiere de una resolucin menor de 10 bits, el reloj del ADC puede
superar los 200kHz.
El reloj del ADC es una ramificacin del reloj del sistema, F_CPU. De all
proviene y antes de aplicarse al ADC pasa por un prescaler programable
que permite disminuir su valor.
Los factores de divisin se establecen por los bits ADPS2, ADPS1 y
ADPS0, del registro ADCSRA, de acuerdo con la tabla mostrada ms
abajo.

Tabla
ADPS2 ADPS1 ADPS0
0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

Factor de
Divisin
2
2
4
8
16
32
64
128

CONSIDERACIONES
A modo de ejemplo analicemos los valores de ADPS1, ADPS1 y
ADPS0 que podramos usar suponiendo que trabajamos con
nuestro acostumbrado XTAL (F_CPU) de 8MHz.
Si ADPS2:ADPS0 = 111b, el reloj del ADC tendr una frecuencia
de 8 MHz/128 = 62.5kHz, valor suficiente para conseguir resultados
fiables de 10 bits, tan fiables como los generados a 125kHz con el
factor de prescaler de 64.
Sin embargo, si escogemos el factor de 32, con ADPS2:ADPS0
= 101b, el ADC operar a 8MHz/32 = 250kHz, que es una
frecuencia superior a los 200kHz que garantizan una buena
conversin, de modo que deberemos evitarla, a menos tal vez que
solo nos interesen los 8 bits ms significativos del resultado.
En este ejemplo, los factores de prescaler inferiores 32 con llevarn
una operacin del ADC deficiente e inaceptable.

RESULTADO DE LA CONVERSIN
El resultado de la conversin es una cantidad binaria de 10 bits que se
deposita entre los registros ADCH y ADCL, segn la justificacin
mostrada en la siguiente figura y de acuerdo con el bit ADLAR (ADC Left
Adjust Result) del registro ADMUX
REFS1 REFS0

Registro DMUX
ADLAR MUX4
MUX3 MUX2

MUX1

MUX0

Consideraciones
Obviamente debemos esperar a que termine una conversin antes de leer un
dato vlido de estos registros.
Para esto podemos comprobar la activacin del flag ADIF (del registro ADCSRA
) o la puesta a cero del bit ADSC (tambin de ADCSRA), si es que el ADC opera
en modo normal.
Los dos registros del resultado son de solo lectura y el acceso a ellos no
involucra una operacin atmica. Sin embargo, debemos saber que despus de
leer el registro ADCL queda bloqueada la actualizacin de los otros registros del
ADC hasta que leamos el registro ADCH. De este modo se asegura que los
datos presentes en estos registros corresponden a una misma conversin.
De aqu se desprende que al terminar una conversin debemos empezar por
leer ADCL y luego ADCH, o simplemente podemos tomar el valor de ADCH y
as permitir que se puedan depositar en ellos los valores de nuevas
conversiones.
Cuando se establece la justificacion derecha los registros ADCH y ADCL
conforman el registro de 16 bits llamado simplemente ADC y puede ser as
reconocido por los compiladores C puesto que ocupan posiciones contiguas en
el espacio de los registros de E/S

SELECCIN DEL CANAL DE CONVERSIN


En los AVR de 3 puertos son los pines del puerto C; estos AVR tienen 6
entradas analgicas si vienen en empaque PDIP.
Las dos entradas adicionales son pines independientes, que no forman
parte de ningn puerto.
El ADC solo puede tomar una o dos entradas analgicas por conversin,
as que cada vez que se desee obtener un valor analgico externo se
debe seleccionar previamente dicha entrada analgica mediante los bits
MUX4, MUX3, MUX2, MUX1 y MUX0 del registro ADMUX

Registro ADMUX
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2

MUX1 MUX0

La siguiente tabla muestra todas las opciones posibles que se pueden obtener.
Parece complicado de descifrar pero enseguida lo explicaremos.

Cananles del ADC del microcontrolador AVR


MUX4:MUX0 Entrada nica
00000
00001
00010
00011
00100
00101
00110
00111

ADC0
ADC1
ADC2
ADC3
ADC4
ADC5
ADC6
ADC7

Entrada
Diferencial
Positiva

N/A

Entrada
Diferencial
Negativa

Ganancia

PRACTICA1
En este ejemplo veremos cmo funciona el ADC de 10bits de resolucin
del micro, usaremos un potencimetro conectado en el canal 0 el cual
nos dar los diferentes valores de tensin analgica entre 0 y 5V.
Visualizaremos el dato convertido en 10 LEDs conectados en el
puertoD y los restantes 2 en los bits menos significativos del
puerto B.

50%

RV2

1k

ATMEGA8
PC0

CANAL 0

MODULO ADC
1O BITS

VISUALIZACION

CONVERSION DE SELAN ANALOGICA A DIGITAL


U1

21
20

PB0/ICP1
PB1/OC1A
PB2/SS/OC1B
PB3/MOSI/OC2
PB4/MISO
PB5/SCK
PB6/TOSC1/XTAL1
PB7/TOSC2/XTAL2

AREF
AVCC

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL
PC6/RESET
PD0/RXD
PD1/TXD
PD2/INT0
PD3/INT1
PD4/T0/XCK
PD5/T1
PD6/AIN0
PD7/AIN1

RV1

23
24
25
26
27
28
1

85%

14
15
16
17
18
19
9
10

1k

2
3
4
5
6
11
12
13

ATMEGA8

D2 D1

D10D9 D8 D7 D6 D5 D4 .

LED-YELLOW
LED-YELLOW
LED-YELLOW
LED-YELLOW
LED-YELLOW
LED-YELLOW
LED-YELLOW
.
.

DIRECTIVAS EN ENSAMBLADOR
.include "m8def.inc"
;ATmega8
;reset-vector address $0000
.org $0000
rjmp main
;ve al main
;PROGRAMA PRINCIPAL
main:
ldi r16,$04
;Configuracion de...
out sph,r16
ldi r16,$5F
out spl,r16
;...la pila: Stack: $045F=RAMEND
;************************************************************************
clr r16
;r16 <- $00
out ddrc,r16
;portC entrada
ser r16
;r16 <- $ff
out ddrd,r16
;portD salidas
out ddrb,r16 ;portB salidas
;*************************************************
;

ldi r16,$40
out admux,r16
ldi r16,$85
out adcsra,r16
rcall delay200u

;r16 <- $40


;configuro ADC a canal0, ajuste a derecha y referencia en Vref con cap
;r16 <- $85
;habilito ADC, interrupcin y free running desactivados, divisor 32

;retardo para inicializar el conversor A/D


;se necesita 25 ciclos del clock ADC, el clock ADC esta puesto a ;4MHz/32=125kHz 25
;ciclos de 125Khz, es 200us que se debe ;esperar para la ;configuracin de ;todo el circuito
interno
; del conversor A/D del micro

loop:
sbi adcsra,adsc ;se inicia conversion A/D, seteando el bit adsc
convertir:
sbis adcsra,adsc ;pregunto por el bit de conversin terminada
rjmp leer
;si termino la conversin, voy a leer la conversin
rjmp convertir
;si no se sigue esperando hasta que termine
leer:
;rutina de lectura de los datos convertidos
in r16,adcl
;carga el valor de ADCL en r16
out portd,r16
;muestra por el puertoD
in r16,adch
;carga el valor de ADCH en r16
out portb,r16
;muestra por el puertoB
rcall delay25m
;retardo para visualizar, puede no ser necesario
rjmp loop
;bucle infinito
; =============================

delay25m:

ldi R17, $A5


YY1:
ldi R18, $C9
XX1:
dec R18

brne XX1

dec R17
brne YY1


ldi R17, $03
ZZ1:
dec R17

brne ZZ1

nop

ret
; =============================
delay200u:

ldi R17, $02


YY2:
ldi R18, $84
XX2:
dec R18

brne XX2

dec R17

brne YY2

nop

nop

ret
; =============================

PRACTICA2
PROGRAMACION DEL ADC ATMEGA8

CON LENGUAJE C

DESCRIPCIN
Con este programa podremos visualizar a travs de los LEDs, el valor en
binario tomado del ADC conectado a un potencimetro. El ADC se trabajara a
manera de conversin simple y se tomaran solo 8 de los 10 bits, de los cuales
se ajustaran para que la salida vaya de 0 a 63, que ser representada por los
LEDs conectados al microcontrolador.

#include<avr/io.h>
#include<util/delay.h>

int main (void)


{

int ADC_val;
DDRD = 0xFF;

ADCSRA = 0xC0; //Configurar el registro ADCSRA


ADMUX = 0x22;//Configurar el registro
ADMUX

while(1)
{
ADCSRA|=_BV(ADSC); //Activar el bit ADSC del registro ADCSRA inicio de
conversin

ADC_val=(ADCH*63)/255; //Ajustar la recta para que vaya de 0 a 63


PORTD = ADC_val;
}
}

You might also like