- ¿Qué es ADC (conversión analógica a digital)?
- ADC en AVR Microcontrolador Atmega16
- Componentes requeridos
- Diagrama de circuito
- Configuración de registros de control ADC en Atmega16
- Programando Atmega16 para ADC
Una característica común que se utiliza en casi todas las aplicaciones integradas es el módulo ADC (convertidor analógico a digital). Estos convertidores analógicos a digitales pueden leer el voltaje de sensores analógicos como sensor de temperatura, sensor de inclinación, sensor de corriente, sensor flexible, etc. En este tutorial aprenderemos qué es ADC y cómo usar ADC en Atmega16. Este tutorial incluye conectar un pequeño potenciómetro al pin ADC de Atmega16 y se utilizan 8 LED para mostrar el voltaje cambiante del valor de salida de ADC con respecto al cambio en el valor de entrada de ADC.
Anteriormente explicamos ADC en otros microcontroladores:
- Cómo usar ADC en ARM7 LPC2148 - Medición de voltaje analógico
- Cómo usar ADC en STM32F103C8 - Medición de voltaje analógico
- Cómo usar ADC en MSP430G2 - Medición de voltaje analógico
- ¿Cómo usar ADC en Arduino Uno?
- Uso del módulo ADC del microcontrolador PIC con MPLAB y XC8
¿Qué es ADC (conversión analógica a digital)?
ADC son las siglas de Analog to Digital Converter. En electrónica, un ADC es un dispositivo que convierte una señal analógica como corriente y voltaje en código digital (forma binaria). En el mundo real, la mayoría de las señales son analógicas y cualquier microcontrolador o microprocesador entiende el lenguaje binario o digital (0 o 1). Entonces, para que los microcontroladores comprendan las señales analógicas, tenemos que convertir estas señales analógicas en forma digital. ADC hace exactamente esto por nosotros. Hay muchos tipos de ADC disponibles para diferentes aplicaciones. Pocos ADC populares son flash, aproximación sucesiva y sigma-delta.
El tipo más económico de ADC es el ADC de aproximación sucesiva y en este tutorial se utilizará el ADC de aproximación sucesiva. En un tipo de ADC de aproximación sucesiva, se generan sucesivamente una serie de códigos digitales, cada uno de los cuales corresponde a un nivel analógico fijo. Se utiliza un contador interno para comparar con la señal analógica en conversión. La generación se detiene cuando el nivel analógico se vuelve un poco mayor que la señal analógica. El código digital corresponde al nivel analógico es la representación digital deseada de la señal analógica. Con esto finaliza nuestra pequeña explicación sobre la aproximación sucesiva.
Si desea explorar el ADC en profundidad, puede consultar nuestro tutorial anterior sobre ADC. Los ADC están disponibles en forma de IC y también los microcontroladores vienen con ADC incorporado hoy en día. En este tutorial usaremos ADC incorporado de Atmega16. Discutamos sobre el ADC incorporado de Atmega16.
ADC en AVR Microcontrolador Atmega16
Atmega16 tiene un ADC incorporado de 10 bits y 8 canales. 10 bits corresponden a eso si el voltaje de entrada es 0-5 V, entonces se dividirá en un valor de 10 bits, es decir, 1024 niveles de valores analógicos discretos (2 10 = 1024). Ahora los 8 canales corresponden a los 8 pines ADC dedicados en Atmega16 donde cada pin puede leer el voltaje analógico. Complete PortA (GPIO33-GPIO40) está dedicado para el funcionamiento de ADC. Por defecto, los pines PORTA son pines de E / S generales, lo que significa que los pines del puerto están multiplexados. Para poder utilizar estos pines como pines ADC tendremos que configurar ciertos registros dedicados al control ADC. Es por eso que los registros se conocen como registros de control ADC. Analicemos cómo configurar estos registros para comenzar a funcionar el ADC incorporado.
Pines ADC en Atmega16
Componentes requeridos
- Microcontrolador Atmega16 IC
- Oscilador de cristal de 16Mhz
- Dos condensadores de 100nF
- Dos condensadores de 22pF
- Presionar el botón
- Cables de puente
- Tablero de circuitos
- USBASP v2.0
- Led (cualquier color)
Diagrama de circuito
Configuración de registros de control ADC en Atmega16
1. Registro ADMUX (Registro de selección de multiplexor ADC) :
El registro ADMUX es para seleccionar el canal ADC y seleccionar el voltaje de referencia. La siguiente imagen muestra la descripción general del registro ADMUX. La descripción se explica a continuación.
- Bit 0-4: bits de selección de canal.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Canal ADC seleccionado |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: Se utiliza para ajustar el resultado a derecha o izquierda.
ADLAR |
Descripción |
0 |
Derecha ajusta el resultado |
1 |
Izquierda ajustar el resultado |
- Bit 6-7: Se utilizan para seleccionar la tensión de referencia para ADC.
REFS1 |
REFS0 |
Selección de referencia de voltaje |
0 |
0 |
AREF, Vref interno desactivado |
0 |
1 |
AVcc con condensador externo en el pin AREF |
1 |
0 |
Reservado |
1 |
1 |
Referencia de voltaje interno 2.56 con capacitor externo en el pin AREF |
Ahora comience a configurar estos bits de registro en el programa de manera que obtengamos la lectura del ADC interno y la salida a todos los pines de PORTC.
Programando Atmega16 para ADC
El programa completo se da a continuación. Grabe el programa en Atmega16 usando JTAG y Atmel Studio y gire el potenciómetro para variar el valor ADC. Aquí, el código se explica línea por línea.
Comience haciendo una función para leer el valor convertido de ADC. Luego pase el valor del canal como 'chnl' en la función ADC_read .
unsigned int ADC_read (unsigned char chnl)
Los valores de los canales deben estar entre 0 y 7, ya que solo tenemos 8 canales ADC.
chnl = chnl & 0b00000111;
Al escribir '40', es decir, '01000000' en el registro ADMUX, seleccionamos PORTA0 como ADC0, donde la entrada analógica se conectará para la conversión digital.
ADMUX = 0x40;
Ahora, este paso implica el proceso de conversión de ADC, donde al escribir ONE en ADSC Bit en el registro ADCSRA comenzamos la conversión. Después de eso, espere a que el bit ADIF devuelva el valor cuando se complete la conversión. Paramos la conversión escribiendo '1' en ADIF Bit en el registro ADCSRA. Cuando se complete la conversión, devuelva el valor ADC.
ADCSRA - = (1 <
Aquí, el voltaje de referencia interno del ADC se selecciona configurando el bit REFS0. Después de eso, habilite ADC y seleccione el preescalador como 128.
ADMUX = (1 <
Ahora guarde el valor ADC y envíelo a PORTC. En PORTC, se conectan 8 LED's que mostrarán la salida digital en formato de 8 bits. El ejemplo que hemos mostrado varía el voltaje entre 0V y 5V usando una olla de 1K.
i = ADC_read (0); PORTC = i;
El multímetro digital se usa para mostrar el voltaje de entrada analógica en el pin ADC y se usan 8 LED para mostrar el valor correspondiente de 8 bits de la salida ADC. Simplemente gire el potenciómetro y vea el resultado correspondiente en el multímetro, así como en los LED brillantes.
El código completo y el video de trabajo se muestran a continuación.