En la última lección, analizamos la medición y salida de una señal digital desde un microcontrolador, y en esta analizaremos una señal analógica. Como hemos dicho más de una vez antes, el microcontrolador tiene entradas analógicas, es decir entradas conectadas a ADC – convertidor analógico a digital (ADC). En las placas Arduino, estos son pines marcados con la letra A. Escribí el nombre entre comillas por una razón, porque no todos los pines son solo analógicos: por ejemplo, en la placa Nano, los pines A0-A5 también son digitales ordinarios, y tienen la capacidad de medir una señal analógica. Los pines A6 y A7 son puramente analógicos.
¿Por qué leer una señal analógica? El microcontrolador puede actuar como un voltímetro, medir su propio voltaje de suministro, por ejemplo, de una batería, puede medir la corriente a través de una derivación (si conoce la ley de Ohm), puede medir la resistencia y también trabajar con potenciómetros (torsional, lineal, joysticks), que son órganos de gobierno muy versátiles.
Leer una señal analógica.
Los pines “analógicos” pueden tomar un voltaje de 0 (GND) como un voltaje de referencia y convertirlo en un valor digital. Nuestro ADC tiene una capacidad de 10 bits, es decir obtenemos el voltaje medido como un número de 0 a 1023. La función que digitaliza el voltaje se llama analogRead ( pin ), esta función toma un número de pin analógico como argumento y devuelve el valor resultante. El pin en sí debe configurarse como ENTRADA (input), permítame recordarle que, por defecto, todos los pines están configurados de esta manera.
Por cierto, el pin se indica como «analógico»:
- Solo un número de pin (por ejemplo, 0 )
- Número con la letra A (por ejemplo, A0 )
- Número de serie GPIO: A0 – pin 14 , A1 – 15 pines … A7 – 21
A continuación se muestra un ejemplo de pin de sondeo A0.
int value1 = analogRead ( 0 ) ; // lee el voltaje del pin A0 int value2 = analogRead ( A0 ) ; // lee el voltaje del pin A0 int value3 = analogRead ( 14 ) ; // lee el voltaje del pin A0
Potenciómetros.
Los pines analógicos y los ADC en general se usan con mucha frecuencia cuando se trabaja con potenciómetros (también conocidos como resistencia variable o reóstato). 10 bits del ADC le permiten establecer los valores del programa de 0 a 1023 (o múltiplos de ellos), es decir, para influir en el curso del programa, cambiar algunas configuraciones y similares. Un potenciómetro siempre tiene tres patas: dos extremas y una central. Juntos, este es un divisor de voltaje que le permite cambiar el voltaje en el rango de 0-VCC:
El potenciómetro está conectado al Arduino así, el pin central a cualquier pin A, los extremos a GND y alimentación. La dirección del cambio de valor depende del orden de GND y la conexión de alimentación. En términos de resistencia, lea la nota sobre los divisores de voltaje a continuación en este tutorial. La mayoría de las veces, se instalan potenciómetros con una resistencia de 10 kΩ para microcontroladores, pero el rango es, en principio, muy amplio: de 1 kΩ a 100 kΩ. Cuanto más, más ruidosa vendrá la señal, y si toma menos, las pérdidas de corriente irán al calentamiento del potenciómetro, y esto no es bueno para nadie.
Voltaje de referencia.
La tensión de referencia juega un papel importante en la medición de una señal analógica, porque de ella depende la tensión máxima medida y, en general, la posibilidad y precisión de convertir el valor obtenido de 0-1023 a Voltios. Examinemos la siguiente función: analogReference ( modo ) donde modo:
- DEFAULT: la tensión de referencia es igual a la tensión de alimentación del Mc. Activo por defecto
- INTERNAL: referencia incorporada de 1,1 V para ATmega168 o ATmega328P y 2,56 V para ATmega8
- INTERNAL1V1: referencia incorporada de 1,1 V ( solo Arduino Mega )
- INTERNAL2V56: referencia incorporada de 2,56 V ( solo Arduino Mega )
- EXTERNAL: la referencia será el voltaje aplicado al pin AREF
Después de cambiar la fuente de referencia de voltaje (llamando analogReference() ) las primeras mediciones pueden ser inestables (muy ruidosas).
El valor de función 1023 analogRead () corresponderá a la tensión de referencia seleccionada o una tensión superior a ella, pero no superior a 5,5 V, que quemará la placa. Es decir, bajo el modo DEFAULT podemos digitalizar el voltaje desde 0 hasta el voltaje VCC. Si la tensión de alimentación es de 4,5 voltios y suministramos 4,5 voltios, obtendremos el valor digitalizado de 1023. Si suministramos 5 voltios, obtendremos nuevamente 1023, porque está encima de la referencia. Esta regla funciona aún más, lo principal es no superar los 5,5 voltios. Cómo medir un voltaje más alto (12 voltios por ejemplo) te lo diré en una lección separada.
Con respecto a la precisión: cuando funciona con 5V y modo DEFAULT obtenemos una precisión de medición de voltaje (5/1024) ~ 4.9 milivoltios. Mediante la colocación de INTERNAL podemos medir voltaje de 0 V a 1,1 V con una precisión de (1,1 / 1024) ~ 0,98 milivoltios. Bastante bien, especialmente cuando se juega con un divisor de voltaje.
En cuanto a la referencia de tensión externa. No utilice un voltaje inferior a 0 V o superior a 5,5 V como referencia externa al pin AREF. También cuando se usa el EXTERNAL necesita llamar analogReference ( EXTERNAL) antes de la llamada a la función analogRead () de lo contrario, el microcontrolador podría resultar dañado. Puede conectar la referencia al pin AREF a través de una resistencia de ~ 5 kΩ, pero como la entrada AREF tiene su propia resistencia de 32 kΩ, la referencia real será, por ejemplo, 2.5 * 32 / (32 + 5) = ~ 2.2 V.
Medición de voltaje.
0-5 voltios
Un ejemplo simple de cómo medir el voltaje en un pin analógico y convertirlo a Voltios. La placa está alimentada por 5V.
float voltage = (float)(analogRead(0) * 5.0) / 1024;
Entonces la variable Voltaje obtiene un valor en voltios, de 0 a 5. Un poco más adelante, hablaremos de medidas más precisas usando algunos trucos.
¿Por qué estamos dividiendo por 1024 , y no por 1023 , si el valor máximo de medición con el ADC es 1023? La respuesta la puede encontrar en la hoja de datos del Mc.
El ADC toma un bit durante la conversión, es decir, en principio, puede medir 5.0 Voltios solo como 4.995V, que se obtendrá usando la fórmula anterior:1023 * 5/1024 == 4.995 ….. Por lo tanto, debe dividir por 1024, si alguien le pregunta por qué, debe ir a leer la hoja de datos (datasheet) del Mc.
Mucho más de 5 voltios
Para medir un voltaje de CC superior a 5 voltios, debe usar un divisor de voltaje con resistencias. Diagrama de conexión, en el que la placa se alimenta de 12V al pin Vin y puede medir el voltaje de una fuente (por ejemplo, una batería):
Código para convertir el valor de lectura analógica a voltios teniendo en cuenta el divisor de voltaje:
// GND -- [ R2 ] -- A0 -- [ R1 ] -- VIN #define VREF 5.1 // el voltaje exacto en el pin de 5V (en este caso depende del estabilizador en la placa Arduino) #define DIV_R1 10000 // valor exacto de la resistencia de 10k ohmios #define DIV_R2 4700 // valor exacto de la resistencia de 4.7k ohmios void setup() { float voltage = (float)analogRead(0) * VREF * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024; } void loop() {}
¿Cómo elegir / calcular un divisor de voltaje?
- Según la hoja de datos de ATmega, la suma de R1 + R2 no se recomienda de más de 10 kOhmios para lograr la máxima precisión de medición. Al mismo tiempo, una corriente notable fluirá a través del divisor de 10 kΩ, que es fundamental para los dispositivos autónomos (lea a continuación). Si el dispositivo está alimentado por la red o por una batería, pero el Mc no se usa en modo de suspensión, ajuste el divisor a 10 kOhm y no lo dude. También se recomienda colocar un condensador entre GND y el pin analógico para reducir el ruido.
- Si el dispositivo es alimentado por una batería y el microcontrolador está «dormido»: deje que la batería sea de 12V, entonces una corriente de 1.2 mA fluirá a través del divisor de 10 kΩ, de acuerdo con la ley de Ohm. El microcontrolador en sí mismo en modo de suspensión consume ~ 1 μA, ¡que es mil veces menos! De hecho, puede tomar un divisor con una resistencia total mucho mayor (pero no más de 20 MΩ, la resistencia interna del propio ADC), pero asegúrese de colocar un capacitor de ~ 0.1 μF entre el pin analógico y GND. Así, por ejemplo, cuando R1 + R2 = 10 MΩ (no se olvide del condensador), la corriente a través del divisor será de 1,2 μA, ¡que es mucho mejor!
- El factor divisor es ( R1 + R2 ) / R2. El coeficiente debe ser tal que al dividir el voltaje medido por él, se obtenga no más de 5 voltios. En mi ejemplo( 10 + 4,7 ) / 4,7 ~ 3,13. Quiero medir una batería de litio con un voltaje máximo de 12,8 voltios. 12,8 / 3,13 ~ 4 voltios – excelente. Por ejemplo, para medir 36 voltios, tomaría un divisor con valores de 100k y 10k.
Mucho menos de 5 voltios
Para obtener mediciones de bajo voltaje más precisas, puede conectar el pin AREF a una referencia de bajo voltaje (discutido anteriormente) para «estrechar» el rango de ADC. La fuente puede ser tanto externa como interna, por ejemplo, cambiando la referencia a 1.1V internos (analogReference ( INTERNAL ) ) puede medir voltaje de 0 a 1,1 voltios con una precisión de 1,1 / 1024 ~ 1,01 mV.