Modulo Adc Atmega8
Modulo Adc Atmega8
Modulo Adc Atmega8
SESION 11
Vref+
1
REFS1;REFS0
ADC5
0101 ADSC
1
Vref-
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
MUX0
ADC7D
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.
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
VISUALIZACION
RV1
85%
1k
21 20
D2 D1
D10D9 D8 D7 D6 D5 D4 .
;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