You are on page 1of 14

UNIVERSIDAD TCNICA DEL NORTE

FACULTAD DE INGENIERA EN CIENCIAS APLICADAS CARRERA DE INGENIERA ELECTRNICA Y REDES DE COMUNICACIN

NOMBRE: David Guerra FECHA: 31 de Enero del 2014 CONSULTA DE MICROCONTROLADORES AVANZADOS CONVERSIN ANLOGO/DIGITAL La mayora de los datos del mundo real es analgico. Ya se trate de la temperatura, presin, tensin, etc, su variacin es siempre de naturaleza analgica. Por ejemplo, la temperatura en el interior de una caldera es de alrededor de 800 C. Durante su luz, la temperatura nunca se acerca directamente a 800 C.Si la temperatura ambiente es 400 C, que comenzar a aumentar gradualmente a 450 C, 500 C y por lo tanto llega a 800 C durante un perodo de tiempo.Este es un conjunto de datos analgicos.

Figura1. Proceso de Adquisicin de Seal

Ahora, tenemos que procesar los datos que hemos recibid, pero el procesamiento de seal analgica es bastante ineficiente en trminos de la precisin, la velocidad y la salida deseada, por lo tanto, las convertimos a formato digital mediante un convertidor analgico a digital (ADC).

PROCESO DE ADQUISICIN DE SEAL


En general, la seal (o datos) proceso de adquisicin tiene 3 pasos. o En el mundo real , un sensor detecta cualquier parmetro fsico y la convierte en una seal elctrica analgica equivalente.

Para eficiente y facilidad de procesamiento de la seal, esta seal analgica se convierte en una seal digital mediante un convertidor analgico a digital (ADC) .

Esta seal digital se alimenta a continuacin a la microcontrolador (MCU) y se procesa en consecuencia.

Figura2. ADC Pins - ATMEGA164/324

EL ADC DEL AVR


El AVR cuenta con ADC incorporado en casi toda su MCU. En ATMEGA16/32, PORTA contiene los pines ADC. Algunas otras caractersticas de la ADC son los siguientes:

Figura 3. ADC Caractersticas ATMEGA164/324

Ahora mismo, estamos preocupados por la Resolucin de 8 canales de 10 bits caracterstica.

8 canales implica que hay 8 pines ADC se multiplexan juntos. Se puede ver fcilmente que estos pines se encuentran en todo PORTA (PA0 PA7).

o o

10 bits de resolucin implica que hay 2 ^ 10 = 1024 pasos (tal como se describe a continuacin).

Figura 4. 8 canales ADC de 10 bits

Supongamos que utilizamos una referencia de 5V. En este caso, cualquier valor analgico en entre 0 y 5V se convierte en su valor ADC equivalente como se muestra arriba. El rango de 0-5V se divide en 2 ^ 10 = 1024 pasos. Por lo tanto, una entrada de 0 V dar una salida del ADC de 0, 5V dar una salida del ADC de 1023, mientras que una entrada de 2.5V dar una salida del ADC de alrededor de 512. Este es el concepto bsico de la ADC. Para aquellos a los que podra referirse, del tipo de ADC implementado dentro del AVR MCU es de aproximacin sucesiva tipo. Aparte de esto, las otras cosas que necesitamos saber acerca de la ADC AVR son: o o ADC Precontador Registros ADC - ADMUX, ADCSRA, ADCH, ADCL y SFIOR

ADC PRESCALER
El ADC del AVR convierte la seal analgica en seal digital en algn intervalo regular. Este intervalo se determina por la frecuencia de reloj. En general, el ADC opera dentro de un rango de frecuencia de 50 kHz a 200 kHz. Pero la frecuencia de reloj de la CPU es mucho ms alta (en el orden de MHz). As que para lograrlo, por divisin de frecuencia debe tener lugar. El pre-escalador acta como este factor de

divisin. Produce la frecuencia deseada de la mayor frecuencia externa. Hay algunos factores de divisin predefinidos - 2, 4, 8, 16, 32, 64, y 128.Por ejemplo, un pre-escalador de 64 implica F_ADC = F_CPU/64. Para F_CPU = 16MHz, F_ADC = 16M/64 = 250kHz. Ahora, la principal pregunta es ... que la frecuencia para seleccionar? Fuera de la gama de 50 kHz-200 kHz de las frecuencias, cul necesitamos? Bueno, la respuesta radica en su necesidad. Hay un trade-off entre la frecuencia y la precisin . Mayor es la frecuencia, menor es la precisin y viceversa. Por lo tanto, si su aplicacin no es sofisticado y no requiere mucha precisin, usted podra ir para las frecuencias ms altas.

REGISTROS ADC ADMUX - ADC Multiplexer Selection Registro


El registro ADMUX es como sigue.

Los bits que se destacan son de inters para nosotros. En cualquier caso, vamos a discutir todos los bits de uno en uno. o Los bits 07:06 - REFS1: 0 - Referencia Bits de seleccin - Estos bits se utilizan para elegir la tensin de referencia. Se utilizan las siguientes combinaciones.

Figura 5. Seleccin de referencia de voltaje.

Figura 6. Pines de voltaje de referencia ADC.

El ADC necesita una tensin de referencia para trabajar sobre. Para ello contamos con un tres pins Aref, AVCC y GND. Podemos suministrar nuestra propia tensin de referencia a travs de AREF y GND. Para ello, elija la primera opcin . Adems de este caso, se puede conectar un condensador a travs de pin AREF y tierra para evitar el ruido, o puede optar por dejarlo sin conectar. Si desea utilizar el VCC (+5 V), elegir la segunda opcin . O si no, elegir la ltima opcin para Vref interna. Vamos a elegir la segunda opcin para Vcc = 5V. o o Bit 5 - ADLAR - ADC izquierdo Ajuste Resultado - Que sea '1 'para izquierdo Ajuste el Resultado ADC. Vamos a discutir sobre esto un poco ms tarde. Bits 04:00 - MUX4: 0 - Canal Analgico y ganancia Bits de seleccin - Hay 8 canales de ADC (PA0 ... PA7). A cul elegimos? Elige uno! No importa. Cmo elegir? Usted puede elegir mediante el establecimiento de estos bits. Como hay 5 trozos, se compone de 2 ^ 5 = 32 condiciones diferentes de la siguiente forma. Sin embargo, estamos preocupados slo con los primeros 8

condiciones. Inicialmente, todos los bits se ponen a cero.

Figura 7. Canal de entrada y selector de ganancia.

Por lo tanto, para inicializar ADMUX, escribimos:

ADMUX = (1 << REFS0);

ADCSRA - CONTROL ADC Y REGISTRO DE ESTADO A


El registro ADCSRA es como sigue.

ADCSRA Registrarse

Los bits que se destacan son de inters para nosotros. En cualquier caso, vamos a discutir todos los bits de uno en uno. o Bit 7 - ADEN - ADC Enable - Como su nombre lo dice, se activa la funcin de ADC. A menos que esta opcin est activada, las operaciones de ADC no puede tener lugar a travs de PORTA PORTA es decir se comportar como pines GPIO. o Bit 6 - ADSC - ADC Start Conversion - Escribe esto en '1 'antes de iniciar ningn tipo de conversin. Esto se escribe 1, siempre y cuando la conversin est en curso, despus de lo cual vuelve a cero. Normalmente se necesitan 13 pulsos de reloj ADC para esta operacin. Pero cuando usted lo llama por primera vez, toma 25, ya que realiza la inicializacin junto con l. o Bit 5 - ADATE - ADC Auto Disparador Enable - Si se establece en '1 'activa auto-activacin de ADC. ADC se activa automticamente en cada flanco de subida de pulso de reloj. Ver el registro SFIOR para ms detalles. o Bit 4 - ADIF - ADC Interrupt Flag - Siempre que una conversin ha terminado, y los registros se actualizan, este bit se pone a '1 'automticamente. Por lo tanto, esto se utiliza para comprobar si la conversin se ha completado o no. o o Bit 3 - ADIE - ADC Interrupt Enable - Cuando este bit se pone a '1 ', la interrupcin ADC est habilitada. Este se utiliza en el caso de interrupcin del ADC impulsada. Los bits 02:00 - ADPS2: 0 - ADC de divisor bits de seleccin - El pre-escalador (factor de divisin entre la frecuencia XTAL y la frecuencia de reloj ADC) se determina mediante la seleccin de la combinacin apropiada de la siguiente.

Figura 8. Seleccin del prescaler del ADC.

Suponiendo que la frecuencia de 16MHz XTAL y el rango de frecuencia de 50 kHz-200 kHz, elegimos un prescaler de 128. Por lo tanto, F_ADC = 16M/128 = 125 kHz. Por lo tanto, inicializamos ADCSRA como sigue: ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); / / Prescaler = 128

ADCL Y ADCH - ADC REGISTROS DE DATOS


El resultado de la conversin ADC se almacena aqu. Desde la ADC tiene una resolucin de 10 bits, se requiere 10 bits para almacenar el resultado. Por lo tanto un solo registro de 8 bits no es suficiente. Necesitamos dos registros - ADCL y ADCH (ADC byte bajo y ADC de alta byte) de la siguiente manera. Los dos pueden ser llamados en conjunto como ADC.

Figura 9. ADC Registros de datos (ADLAR = 0)

Figura 10. ADC Registros de datos (ADLAR = 1)

Usted puede ver muy bien el efecto de bits ADLAR (en el registro ADMUX). Al establecer ADLAR = 1, el resultado de la conversin se deja ajustado.

SFIOR - FUNCIN E / S ESPECIAL REGISTRARSE


En funcionamiento normal, no utilizamos este registro. Este registro entra en juego cuando ADATE (en ADCSRA) se pone a '1 '. El registro es el siguiente.

Figura 11. Registro SFIOR.

Los bits resaltados en amarillo son discutidas como se relacionan con ADATE.Otros bits estn reservados bits. o Bits 07:05 - ADC Auto Disparador Fuente - Siempre ADATE se pone a '1 ', estos bits determinan la fuente de disparo para la conversin ADC. Hay 8 posibles fuentes de disparo.

Figura 12. ADC Auto Triggering Source Selections.

CODIGO EMPLEADO EN LA SIMULACION

#include <mega324.h> #include <delay.h>

//// ADC //// #define ADC_VREF_TYPE 0x00

// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input;

// Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; }

static unsigned int time_count;

// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here TCNT0=6; ++time_count;

if (time_count==200) { read_adc(0);}; if (time_count==400) { read_adc(1);}; if (time_count==600) { read_adc(2);}; if (time_count==800) { read_adc(3);}; if (time_count==1000) {read_adc(4);}; if (time_count==1200) {read_adc(5);}; if (time_count==1400) {read_adc(6);};

if (time_count==1600) {read_adc(7);};

time_count=0; } // Declare your global variables here

void main(void) { // Declare your local variables here

// Crystal Oscillator division factor: 1 #pragma optsizeCLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif

// Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00;

// Port B initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0xFF;

// Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00;

// Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00;

// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: Normal top=0xFF // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x02; TCNT0=0x00;

OCR0A=0x00; OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x01;

// Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00;

// ADC initialization // ADC Clock frequency: 1000,000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On // ADC4: On, ADC5: On, ADC6: On, ADC7: On DIDR0=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;

// Global enable interrupts #asm("sei")

while (1)

{ // Place your code here

if (read_adc(0)>((2*1023)/5)) { PORTB.0=1; } if (read_adc(1)>((2*1023)/5)) { PORTB.1=1; } if (read_adc(2)>(2*1023)/5) { PORTB.2=1; } if (read_adc(3)>(2*1023)/5) { PORTB.3=1; } if (read_adc(4)>(2*1023)/5) { PORTB.4=1; } if (read_adc(5)>(2*1023)/5) { PORTB.5=1; } if (read_adc(6)>(2*1023)/5) { PORTB.6=1; } if (read_adc(7)>(2*1023)/5) { PORTB.7=1; }

if (read_adc(0)<=((2*1023)/5)) { PORTB.0=0; } if (read_adc(1)<=((2*1023)/5)) { PORTB.1=0; } if (read_adc(2)<=(2*1023)/5) { PORTB.2=0; } if (read_adc(3)<=(2*1023)/5) { PORTB.3=0; } if (read_adc(4)<=(2*1023)/5) { PORTB.4=0; } if (read_adc(5)<=(2*1023)/5) { PORTB.5=0; } if (read_adc(6)<=(2*1023)/5) { PORTB.6=0; } if (read_adc(7)<=(2*1023)/5) { PORTB.7=0; } } }

BIBLIOGRAFA: http://maxembedded.com/2011/06/20/the-adc-of-the-avr/ http://www.embedds.com/adc-on-atmega328-part-2/

http://tutorialcodevisionavr.blogspot.com/2011/05/goging-form-analog-to-digitaltutorial.html

You might also like