Sunteți pe pagina 1din 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
ADC0 Vref+ REFS1;REFS0
ADEN
0001

1
ADC1

ADC2
0010
RELOJ-ADC
0011
ADC3 10BITS
ADC4
0100
ADC
ADC5
0101
REG. RESULTADOS
1

ADSC Vref- 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.

Registro ADCSRA
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0

Registro ADCSRB
----- ACME --- --- --- ADTS2 ADTS1 ADTS0

Registro ADMUX
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0

Registro DIDR0
ADC7D 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
Factor de
ADPS2 ADPS1 ADPS0
Divisin
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 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
Registro DMUX
REFS1 REFS0 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


Entrada Entrada
MUX4:MUX0 Entrada nica Diferencial Diferencial Ganancia

Positiva Negativa
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
N/A
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
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.

RV2
ATMEGA8
PC0
MODULO ADC VISUALIZACION
50%

CANAL 0
1k
1O BITS
CONVERSION DE SELAN ANALOGICA A DIGITAL

U1
14
PB0/ICP1 PC0/ADC0
23 RV1
15 24

85%
PB1/OC1A PC1/ADC1 1k
16 25
PB2/SS/OC1B PC2/ADC2
17 26
PB3/MOSI/OC2 PC3/ADC3
18 27
PB4/MISO PC4/ADC4/SDA
19 28
PB5/SCK PC5/ADC5/SCL
9 1
PB6/TOSC1/XTAL1 PC6/RESET
10
PB7/TOSC2/XTAL2
2
PD0/RXD
3
PD1/TXD
4
PD2/INT0
5
PD3/INT1
6
PD4/T0/XCK
11
PD5/T1
21 12
AREF PD6/AIN0
20 13
AVCC PD7/AIN1
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 ;r16 <- $40
out admux,r16 ;configuro ADC a canal0, ajuste a derecha y referencia en Vref con cap
ldi r16,$85 ;r16 <- $85
out adcsra,r16 ;habilito ADC, interrupcin y free running desactivados, divisor 32
rcall delay200u
;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;
}
}

S-ar putea să vă placă și