Modulo Adc Atmega8

Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 20

MODULO ADC ATMEGA8

SESION 11

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
ADC0 ADC1 ADC2 ADC3 ADC4

0000 0001 0010 0011 0100 ADEN

Vref+
1

REFS1;REFS0

RELOJ-ADC 10BITS ADC

ADC5

0101 ADSC
1

REG. RESULTADOS ADLAR=0 000000 ADCH ADLAR ADLAR=1 000000 ADCL

Vref-

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 ADIF ADIE ADPS2 Registro ADCSRB ----ADTS2

ADEN

ADSC

ADATE

ADPS1

ADPS0

-----

ACME

---

ADTS1

ADTS0

REFS1

REFS0

Registro ADMUX ADLAR MUX4 MUX3 MUX2 MUX1

MUX0

ADC7D

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
ADPS2 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 ADPS1 0 1 0 1 0 1 0 1 ADPS0 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 8MHz/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 ADMUX ADLAR MUX4 MUX3 MUX2

REFS1

REFS0

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 MUX4 MUX3 MUX2

REFS1

REFS0 ADLAR

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

Ganancia

PRACTICA1 -ADC 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
50%

ATMEGA8
PC0

CANAL 0
1k

MODULO ADC 1O BITS

VISUALIZACION

CONVERSION DE SELAN ANALOGICA A DIGITAL


U1
14 15 16 17 18 19 9 10 PB0/ICP1 PB1/OC1A PB2/SS/OC1B PB3/MOSI/OC2 PB4/MISO PB5/SCK PB6/TOSC1/XTAL1 PB7/TOSC2/XTAL2 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 23 24 25 26 27 28 1 2 3 4 5 6 11 12 13

RV1
85%

1k

21 20

AREF AVCC 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, interrupcion y free running desactivados, ;divisor 32 rcall delay200u ;retardo para inicializar el conversor A/D ;se necesita 25 cilos 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 ;todo el circuito ;de

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 ; ============================= ; delay loop generator ; 100000 cycles: ; ----------------------------; delaying 99990 cycles: delay25m: ldi R17, $A5 YY1: ldi R18, $C9 XX1: dec R18 brne XX1 dec R17

brne YY1 ; ----------------------------; delaying 9 cycles: ldi R17, $03 ZZ1: dec R17 brne ZZ1 ; ----------------------------; delaying 1 cycle: nop ret ; ============================= ; delay loop generator ; 800 cycles: ; ----------------------------; delaying 798 cycles: delay200u: ldi R17, $02 YY2: ldi R18, $84 XX2: dec R18 brne XX2 dec R17 brne YY2 ; ----------------------------; delaying 2 cycles: 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; ADMUX = 0x22; while(1) { //Configurar el registro ADCSRA //Configurar el registro ADMUX

ADCSRA|=_BV(ADSC); conversin ADC_val=(ADCH*63)/255; PORTD = ADC_val; } }

//Activar el bit ADSC del registro ADCSRA inicio de


//Ajustar la recta para que vaya de 0 a 63

También podría gustarte