Professional Documents
Culture Documents
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.
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).
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) .
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).
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.
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.
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
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.
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
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.
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.
// 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; }
// 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);};
// 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;
// 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;
while (1)
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; } } }
http://tutorialcodevisionavr.blogspot.com/2011/05/goging-form-analog-to-digitaltutorial.html