Codificación compatible con Arduino 07: entrada analógica usando Arduino

En el tutorial anterior, analizamos la salida analógica en forma de señales PWM cuando usamos Arduino . Generamos una onda Arduino PWM usando la función analogWrite que se aproxima a una onda sinusoidal rectificada. Luego utiliza esta salida analógica para atenuar un LED .

Un controlador puede interactuar e interactuar con componentes y dispositivos electrónicos externos de cinco formas posibles: salida digital, entrada digital, salida analógica, entrada analógica y comunicación en serie.

En este tutorial, discutiremos la entrada analógica. La mayoría de los sensores generan un voltaje analógico proporcional a una cantidad física (como temperatura, humedad, presión, intensidad de la luz, etc.).

Un controlador puede interpretar el valor de la cantidad física detectando la magnitud de este voltaje analógico. Además, la mayoría de los controladores tienen canales de convertidor analógico a digital (ADC) integrados que detectan el voltaje analógico de los sensores y lo convierten en una lectura digitalizada. Los valores digitalizados se comparan con la curva de sensibilidad del sensor mediante programas definidos por el usuario para derivar el valor de la cantidad física.

Detección de voltajes unipolares versus unipolares bipolar
Para la entrada analógica, los controladores tienen un periférico integrado llamado convertidor analógico a digital (ADC). La mayoría de los microcontroladores sólo pueden detectar voltajes unipolares y no voltajes bipolares. Lo mismo ocurre con las placas Arduino.

Los microcontroladores AVR integrados de Arduino también solo pueden detectar voltajes unipolares. Estos voltajes analógicos generalmente varían desde tierra (0 V) hasta su voltaje de funcionamiento (5/3,3 V). La razón por la que Arduino y la mayoría de los otros microcontroladores tienen ADC que solo pueden detectar voltajes unipolares es que las funciones del ADC solo están diseñadas para interconectar sensores. Los sensores generalmente emiten voltajes unipolares no periódicos.

Sin embargo, la conversión de analógico a digital se utiliza en varias aplicaciones diferentes, como grabación de música, procesamiento de señales digitales, codificación digital, imágenes digitales y más (además de sensores e instrumentación).

Muchas de estas aplicaciones requieren la conversión de analógico a digital de señales periódicas o señales que pueden ser de naturaleza bipolar. En estos casos, es posible que Arduino (y muchos otros microcontroladores) necesiten interactuar con convertidores bipolares a unipolares externos.

Conversión analógica a digital
Las señales analógicas son de naturaleza continua y no tienen un rango fijo de valores. Para medir voltajes analógicos, estas señales deben convertirse en señales digitales. La señal digital obtenida después de la conversión es un número binario de resolución predefinida (como 8/10/12/14/16 bits), que es proporcional a la magnitud del voltaje analógico.

El valor de este número binario depende del voltaje de referencia con el que se compara la señal analógica y de la resolución del valor. Esto significa que cuanto mayor sea la resolución, menor será el voltaje de referencia. Y, para ser más precisos, la tensión analógica se medirá en cualquier instante de la señal.

El periférico, que convierte el voltaje analógico en un valor digital, se denomina convertidor analógico a digital. Los ADC están diseñados para utilizar diferentes tipos de técnicas de modulación para realizar esta conversión, como modulación de código de pulso (PCM), modulación delta, modulación delta adaptativa, aproximación sucesiva, etc.

Las diferentes técnicas de modulación varían en su funcionamiento, aunque el resultado siempre es una cuantificación de la señal analógica. Luego se codifica en un número binario.

Existen muchas arquitecturas (construcciones) populares para diseñar ADC. Las arquitecturas de ADC más populares son la conversión directa/flash, la aproximación sucesiva (SAR), la tubería, sigma-delta, la comparación de rampa, Wilkinson, la doble pendiente y la arquitectura entrelazada en el tiempo. Los ADC integrados en los controladores AVR utilizados en las placas Arduino suelen tener ADC SAR.

Otro factor importante a considerar en la conversión de analógico a digital es la frecuencia de muestreo. La frecuencia de muestreo es la frecuencia de tiempo a la que se muestrea el voltaje de la señal analógica. Por ejemplo, si una señal analógica se muestrea a una velocidad de 50 kHz, esto significa que el voltaje de la señal analógica se mide cada 20 microsegundos. Sin embargo, si la señal se traza después de la conversión, la frecuencia de muestreo será mayor y la señal muestreada estará mucho más cerca de la señal analógica real.

Entrada analógica usando Arduino
Las placas Arduino utilizan diferentes microcontroladores AVR/SAMD/SAM. La mayoría de estos microcontroladores tienen al menos seis canales ADC que normalmente están multiplexados en un ADC SAR. La resolución de un ADC integrado puede variar de una placa a otra, aunque el ADC en la mayoría de las placas tiene una resolución de al menos 10 bits.

La referencia de voltaje predeterminada es siempre el voltaje de funcionamiento de la placa, por lo que las placas pueden "detectar" voltajes unipolares desde tierra (0 V) hasta 5 o 3,3 V. También puede configurar la referencia de voltaje a voltajes internos predefinidos o a una fuente de voltaje externa.

En algunas placas Arduino, la referencia de voltaje para la conversión de analógico a digital se puede configurar individualmente para cada canal.

La frecuencia de muestreo de la señal analógica se establece preescalando el reloj utilizado por el controlador integrado. La frecuencia de muestreo es siempre un factor de la frecuencia del reloj del controlador, donde el factor lo determina el preescalador incorporado.

Para una resolución más baja (como 8 bits), el ADC puede usar una frecuencia más alta para maximizar la frecuencia de muestreo.

Las capacidades ADC de diferentes placas Arduino se resumen aquí.

Entrada analógica usando Arduino UNO
Arduino UNO tiene seis canales de entrada analógica. El controlador ATmega328P en UNO tiene un ADC de aproximación sucesiva de 10 bits, que está conectado a un multiplexor analógico de 8 canales. Este multiplexor analógico permite ocho entradas de voltaje de un solo extremo en los pines del puerto A del controlador. La entrada de voltaje de un solo extremo se refiere a tierra (0 V).

En SAR ADC, el comparador esencialmente compara el voltaje de entrada con el rango sucesivamente estrecho de voltajes. En cada paso, el voltaje de entrada se compara con un voltaje de un DAC interno (convertidor digital a analógico), donde la salida del DAC es el punto medio del rango de voltaje seleccionado.

En cada paso, la aproximación se almacena en un registro de aproximación sucesiva (SAR). Entonces, supongamos que se muestrea un voltaje de 3,2 V de una señal analógica. Es el primero en comparación con 2,5 V (punto medio de 0 y 5 V).

  • Dado que 3,2 V es mayor que 2,5 V, a continuación se comparará con 3,75 V (el punto medio de 2,5 y 5 V).
  • Dado que 3,2 V es menor que 3,75 V, a continuación se comparará con 3,125 V (el punto medio de 2,5 y 3,75 V), y así sucesivamente.

Dado que el SAR ADC en el ATmega328P tiene una resolución de 10 bits, el voltaje de entrada se aproxima sucesivamente 10 veces para obtener una lectura digital de 10 bits. Sin embargo, si se tratara de un ADC SAR de 8 bits, se necesitarían ocho aproximaciones sucesivas para obtener el valor digital de 8 bits, y así sucesivamente.

En cada aproximación sucesiva se obtiene un bit del valor digital partiendo de MSB a LSB (esto significa que en la primera aproximación se obtiene el MSB del valor digital y en la siguiente aproximación se obtiene el bit cercano al MSB) . Si en una aproximación sucesiva la tensión de entrada es mayor que el punto medio del rango de tensión seleccionado, el bit obtenido será 1. Si la tensión de entrada es inferior al punto medio del rango de tensión seleccionado, el bit obtenido será 0.

Dado que el ADC tiene una resolución de 10 bits, la lectura digital de salida puede oscilar entre 0 y 1023 (2^10).

Tomando el ejemplo de 3,2 V, con 5 V de referencia en un ADC SAR de 10 bits, las sucesivas aproximaciones se pueden resumir aquí.

Si comparamos esto con la ecuación de una conversión ADC estándar de un solo extremo, los resultados son:

ADC = (V ENTRADA /V REFERENCIA ) * 1024
CA = (3,2 V/5 V) * 1024
= 655,36 = 655 o (b1010001111)

El ADC tiene un preescalador de 7 bits y puede usar 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 o 1/128 de la frecuencia de reloj del controlador. El circuito de aproximación sucesiva requiere una frecuencia de reloj de 50 a 200 kHz. Debido a que el controlador tiene sincronización en un cristal de 16 MHz, incluso si se usa una preescala de 1/128 para el voltaje de entrada de muestreo, la frecuencia de reloj del ADC es de 125 kHz.

En los diagramas de tiempo del ADC, puede ver que el ADC necesita 25 ciclos de reloj ADC para la primera conversión y 13 ciclos de reloj ADC para conversiones normales de un solo extremo. Esto significa que si se selecciona la preescala de 1/128, tomará 200 microsegundos (1/125 KHz *25) para la primera muestra y 104 microsegundos (1/125 KHz *13) para las otras lecturas.

Para conversiones activadas automáticamente, el ADC tarda 13,5 ciclos de reloj (108 microsegundos para una conversión). Para el otro preescalador, este tiempo de conversión debe ser aún menor. Normalmente, este ADC tarda entre 65 y 260 microsegundos en convertirse, y muestrea entradas analógicas a una velocidad de hasta 15k SPS (muestras por segundo).

La referencia de voltaje predeterminada es 5V. En esta tabla se enumeran otras referencias de voltaje disponibles en las placas Arduino.

El ATmega328P tiene los siguientes registros internos, que están asociados con el funcionamiento del ADC.

Antes de iniciar una conversión, se debe seleccionar la primera referencia de voltaje y el canal analógico configurando un registro ADMUX. Para habilitar ADC, se debe configurar el bit ADEN del registro ADCSRA.

Para iniciar las conversiones, después de habilitar el ADC, también se debe configurar el bit ADSC del registro ADCSRA. La primera conversión requiere 25 ciclos de reloj ADC, mientras que las conversiones normales requieren 13 ciclos de reloj ADC. Cuando se completa la conversión, se establece el bit ADIF del registro ADCSRA (consulte el diagrama de tiempos del ADC) y se borra el bit ADSC.

Cuando se establece ADIF, se actualizan los registros de datos del ADC (y tanto ADCL como ADCH). El valor de estos registros debe recuperarse cuando se configura el ADIF para obtener una lectura digital de la señal analógica.

Los bits ADPS2:0 del registro ADCSRA se utilizan para seleccionar el preescalador y determinar el factor de división entre la frecuencia del reloj del sistema y el reloj de entrada del ADC. El bit ADLAR del registro ADMUX determina cómo se completan los registros de datos ADC (ADCL y ADCH).

Si el bit ADATE del registro ADCSRA está configurado, se habilita la activación automática de ADC. En este caso, la fuente que desencadena la conversión ADC está determinada por los bits ADTS2:0 del registro ADCSRB. La fuente de activación puede ser un temporizador/contador, una interrupción externa o un comparador analógico.

La función de lectura analógica
Para detectar el voltaje analógico de un sensor (o cualquier fuente), se utiliza la función analogRead.

Esta función tiene el siguiente código fuente:

En la función analogRead, el primer canal de entrada analógica debe seleccionarse según el argumento pasado a la función. Luego se asignan valores a los registros ADMUX y ADCSRB. La función rastrea el bit ADSC del registro ADCSRA en un bucle. Siempre que se establece el bit, lee los valores que se actualizan en los registros ADCL y ADCH.

La función devuelve el valor de los registros ADCL y ADCH como un número entero. La función tiene esta sintaxis:

lectura analógica (pin)

Sólo se necesita un argumento, que es un número de pin válido donde se espera la entrada analógica. Devuelve la lectura analógica que puede variar de 0 a 1023 para una resolución de 10 bits, o de 0 a 4095 para una resolución de 12 bits. Por lo tanto, se debe asignar a una variable que pueda almacenar la lectura analógica recuperada. El valor obtenido de la variable se puede utilizar para trazar la señal analógica o para tomar una decisión según un programa definido por el usuario.

La función de referencia analógica
Es posible establecer una referencia de voltaje diferente para ADC cuando se usa Arduino. Por defecto, la referencia de tensión es siempre la tensión de funcionamiento de la placa. La referencia de voltaje se puede cambiar o configurar usando la función analogReference.

Esta función tiene el siguiente código fuente:

La función tiene la siguiente sintaxis:

Referencia analógica(tipo)

Esta función toma un solo argumento, que es una opción para la referencia de voltaje. Las opciones que se pueden pasar a esta función para diferentes placas Arduino ya se mencionan en la tabla de referencia de voltaje anterior. Esta función no devuelve nada.

Es posible que las primeras lecturas de analogRead no sean precisas al cambiar la referencia analógica. Por lo tanto, si se llama a la función analogReference, las primeras lecturas devueltas por la función analogRead deben ignorarse en el programa definido por el usuario.

Si el voltaje externo se define como referencia analógica, nunca debe ser inferior a 0 V (no se permiten voltajes bipolares en los pines analógicos) y no debe ser superior a 5 V (la sobretensión puede dañar el pin o incluso el controlador integrado).

Una resistencia interna de 32K está conectada al pin AREF. Para establecer una tensión externa como referencia, se debe suministrar a través de una resistencia externa. La resistencia externa formará un divisor de voltaje con la resistencia interna en el pin AREF y la referencia de voltaje se puede configurar de forma segura sin preocuparse de dañar el pin o el controlador.

La función analogReadResolution
Las tarjetas MKR, Due y Zero tienen múltiples opciones de resolución para la conversión de analógico a digital. La resolución predeterminada es de 10 bits. Sin embargo, en estas tarjetas se pueden utilizar resoluciones más bajas o más altas (hasta 32). La resolución del ADC se puede cambiar mediante la función analogReadResolution.

Esta función tiene la siguiente sintaxis:

resolución de lectura analógica (bits)

El argumento de fragmentos determina la resolución de la lectura analógica devuelta por la función analogRead. Puede tomar cualquier valor entre 1 y 32. Cabe señalar que cuando se establece la resolución por encima de 12, las aproximaciones pueden verse perjudicadas. Lo ideal es utilizar resoluciones de 8, 10 o 12 bits, a menos que exista una exigencia estricta de elegir una resolución más alta.

Si se establece una resolución que la tarjeta no es capaz de alcanzar, analogRead devolverá una lectura con la resolución más alta posible en esa tarjeta, con ceros completados para la resolución adicional. Del mismo modo, si se establece una resolución más baja que está más allá de las capacidades de la tarjeta, analogRead devolverá una lectura con la resolución más baja posible en esa tarjeta, descartando los bits LSB para que coincidan con la resolución seleccionada.

Receta de tasa de parpadeo del LED controlada por potenciómetro
En esta receta, detectaremos el voltaje analógico con la ayuda de un potenciómetro y usaremos la variación del voltaje analógico para cambiar la duración del parpadeo de un LED.

Componentes necesarios
1. Arduino UNO x1
2. LEDx1
3. Resistencia de 330 ohmios x1
4. Bote 10K/100K x1
5. Tablero de prueba x1
6. Cables de unión o cables de conexión macho a macho

Conexiones de circuito
Primero, conecte el pin 5 de E/S digital Arduino UNO al ánodo LED. Luego conecte el cátodo del LED con una resistencia en serie de 330 ohmios y conecte a tierra el otro terminal de la resistencia.

Coge el potenciómetro y conecta sus terminales fijos 1 y 3 a tierra y 5V, respectivamente. Conecte el terminal variable 2 del potenciómetro a la entrada analógica A5 del Arduino UNO. El voltaje de suministro de CC y la tierra se pueden suministrar al circuito desde el pin de alimentación de 5 V y uno de los pines de tierra del Arduino UNO.

Diagrama de circuito

Bosquejo de Arduino

pin del sensor int = A5;
intledPin = 5;
valor analógico int = 0;

configuración vacía {
pinMode(ledPin, SALIDA);
}

bucle vacío {
analogVal = analogRead(sensorPin);
escritura digital (ledPin, ALTA);
retraso (valor analógico);
escritura digital (ledPin, BAJO);
retraso (valor analógico);
}

Cómo funciona el proyecto
El circuito está diseñado para cambiar la velocidad de parpadeo del LED detectando el voltaje de un potenciómetro de ajuste. El extremo variable del recortador está conectado al pin A5 del UNO, mientras que sus extremos fijos están conectados a tierra y VCC (5V DC).

El voltaje analógico en el extremo variable del recortador se puede variar entre 0 y 5 V girando la perilla del recortador. Este voltaje se aplica a la entrada analógica A5 del Arduino UNO .

El voltaje analógico del recortador se lee usando la función analogRead, que devuelve un valor entre 0 y 1023. La lectura analógica se usa como un intervalo de retraso en milisegundos entre el encendido y apagado del LED. Cuando la perilla del potenciómetro está cerca del terminal fijo conectado a tierra, el voltaje analógico bajo se aplica al pin analógico A5 y se registra la lectura analógica baja.

Por lo tanto, el intervalo de retardo entre el encendido y apagado del LED permanece entre 40 y 70 milisegundos y el LED parpadea a una frecuencia más alta. Cuando se gira la perilla cerca del terminal fijo conectado a VCC, el voltaje analógico alto se aplica al pin A5 y se registra la lectura analógica alta. El intervalo de retardo de encendido/apagado del LED permanece entre 800 y 1000 milisegundos y el LED parpadea a una frecuencia más baja.

Guía de programación
Las tres variables globales están definidas por:

  • El sensorPin para indicar el pin de entrada analógica.
  • El ledPin para indicar el pin digital donde está conectado el LED
  • El analogVal para almacenar la lectura analógica.

Al sensorPin se le asigna un valor de A5 donde está conectado el recortador, y al ledPin se le asigna un valor de 5 donde está conectado el LED.

En la función de configuración, el pin donde está interconectado el LED se configura como salida usando la función pinMode. En la función de bucle, la lectura analógica en el pin A5 se obtiene a través de la función analogRead y se almacena en la variable analogVal.

El LED está interconectado de modo que el pin 5 le sirve como fuente de corriente. El pin 5 se establece en ALTO usando la función de escritura digital para que el LED comience a brillar. Se proporciona un retraso igual a la lectura analógica llamando a la función de retraso, con analogVal como argumento. Luego, el LED se apaga configurando el pin 5 en BAJO usando la función de escritura digital.

Nuevamente, se proporciona un retraso igual a la lectura analógica llamando a la función de retraso con analogVal como argumento.

Receta de atenuación de LED controlada por potenciómetro

En esta receta, detectaremos el voltaje analógico usando un potenciómetro y cambiando el voltaje analógico para atenuar un LED.

Requisitos

Aquí, los componentes requeridos, las conexiones del circuito y el diagrama del circuito son todos iguales a los mencionados anteriormente, “Receta de velocidad de parpadeo del LED controlada por potenciómetro”.

Bosquejo de Arduino

pin del sensor int = A5;
intledPin = 5;
valor analógico int = 0;

configuración vacía {
pinMode(ledPin, SALIDA);
}

bucle vacío {
analogVal = analogRead(sensorPin);
analogWrite(ledPin, analogVal/4);
}

Cómo funciona el proyecto
Este circuito está diseñado para atenuar un LED usando un potenciómetro. El voltaje analógico se aplica al pin A5 del Arduino a través de un potenciómetro de ajuste. Este voltaje analógico se lee usando la función analogRead.

Esta función devuelve un valor entre 0 y 1023. Este valor se divide por cuatro para obtener un valor entre 0 y 255 y luego se pasa como argumento de ciclo de trabajo a la función analogWrite. La función analogWrite produce una señal PWM en el pin 5 donde está conectado el LED.

  • Cuando la entrada analógica en el pin A5 es baja, la lectura analógica permanece entre 40 y 50. Cuando esta lectura (después de un factor de cuatro) se pasa como ciclo de trabajo, se genera una onda PWM de ciclo de trabajo bajo en el pin 5 del UNO y el LED permanece apagado.
  • Cuando la entrada analógica en el pin A5 es alta, la lectura analógica permanece entre 800 y 1000. Cuando esta lectura (después de un factor de cuatro) se pasa como ciclo de trabajo, se genera una onda PWM de ciclo de trabajo alto en el pin 5 del UNO y el LED se enciende.

Guía de programación
Las tres variables globales se definen de la siguiente manera:

  • El sensorPin para indicar el pin de entrada analógica.
  • El ledPin para indicar el pin digital donde está conectado el LED
  • AnalogVal para almacenar la lectura analógica.

Al sensorPin se le asigna un valor de A5 donde está conectado el recortador y al ledPin se le asigna un valor de 5 donde está conectado el LED.

En la función de configuración, el pin donde está interconectado el LED se configura como salida usando la función pinMode. En la función de bucle, la lectura analógica en el pin A5 se obtiene a través de la función analogRead y se almacena en la variable analogVal.

El LED está interconectado de modo que el pin 5 le sirve como fuente de corriente. Se genera una onda PWM en el pin 5 llamando a la función analogWrite en la que se define el ciclo de trabajo para la lectura analógica (factorizado por cuatro).

La lectura analógica se factoriza por cuatro y el valor del ciclo de trabajo debe estar entre 0 y 255, mientras que la lectura analógica puede estar entre 0 y 1023.

A medida que aumenta el voltaje analógico en el pin A5 del UNO, el ciclo de trabajo aumenta y el LED se vuelve más brillante. A medida que disminuye el voltaje analógico en el pin A5 del UNO, el ciclo de trabajo disminuye y el LED se apaga.

En el próximo tutorial, discutiremos la interfaz de un LED RGB usando Arduino.

(tagsToTranslate)Arduino

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.