Documente Academic
Documente Profesional
Documente Cultură
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.
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
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.
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.
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
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 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.
En los AVR de 3 puertos son los pines del puerto C; estos AVR tienen 6
entradas analgicas si vienen en empaque PDIP.
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.
Positiva Negativa
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
N/A
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
PRACTICA1
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>
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;
}
}