Convertidor Analógico Digital AVR


Compartir: Share on Facebook6Tweet about this on TwitterShare on Google+0Share on Tumblr1Share on LinkedIn0

convertidor analógico digital AVR ejemplo2 imagenEl ADC convertidor analógico digital AVRpermite medir señales analógicas en forma digital, para ello el AVR cuenta con pines por donde le llegará la señal analógica, estos pines deben configurarse como entradas analógicas, el convertidor analógico digital AVR convierte la señal analógica que le llega al pin configurado como entrada analógica, en un número binario de 10 bits que representará la medida analógica, este número binario se guarda en sus registros ADCH y ADCL de 8 bits cada uno pero estos actúan como un solo registro de 16 bits, en el registro ADCH se guardan los bits mas significativos y en el registro ADCL se guardan los bits menos significativos, el número que representa la tensión analógica y guardado en forma binaria dentro de estos registros será de 10 bits para el ATMEGA88 que  será el microcontrolador AVR utilizado para los ejemplos.

El ADC convertidor analógico digital AVR necesita una tensión de referencia para poder trabajar adecuadamente, esta tensión de referencia Vref normalmente será la tensión a la cual trabaja el AVR, aunque por programa se puede elegir otras tensiones de referencia; a la relación que hay entre la tensión de referencia Vref y el máximo número binario de 10 bits 210-1=1023=1111111111 que representará la señal analógica se le conoce como resolución, por ejemplo para el caso del ATmega88 se tendrá que la resolución del convertidor analógico digital AVR será:

Resolución = Vref/(210-1) = Vref/1023

Si se toma como la Vref=5V que es la tensión adecuada a la que trabaja el ATmega88 se tendrá que la resolución de su convertidor analógico digital AVR será:

Resolución = 5V/(210-1) = 5V/1023

de donde

Resolución = 0,004887585533V ≈ 0,0049V luego la resolución para el caso del convertidor analógico digital AVR de 10 bits con un voltaje de referencia de 5V será:

Resolución=4,9mV

La resolución indica en este caso que a la tensión de referencia de 5V se le ha partido en 1023 partes iguales y cada una de esas partes equivalen a aproximadamente 4,9mV, al utilizar esto en forma digital indicará que para un 0 será 0V, si el voltaje aumenta desde 0 en 4,9mV se tendrá un 1, si aumenta 2 veces 4,9mV se tendrá un 2, si aumenta 3 veces 4,9mV se tendrá un 3, si aumenta 4 veces 4,9mV se tendrá un 4 etc.

Esto quiere decir, que al utilizar el convertidor analógico digital AVR, cada vez que la tensión analógica que llegue por el pin configurado como entrada analógica aumente en 4,9mV, el número que lo representa y almacenado en los registros ADCH y ADCL aumentará en 1, por ejemplo cuando la tensión analógica es 0, el número binario que lo representa será 0000000000, si la tensión analógica aumenta de 0 a 4,9mV el número binario que lo representa será 0000000001, si la tensión analógica aumenta de 4,9mV a 9,8=2*4,9mV el número binario que representa este valor será 0000000010, si la tensión analógica aumenta de 9,8V a 14,7=3*4,9mV el número binario que representa este valor será 0000000011, y así hasta que la tensión analógica se haga igual a la tensión de referencia, lo que ocurrirá cuando la tensión analógica aumente desde 0 de 4,9mV en 4,9mV unas 1023 veces lo cual es 1023*4,9mV que es un poquito mas de 5V porque la resolución se redondeo, el número binario que representa a los 5V será 1111111111.

Como el módulo convertidor analógico digital AVR es de 10bits, por lo que la resolución dependerá de la tensión de referencia.

El número binario de 10 bits que representará la tensión analógica, puede leerse desde los registros ADCH y ADCL, este número se puede guardar con una justificación a la derecha o una justificación a la izquierda, esto es así

000000xxxxxxxxxx es el número de 16 bits almacenado entre ADCH y ADCL, donde las 10 x que pueden ser 0 o 1 es el número de 10 bits que representa a la señal analógica, este es el caso la justificación a la derecha los 6 bits mas significativos se ponen a 0 automáticamente.

xxxxxxxxxx000000 es el número de 16 bits almacenado entre ADCH y ADCL, donde las 10 x que pueden ser 0 o 1 es el número de 10 bits que representa la señal analógica, este es el caso la justificación a la izquierda los 6 bits menos significativos se ponen a 0 automáticamente.

Para leer los registros ADCH y ADCL la hoja de datos indica que hay que leer primero el registro ADCL y luego el registro ADCH; utilizando el ATMEGA STUDIO se puede leer directamente desde el registro de 16bts al cual se le llama ADC, para ello se crea una variable de 16 bits y dependiendo de si la justificación es a la derecha o a la izquierda se procederá así:

uint16_t medida_analógica;//se declara la variable de 16 bits

si la justificación es a la derecha se procede directamente a almacenar el número de 10 bits en la variable medida_analógica así:

medida_analógica=ADC;

si la justificación es a la izquierda se tendrá que hacer un corrimiento de 6 bits hacia la derecha para almacenar el número de 10 bits en la variable medida_analógica así:

medida_analógica=ADC>>6;

Luego el valor de la variable medida_analógica, mediante simples operaciones matemáticas se puede hacer que represente el valor en voltios, de la medida de la señal analógica que esta llegando a la entrada analógica del AVR como se ve a continuación:

El valor almacenado en la variable medida_analogica se multiplica por la resolución obteniéndose el valor en voltios de la señal analógica representada por el número binario de  10 bits.

medida_analógica=medida_analógica*Vref/1023;

Para la utilización del convertidor analógico digital AVR del ATmega88 se tienen 4 registros para su control, los que son el ADMUX, el ADCSRA, el ADCSRB y el DIDR0; el ADC también puede producir interrupciones para lo cual se utilizan unos bits que forman parte del registro ADCSRA, junto con la función sei() de C/C++ en el ATMEL STUDIO, tal como se comentó aquí.

El módulo ADC convertidor analógico digital AVR necesita una frecuencia de trabajo adecuada para obtener conversiones confiables, esta frecuencia de trabajo para el convertidor  analógico digital AVR tiene que estar comprendida entre los 50KHz y los 200Khz según la hoja de datos del ATmega88, lo que es común para otros microcontroladores AVR, si la frecuencia de trabajo del ADC es la mayor la conversión será mas rápida pero el valor obtenido no será muy confiable, por el contrario si la frecuencia de trabajo es la menor el valor obtenido será confiable pero la conversión tardará mas tiempo, se recomienda por tanto utilizar una frecuencia de trabajo del ADC intermedia por ejemplo de 100Khz.

La frecuencia de trabajo del ADC se obtendrá a partir de la frecuencia del trabajo del microcontrolador AVR, mediante el uso de prescaler como se comentará mas abajo donde se  trata este tema.

El tiempo que tarda la conversión según la hoja de datos es para la primera conversión es de unas 25 veces el periodo de trabajo del ADC que viene a ser la inversa de la frecuencia de trabajo del ADC, las demás conversiones tardarán unas 13 veces el periodo de trabajo según la hoja de datos, lo que quiere decir que si se tiene por ejemplo una frecuencia de trabajo del convertidor analógico digital AVR de 100Khz, entonces su periodo de trabajo será de 10us, por lo que la conversión tardará unas 13 veces este valor, esto es unos 130us.

En lo que sigue es necesario tener la hoja de datos del microcontrolador que se esté utilizando, lo que se comenta mas abajo es para el caso del ATMEGA88, la forma en que se procede puede variar un poco en comparación con el convertidor analógico digital AVR de otros microcontoladores AVR, pero en general la manera de proceder es muy similar, pero eso si es muy importante siempre guiarse con la hoja de datos.

Convertidor Analógico Digital AVR: El registro ADMUX

En la siguiente imagen se tiene el registro ADMUX para el control del convertidor analógico digital AVR, se pueden ver los nombres que le corresponden a cada uno de sus bits.

convertidor analógico digital AVR admux

Los bits 7 y 6 de este registro son para elegir la tensión de referencia Vref de la cual dependerá la resolución para el módulo convertidor analógico digital AVR, la combinación de bits para elegir la tensión de referencia será hace según la siguiente tabla.

convertidor analógico digital AVR Voltaje de referencia

Si se elige la combinación 00, se le indica al AVR que se utilizará una tensión de referencia externa diferente a la que utiliza el AVR para su funcionamiento, esta tensión será ingresada por el pin AREF de microcontrolador AVR.

Si se elige la combinación 01, se le indica al AVR que se utilizará la tensión a la cual funciona el microcontrolador AVR, esta tensión será ingresada por el pin AVCC del microcontrolador AVR, ademas recomienda colocar un  condensador entre este pin y tierra para evitar ruidos.

La combinación 10 no es utilizada.

Si se elige la combinación 11, se le indica al AVR que se utilizará como tensión de referencia una tensión interna de 1,1V del microcontrolador AVR, en este caso recomienda colocar un condensador entre el pin AREF y tierra para evitar ruidos.

El bit 5 es para elegir la justificación del número de 10 bits que representa la tensión analógica convertida a digital, dentro de los registros ADCH y ADCL que juntos hacen 16 bits, de esos 16 bits solo serán útiles 10 bits, los 6 bits restantes se ponen automáticamente a 0, se puede elegir entre una justificación a la derecha o una justificación a la izquierda

000000xxxxxxxxxx es el número de 16 bits almacenado entre ADCH y ADCL, donde las 10 x que pueden ser 0 o 1 es el número de 10 bits que representa a la señal analógica, este es el caso la justificación a la derecha y para ello hay que poner el bit 5 ADLAR a 0, los 6 bits mas significativos se ponen a 0 automáticamente.

xxxxxxxxxx000000 es el número de 16 bits almacenado entre ADCH y ADCL, donde las 10 x que pueden ser 0 o 1 es el número de 10 bits que representa la señal analógica, este es el caso la justificación a la izquierda y para ello hay que poner el bit 5 ADLAR a 1 los 6 bits menos significativos se ponen a 0 automáticamente.

El bit 4 no se utiliza por lo cual se le suele poner a  0.

Los bits 3, 2, 1 y 0 son para elegir la entrada analógico a utilizar, el ATMEGA88 tiene 6 pines que se pueden utilizar como entradas analógicas, los cuales se encuentran en el puerto C y son llamados ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, la elección de la entrada analógica a se hace de acuerdo a los valores de estos bits como se muestra en la siguiente tabla, por ejemplo si se quiere elegir la entrada analógica 3 se utilizará la combinación para estos bits de 0011.

convertidor analógico digital AVR selección de entradas analógicas

Convertidor Analógico Digital AVR El registro ADCSRA

En la siguiente imagen se tiene el registro ADCSRA para el control del convertidor analógico digital AVR, se pueden ver los nombres que le corresponden a cada uno de sus bits.

convertidor analógico digital AVR adcsra

El bit 7 ADEN es para activar o desactivar el convertidor analógico digital AVR, cuando este bit es puesto a 1 el convertidor está activo y listo para usarse, si este bit es puesto a 0 el convertidor estará apagado no pudiendo utilizarse.

El bit 6 ADSC se pondrá a 1 para iniciar la conversión analógica digital AVR, cuando la conversión de analógico a digital termina este bit se pone a 0 en forma automática, lo que indica que la conversión a terminado.

El bit 5 ADATE al poner este bit a 1 se habilita la opción de disparo o activación automática del convertidor analógico digital AVR, por alguna señal que será elegida de acuerdo al registro ADCSRB  que se verá mas adelante.

El bit 4 ADIF este bit es el que detecta cuando se ha producido una interrupción  por terminación de una conversión analógica digital AVR, para detectar la interrupción hay que ponerlo a 0, al terminar una conversión se pondrá automáticamente a 1, para seguir detectando mas interrupciones luego de que haya ocurrido alguna hay que ponerlo nuevamente a 0, al utilizar la rutina de interrupciones en C/C++ con el atmel studio este bit se pone automáticamente a 0 dentro de la rutina de interrupciones.

El bit 3 ADIE este bit es utilizado para habilitar la interrupción por la terminación de una conversión analógica digital AVR, para habilitar esta interrupción hay que poner a 1 este bit.

Los bits 2, 1 y 0 son para elegir el prescaler a utilizar para obtener la frecuencia de trabajo del convertidor analógico digital AVR, mediante la combinación de valores de estos bits, a partir de la frecuencia de trabajo del microcontrolador AVR utilizado, los prescaler que se pueden utilizar son los que se indican es la siguiente tabla para el ATmega88, los valores de la frecuencia de trabajo para el convertidor analógico digital AVR tiene que estar comprendido entre los 50KHz y los 200Khz según la hoja de datos

convertidor analógico digital AVR prescaler

Por ejemplo si el microcontrolador AVR está trabajando a 1MHz, para obtener una frecuencia de trabajo del convertidor analógico digital de 100Khz o uno cercano que esté entre 50Khz y 200Khz, el prescaler a utilizar seria de 8, con el cual se obtiene una frecuencia de trabajo para el convertidor analógico digital AVR de 125Khz.

Convertidor Analógico Digital AVR El registro ADCSRB

En la siguiente imagen se tiene el registro ADCSRB para el control del convertidor analógico digital AVR, se pueden ver los nombres que le corresponden a cada uno de sus bits.

convertidor analógico digital AVR adcsrb

Los bits 7, 5, 4 y 3 no son utilizados por lo que se les suele poner a 0.

El bit 6 trabaja con el comparador analógico AVR, en el caso de utilizar solo el convertidor analógico digital AVR no influye por lo que se le puede poner a 0.

Los bits 2, 1 y 0 dependen del bit 5 del registro ADCSRA al poner este bit a 1 se habilita la opción de disparo o activación automática del convertidor analógico digital AVR si se pone a 0 no pasará nada, mediante las combinaciones de los bits 2, 1 y 0 del registro ADCRB, se elige cual será el evento que haga que el convertidor analógico digital AVR se habilite automáticamente, en la siguiente tabla se tiene el evento a elegir según la combinación valores de estos bits, se tienen 8 posibilidades para el disparo automático.

Si la combinación es 000 y se ha puesto a 1 el bit 5 del registro ADCSRA el convertidor analógico digital AVR se habilitará automáticamente tras cada conversión, si la combinación es por ejemplo 110 el convertidor analógico digital AVR se disparará cada vez que el timer1 se desborde.

convertidor analógico digital AVR disparo automático

Convertidor Analógico Digital AVR El registro DIDR0

En la siguiente imagen se tiene el registro DIDR0 para el control del convertidor analógico digital AVR, se pueden ver los nombres que le corresponden a cada uno de sus bits.

convertidor analógico digital AVR didr0

Los bits 7 y 6 no son utilizados por lo cual se les pone a 0

Del bit 5 al bit 0 mediante estos bits al ponerlos a 1 se permite que el pin utilizado para la entrada analógica solo funcione con el módulo convertidor analógico digital AVR, y la parte interna del pin que tiene que ver con su comportamiento digital no se  vea afectado, se puede decir que es una forma de deshabilitar el comportamiento digital del pin utilizado como entrada analógica.

Convertidor Analógico Digital AVR sin interrupciones

En la programación del módulo ADC convertidor analógico digital AVR con el ATMEL STUDIO en C/C++, el número binario de 10 bits que representa el valor de la señal analógica y almacenado en los registros ADCH y ADCL se encuentran en una variable llamada que se ha llamada ADC, aunque también se pueden utilizar por separado los registros ADCH y ADCL.

Los registros de control para el módulo convertidor analógico digital AVR se pueden programar en forma binaria, decimal o hexadecimal.

Ejemplo1 En el siguiente ejemplo, mediante una resistencia variable, a la entrada analógica 3 ADC3 del ATmega88 se le hará llegar una señal analógica que va desde 0V a 5V, esa señal será convertida a digital cuyos valores en binario serán 0000000000 para 0V y 1111111111 para 5V los cuales serán visibles por medio de unos leds conectados a los puertos B  y D, los 8 bits menos significativos serán visibles en el puerto B y los 2 bits mas significativos serán visibles en el puerto D, cuando todos los leds estén apagados esto es 0 se estará midiendo 0V y cuando todos los leds estén encendidos esto es 1023 se estará midiendo 5V, los valores binarios variarán de 0 a 1023 lo cual será visible por medio de los leds cada vez que se gire la resistencia variable para los diferentes valores de la señal analógica. En este caso no se utilizarán interrupciones.

Configurando el registro ADMUX para el ejemplo1

La tensión de referencia será la tensión a la cual trabaja el ATmega88 esto es 5V, por lo que el bit7 se pondrá a 0 y el bit6 a 1.

La justificación del número binario de 10 bits que representa la valor analógico convertido a decimal será al la derecha, por lo que el bit5 se pondrá a 0.

El bit4 no se usa por lo que se le pone a 0.

Se utilizará la entrada analógica 3 por lo que la combinación de los bits 3, 2, 1 y 0 será 0011.

Luego entonces la configuración del registro ADMUX para el ejemplo1 será:

ADMUX=0b01000011;//Vref=VCC justificación derecha ADC3

Configurando el registro ADCSRA para el ejemplo1

En un inicio el ADC estará apagado por lo que el bit7 se pondrá a 0, luego dentro del ciclo de trabajo del programa se activará poniendo este bit a 1.

Como el ADC iniciará apagado, no se iniciará ninguna conversión por lo que el bit6 se pondrá a 0.

El bit5 a 0 ya que no se utilizará la habilitación automática del convertidor analógico digital AVR.

Los bits 4 y 3 se ponen a 0 ya que no se utilizarán interrupciones.

El ATmega88 estará funcionando a 1MHz, se utilizará una frecuencia de conversión para el convertidor analógico digital AVR de 125Khz, por lo que el prescaler utilizado será de 8, para hacer esto el bit2 se pondrá a 0, el bit1 se pondrá a 1 y el bit0 se pondrá a 1.

Luego entonces la configuración del registro ADCSRA para el ejemplo1 será:

ADCSRA=0b00000011;//ADC apagado no inicia conversión sin habilitación automática sin interrupciones prescaler de 8.

Configurando el registro ADCSRB para el ejemplo1

Como no se utiliza habilitación automática, todo este registro a 0, luego entonces la configuracion del registro ADCSRB para el ejemplo1 será:

ADCSRB=0;//no se utilizan habilitaciones automáticas

Configurando el registro DIDR0 para el ejemplo1

Se hará que cuando se utilice el pin ADC3 se deshabilite su parte digital interna, por lo que el bit3 se pondrá a 1, luego entonces la configuración del registro DIDR0 para el ejemplo1 será:

DIDR0|=(1<<3);//deshabilita la parte digital interna del pin ADC3

El circuito utilizado es el siguiente:

convertidor analógico digital AVR ejemplo1 circuito

El código para el ejemplo1 del uso del módulo convertidor analógico digital AVR, hecho en el ATMEL STUDIO es el siguiente:

convertidor analógico digital AVR ejemplo1 código

Ejemplo2 En este caso se modificará el circuito anterior, en lugar de utilizar leds se utilizará una pantalla LCD conectada al puerto D del ATmega88, para visualizar en el LCD los valores que va tomando la tensión analógica que llega al pin ADC3 utilizado como entrada analógica, sobre el uso de la pantalla LCD con el AVR se comentó aquí, en este caso se  asumirá que ya se conoce como utilizar una pantalla LCD con el microcontrolador AVR.

Configurando el registro ADMUX para el ejemplo2

La tensión de referencia será la tensión a la cual trabaja el ATmega88 esto es 5V, por lo que el bit7 se pondrá a 0 y el bit6 a 1.

La justificación del número binario de 10 bits que representa la valor analógico convertido a decimal será al la derecha, por lo que el bit5 se pondrá a 0.

El bit4 no se usa por lo que se le pone a 0.

Se utilizará la entrada analógica 3 por lo que la combinación de los bits 3, 2, 1 y 0 será 0011.

Luego entonces la configuración del registro ADMUX para el ejemplo1 será:

ADMUX=0b01000011;//Vref=VCC justificación derecha ADC3

Configurando el registro ADCSRA para el ejemplo2

En un inicio el ADC estará apagado por lo que el bit7 se pondrá a 0, luego dentro del ciclo de trabajo del programa se activará poniendo este bit a 1.

Como el ADC iniciará apagado, no se iniciará ninguna conversión por lo que el bit6 se pondrá a 0.

El bit5 a 0 ya que no se utilizará la habilitación automática del convertidor analógico digital AVR.

Los bits 4 y 3 se ponen a 0 ya que no se utilizarán interrupciones.

El ATmega88 estará funcionando a 1MHz, se utilizará una frecuencia de conversión para el convertidor analógico digital AVR de 125Khz, por lo que el prescaler utilizado será de 8, para hacer esto el bit2 se pondrá a 0, el bit1 se pondrá a 1 y el bit0 se pondrá a 1.

Luego entonces la configuración del registro ADCSRA para el ejemplo1 será:

ADCSRA=0b00000011;//ADC apagado no inicia conversión sin habilitación automática sin interrupciones prescaler de 8.

Configurando el registro ADCSRB para el ejemplo2

Como no se utiliza habilitación automática, todo este registro a 0, luego entonces la configuracion del registro ADCSRB para el ejemplo1 será:

ADCSRB=0;//no se utilizan habilitaciones automáticas

Configurando el registro DIDR0 para el ejemplo2

Se hará que cuando se utilice el pin ADC3 se deshabilite su parte digital interna, por lo que el bit3 se pondrá a 1, luego entonces la configuración del registro DIDR0 para el ejemplo1 será:

DIDR0|=(1<<3);//deshabilita la parte digital interna del pin ADC3

El circuito utilizado es el siguiente:

convertidor analógico digital AVR ejemplo2 circuito

El código para el ejemplo2 del uso del módulo convertidor analógico digital AVR con una pantalla LCD, hecho en el ATMEL STUDIO es el siguiente:

convertidor analógico digital AVR ejemplo2 código1a

convertidor analógico digital AVR ejemplo2 código1b

La siguiente es una imagen del circuito realizado para el uso del convertidor analógico digital AVR.

convertidor analógico digital AVR ejemplo2 imagen

Convertidor Analógico Digital AVR con interrupciones

El uso del convertidor analógico digital AVR on interrupciones se encuentra dentro de la sección de interrupcionescon el  AVR, se puede ir directamente al enlace haciendo click aquí.

Si he logrado ayudarte en cuanto a la utilización del módulo ADC convertidor analógico digital AVR con el microcontrolador AVR, comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni

Compartir: Share on Facebook6Tweet about this on TwitterShare on Google+0Share on Tumblr1Share on LinkedIn0