Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SESION 10
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
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
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
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.
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
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
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:
brne XX1
dec R17
brne YY1
ldi R17, $03
ZZ1:
dec R17
brne ZZ1
nop
ret
; =============================
delay200u:
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 ADC_val;
DDRD = 0xFF;
while(1)
{
ADCSRA|=_BV(ADSC); //Activar el bit ADSC del registro ADCSRA inicio de
conversin