lunes, 10 de agosto de 2015

Conversor análogo digital en lenguaje assembler para Atmega164P

En el mundo se tienen dos tipos de variables, las digitales y las analógicas, por lo que debemos saber que tipo de variable es con la que vamos a trabajar. Para entender estos conceptos debemos saber que una variable analógica es aquella que puede tomar varios valores en un rango determinado, en cambio una variable digital es aquella que posee solo dos valores, un verdadero o un falso, en otras palabras un 1 lógico o un 0 lógico. En la figura 1 podemos encontrar una explicación gráfica de estas dos variables.

Fig. 1 Diferencias de variables

 Normalmente en la industria nos encontramos con variables analógicas como los valores de sensores de temperatura, presión, caudal, entre otras; pero debemos tomar en cuenta que nuestro microcontrolador solo puede trabajar con variables digitales por lo cuál se debe tener un conversor análogo digital. El microcontrolador posee un conversor a 10 bits, pero siempre debemos tener en cuenta que existe un error, por lo que no va a ser exacta la conversión, en algún punto se pierden datos.

Lo más común es tener un conversor de 10 bits, pero existen conversores de 8, 12,14,16 bits pero siempre tenemos que saber que cantidad de error tienen los equipos a los que se va a interconectar.

También es importante seleccionar la referencia ya que de esto depende que tan bueno es nuestro conversor, en este caso tenemos referencias internas y externas, de las cuales la mejor opcion es la referencia externa.

Registros que se deben configurar

Tenemos varios registros para que el conversor empiece a hacer su tarea los cuales son:

ADMUX:


Como se puede observar este registro tiene varios bits de configuración y de los cuales se puede explicar lo siguiente:

REFS1-REFS0: estos dos bits nos sirven para escoger la referencia a utilizarse y utiliza la siguiente tabla:

Aquí escogemos con 00 una referencia externa y apagamos la referencia interna, con 01 escogemos la referencia el voltaje de alimentación del microcontrolador, con 10 utilizamos una referencia interna de 1.1 V y con 11 escogemos una referencia interna de 2.56 V.

ADLAR: con este bit escogemos el ajuste, con 1 escogemos hacia la izquierda y con 0 escogemos hacia la derecha. Esto se refiere a la ubicación de los registros ADCH y ADCL, cuando esta hacia la derecha los 8 bits menos significativos están en ADCL y los 2 bits más significativos están en ADCH; en cambio cuando está hacia la izquierda los 8 bits más significativos están en ADCH y los 2 bits menos significativos están en ADCL.

MUX4-MUX0: este es el multiplexor que nos permite escoger el conversor que vamos a utilizar, cabe recalcar que solo puede utilizar un conversor a la vez, para utilizar varios conversores debemos hacer la primera conversión, apagar el conversor y cambiar el multiplexor para ir al siguiente conversor y realizar la operación. La configuración de estos bits se puede observar en la siguiente tabla:


ADCSRA:


ADEN: sirve para activar el conversor, con 0 el conversor está apagado y con 1 encendemos el conversor.

ADSC: este bit sirve para que la conversión empiece, en el momento que este bit es 1 el conversor empieza a hacer su labor.

ADATE: sirve para que se active la conversión automática.

ADIF: es la bandera de interrupción, con un 1 se la borra para que pueda trabajar con la interrupción.

ADIE: este bit sirve para activar las interrupciones cada que se realiza una conversión.

ADPS2-ADPS0: estos tres bits sirven para escoger el preescalador, normalmente se utiliza el de factor de división 64 que es con el que mejor trabaja el conversor de 10 bits, pero se pueden escoger las otras opciones que se muestran en la siguiente tabla:

  

ADCSRB: 

Con este registro se trabaja cuando el ADATE ha sido activado (cuando el modo automático es seleccionado)


Este registro solo trabaja con los bits 0, 1, 2 y se manejan por la siguiente tabla:

DIDR0:

Este registro nos sirve para convertir la entrada de digital a analógica, se debe tener en cuenta que para configurar esto se debe configurar como entrada el puerto A, por si se utiliza los pull-up se debe asegurar el valor de cero en el pin del puerto A que se va a utilizar como conversor y despues configuramos el DIDR0.


Ejemplo de aplicación:

En este ejemplo vamos a hacer un conversor en el ADC0 utilizando como referencia el VCC y el resultado se obtendrá en leds usando el puerto B para los 8 bits menos significativos y el puerto D para los bits más significativos.

Circuito en proteus:

Código:


*  Created: 09/07/2015 0:48:42
 *   Author: cdtoap
 */

 .def tempo=r16

  .org 0x00
  /*Configuracion de puertos*/
  ldi tempo,0b00000000
  out ddra,tempo
  ldi tempo,0b11111111
  out ddrb,tempo
  ldi tempo,0b00000011
  out ddrd,tempo
  ldi tempo,0
  out ddrc,tempo

  /*Cambio del PA0 de digital a análoga*/
  ldi tempo,0b11111110
  out porta,tempo
  ldi tempo,0b00000001
  sts didr0,tempo
  ;------------------------------------


  in   tempo,mcucr
  andi tempo,$EF
  out  mcucr,tempo
  /*Finaliza configuracion de puertos*/
 
  ldi tempo,0b01000000;Escojo referencia AVCC, ajuste derecha, ADC0
  sts admux,tempo
 lazo:
       ldi tempo,0b11000110; Activo el conversor e inicio la conversion
       sts adcsra,tempo

  lazo1:
       lds  tempo,adcsra
       sbrc tempo,6; compruebo si la conversion ha terminado
       rjmp lazo1; si no termina regresa al lazo1
       lds  tempo,adcl; si termino la conversion prende los leds que corresponda
       out  portb,tempo
       lds  tempo,adch
       ori  tempo,0b11111100
       out  portd,tempo
       rjmp lazo; se repite el proceso infinitamente

Circuito funcionando:



No hay comentarios.:

Publicar un comentario