Sensor de Corriente ACS712.

LECTOR DE CORRIENTE ACS712.

CREADO POR V. GARCÍA. EL 06.09.2015

INTRODUCCIÓN.

En este artículo describiré cómo conectar un sensor de corriente ACS715 a la placa Arduino, y así leer la corriente que fluye a través del mismo. Una vez más, recomiendo que lea las hojas de características del fabricante. El Allegro® ACS712 proporciona soluciones económicas y precisas para detección de CC o CA en el sector industrial, comercial y sistemas de comunicaciones. El paquete del dispositivo permite una fácil aplicación por parte del cliente. Las aplicaciones típicas incluyen control del motor, detección de carga y gestión, fuentes de alimentación conmutadas, y la protección de fallo por sobre intensidad.

EL ACS712.

El dispositivo consta de un circuito preciso, bajo offset, sensor Hall lineal con una pista de cobre conductor ubicado cerca de la superficie de la matriz. La corriente aplicada que fluye a través de esta pista de conducción de cobre genera un campo magnético que es detectado por el IC integrado Hall y convertida en una tensión proporcional. La exactitud de los dispositivos se optimiza a través de la proximidad de la señal magnética al transductor Hall. Una tensión precisa, proporcional es proporcionada por el bajo offset, chopper-estabilizado IC BiCMOS Hall, que está programado para la exactitud después del encapsulado.

Este sensor es un pequeña placa, que soporta un sensor de corriente de Allegro, el ACS715 30A está basado en el efecto Hall lineal, que ofrece una baja resistencia (~ 1,2 mΩ) al paso de la corriente con un aislamiento eléctrico de hasta 2,1 kV RMS, según indica el fabricante. Esta versión acepta una entrada de corriente continua de hasta 30 A y una salida de tensión analógica proporcional (66 mV/A) que mide 500 mV. Cuando la corriente de entrada es cero. El error de salida típico es de ± 1,5%. Opera desde 4,5 V a 5,5 V y está pensado para su uso en sistemas de 5 V.

Este dispositivo es muy sencillo, como se aprecia en la imagen de abajo, dispone de tres pines, Vcc, GND y Salida en un extremo y en el otro, dispone de un conector con dos contactos para leer la corriente que pretendemos medir.

acs712-1 Fig.1

El espesor de la pista de cobre permite la supervivencia del dispositivo en hasta 5 × condiciones de sobre corriente. Los terminales de la pista conductora están eléctricamente aislados de los cables de los sensores (pines 5 a 8 en fig. 2). Esto permite que el sensor de corriente ACS712 para ser utilizado en aplicaciones que requieren aislamiento eléctrico sin el uso de aisladores ópticos u otras técnicas de aislamiento costosas.

Mi idea inicial era realizar un voltímetro para que lo utilice quien quiera y pueda aplicarla a su fuente de alimentación. Pensé que con este elemento se completaría un dispositivo importante en una fuente de laboratorio, y por ese motivo realicé un artículo que describe como aplicar un voltímetro a cualquier fuente de alimentación.

Una vez empecé el artículo y a medida que avanzaba me di cuenta que si además de voltímetro midiera la corriente de consumo, estaría más completo y de esta forma tuve que adquirir uno de estos dispositivos, y esa es la razón de este artículo. El esquema práctico de conexionado es sencillo y fácil de entender. Se trata de conectar el sensor en serie con la carga que queremos conocer la corriente de consumo.

bloques_acs712 Fig. 2

Tensión de salida en reposo (Viout (Q)). La salida del sensor cuando la corriente primaria es cero. Para una tensión de alimentación unipolar, sigue siendo nominalmente VCC / 2. Por lo tanto, cuando no hay corriente la tensión de salida es VCC / 2 = 5 V / 2 = 2.5V. La variación en Viout (Q) se pueden atribuir a la resolución de la compensación de tensión de reposo IC Allegro lineal y la deriva térmica. Parece muy complicado, lo intentaré más sencillo.

Cuando no haya corriente de paso por el sensor, leerá CERO, pero esto no va a dar cero en las lecturas. Me voy a explicar, los puertos analógicos en Arduino utilizan un conversor A/D que va de 0 a 1023, donde el 0 == 0 V y el 1023 == 5 V, como el sensor es bidireccional, cuando el sensor no detecta corriente el voltaje será de 2,5 V = (VCC / 2) y la lectura de Arduino será algo cercano a 512. Por lo tanto, si la corriente es positiva va a aumentar la lectura y una lectura negativa la disminuirá.

guía Fig. 3

Para comprender mejor esto, supongamos que este sensor mide intensidades entre -5A y +5A (vea su modelo que alcance tiene). Ya que la salida del sensor según la hoja de datos siempre entrega entre 0 y 5 voltios, cuyo valor de 0A se corresponde con los 2.5V en la salida, y por cada amperio la tensión varía 185 mA. Este sensor puede medir tanto CC como CA, si vemos una sinusoide, el punto más bajo se corresponde con los -5A, de modo que los 2.5V de salida corresponden justo a 0A y los +5A con los 5V, véase la imagen que sigue.

senovolt Fig. 4

Espero que haya quedado claro. El modo de conexionado se muestra simbólicamente en la figura siguiente.

simbolo_acs712+carga-1 Fig. 5

DESCRIPCIÓN.

En este sensor podemos ver los siguientes puntos:

1. Sensor de corriente: ACS712 -30A.
2. Tensión de alimentación, de la placa al pin 5V del Arduino.
3. Este módulo es bidireccional, puede medir desde -30 a + 30A
(equivalente a 66mV / A)
4. Tiene una corriente de 0A cuando entrega una tensión de
salida de VCC / 2, es decir, 2,5V

¡Advertencia!:Este producto está diseñado para su uso por debajo de 30V. Trabajar con voltajes más altos puede ser extremadamente peligroso y sólo debe ser manipulado por personas cualificadas con el equipo adecuado y ropa protectora.

Nota: El ACS712 Hall, utiliza el principio de detección cuando se utiliza para evitar el impacto de campo magnético.

El dispositivo tal cual se adquiere, tiene unas prestaciones ventajosas, ya que está totalmente aislado de la fuente bajo pruebas sin necesidad de separadores especiales, si usted lo aplica directamente. Este es el aspecto de una aplicación funcionando.

ampe_acs712p Fig. 6

De hecho, la aplicación en modo amperímetro se puede entender como tal ya que se conecta en serie con la carga. Por el momento sólo lo he probado en corriente continua y con corrientes de unos pocos amperios.

SENSOR DE CORRIENTE ACS712.

Código de ejemplo para visualizar valores del sensor de corriente, en los terminales de salida.

 Con este boceto, el monitor Serial nos mostrará los valores del sensor y la corriente que circula por el circuito. Podemos observar que las lecturas del A/D están con valores sobre 512, como se aprecia en la imagen que sigue:

sensor712 Fig. 7

El próximo paso es adecuar en lo posible el código y mostrar los resultados en una pantalla LCD numérica, la misma que nos mostrará la tensión de salida en cada momento. Veamos algunos aspectos que tenemos que adjuntar al código, como es la librería ‘LiquidCrystal.h‘ que debemos descargar la última versión para evitar sorpresas. Copie y pegue el siguiente código en su Arduino, dele el nombre amp_acs712.ino, cárgelo y abra el monitor Serial, compruebe que el resultado es más preciso.

El esquema que vamos a utilizar es el siguiente.

monitor_amp712 Fig. 8

AMPERÍMETRO CON EL ACS712.

Código de ejemplo para visualizar valores del sensor de corriente, en los terminales de salida.

Si usted ha copiado y ejecutado el anterior código, sin duda que estará notando unos valores que a menudo cambian, unas cuentas arriba-abajo.  Tal vez piense que hay algún error y efectivamente, el tipo de error que es muy habitual cuando no se tiene experiencia, es debido a las matemáticas. Se produce un desbordamiento en la variable Sensor, la suma de 1000 lecturas analógicas produce el error, la forma sencilla de solucionar este error, es una cuestión de acoplar el número de cuentas para evitar el desborde, es decir, el bucle for lo reducimos a 500 pasos y en este caso, resuelto el error. Pruebelo ahora las lecturas son homogéneas.

En la imagen de abajo se puede apreciar la respuesta en el monitor Serial de Arduino.

placa-712 Fig. 9

Estos son los datos que he extraído del código anterior. Con este código se puede implementar el voltímetro junto con el LCD y podemos utilizarlo de forma habitual, sin embargo, intentaremos realizar un código más completo en el siguiente intento.


Fig. 10 Vídeo del amperímetro.

Como ya he dicho, este amperímetro está bastante logrado, en él podemos distinguir dos partes, en una se encuentra la electrónica para el sensor totalmente aislada de las tensiones y corriente externas que vayamos a mesurar. Por la otra parte, se encuentran las dos tomas o bornas donde conectaremos la carga exterior, que se consideran el amperímetro propiamente dicho. El esquema a aplicar puede ser el mostrado en la figura 6.

OTRO PASO MÁS.

Creo que estamos en el buen camino. Hemos logrado realizar un voltímetro en este sitio, aquí, hemos conseguido el amperímetro y ahora es cuestión de unificar ambos códigos y habremos logrado realizar el dispositivo que propició el proyecto. Así que, manos a la obra, el siguiente es el circuito que nos permitirá leer la tensión y la corriente de salida sobre una carga.

montage_voltamper_1p Fgi. 11

En la imagen se muestra un indicador que dice BATERÍA, se refiere a la tensión continua externa (puede se de 5V o más) que se aplicará a la CARGA, mostrada en el otro lateral como ya he dicho, la tensión en ambas tomas o bornas, es distinta de la tensión digital de Arduino o en micro-controlador en uso. Se puede ver el sensor ACS712 y el divisor de tensión implicado en la lectura de la tensión de salida, se evidencian las salidas referidas al pin A0 para la tensión y el pin A1 para la corriente. El condensador de 100nf es para tirar a masa las tensiones espúreas.

Por lo tanto, sólo nos queda añadir nuestro típico LCD de 2 o 4 líneas, en mi caso dispongo del 2004A de 4 líneas que es el que voy a utilizar. He mejorado el circuito y la disposición en la PCB como se puede apreciar, especial atención a las masas resaltadas en la imagen. En este momento, el montaje se hará con el Arduino, posteriormente debería utilizarse un Attiny85.

voltimetro Fig. 12

Un poco de teoría. Debido a que el Arduino (UNO, R3, Duemilanove, Diecimila, etc) tiene un ADC de 10 bits, nos entrega una salida entre 0-1023 (1024 pasos) para una entrada 0-5v. Eso es 0.00488V / paso. Visita nuestro divisor de tensión. Para un divisor de tensión con R1 = 100kΩ y R2 = 20kΩ, con una tensión máxima de 30V de entrada, se calculará de la siguiente manera:

Luego un divisor de tensión con R1 = 100k Ohm y R2 = 20k Ohm, una entrada de 30V, se calculará de la siguiente manera:

Con 4,98V se ha dado un margen de seguridad.

Ahora, veamos que ve nuestro pin analógico A0, sí la lectura ADC es 615, la tensión en pin A0 = 0.004887 * lectura ADC (615 en este caso), o sea 3,0V. Del mismo modo:

Para 1V / 0.00488 = 205 (ADC lectura – redondeando hacia arriba) … y
Para 4V / 0.00488 = 820 (ADC lectura – redondeando hacia arriba)

Entonces, voltaje de lectura o entrada del divisor = tensión pin A0 * Ratio (o sea 4,98 * 6 = 29,88V)

El código para leer ese valor es el siguiente:

Por cierto, debido a los valores de R1 y R2, la impedancia de entrada de nuestro dispositivo sería: 100.000 + 20.000 = 120.000 Ohms, esto es muy importante en un polímetro, sin embargo, puede que sea el causante de interferencias en las mesuras tomadas, recordemos lo siguiente:

[El ADC en un AVR no puede medir de forma muy precisa las señales con una alta impedancia de salida, y un divisor de tensión sin duda cuenta con una alta impedancia. A partir de la hoja de datos ATmega328P:

El ADC está optimizado para señales analógicas con una impedancia de salida de aproximadamente 10 kΩ o menos. Si se utiliza una fuente de este tipo, el tiempo de muestreo será insignificante. Si se utiliza una fuente de mayor impedancia, el tiempo de muestreo dependerá de cuán largo tiempo la fuente necesita para cargar el condensador S/H, que puede variar ampliamente. Se recomienda que el usuario utilice sólo las fuentes de baja impedancia con las señales que varían lentamente, ya que esto minimiza la transferencia de carga requerida al condensador H/S.]

Por lo tanto, una opción es bajar en cierta medida dicha impedancia a valores menos amplios, es decir, R1 = 47K y R2 = 9K1+330 Ohms, esto conlleva una impedancia de alrededor de 56KΩ que podemos considerar aceptable.

Aclarado el tema de la impedancia, parece que todo está saliendo como se esperaba.

CÓDIGO DE PRUEBA.

Esta es la parte más importante del proyecto como es el código que mide voltios, amperios.

Para que nos calcule los vatios, el nuevo reto, es que necesitamos contemplar una nueva variable como es el tiempo. Se han de realizar unos cálculos que considero claves a la hora de comprender el código.

Para calcular vatios (voltios * amperios), amperios hora (amperios * horas) y vatios hora (watts * horas) requiere el seguimiento del componente de tiempo, y la realización de un par de cálculos más como los siguientes:

MEDIR VOLTIOS EN ALTERNA.

Antes de presentar el código previsto, he pensado en realizar un pequeño añadido como es, hacer que nuestro voltímetro pueda leer tensiones alternas hasta 30V. Esto se puede realizar al menos en teoría, mediante la aplicación de un puente rectificador para que su salida lea la tensión una vez rectificada naturalmente, debemos hacer un filtrado para que nuestra lectura no se desvíe de la realidad y un divisor de tensión para que devuelva el valor real en alterna.

volt_ac Fig. 13

El esquema anterior nos sirve para medir una tensión alterna de rango hasta 30V, la tensión a mesurar atraviesa el puente rectificador y es filtrada por el electrolítico de 220uf/63V, luego llega al divisor de tensión como se muestra y éste nos presenta la tensión a mesurar. Las resistencias R1 y R2 se han calculado para que entreguen la tensión más cercana a la real (la Vin al rectificarse y filtrarse se multiplica por √2 = 1.4142, luego la tensión de salida del divisor debe descontar este 1.4142 para que la lectura sea cercana a la real, después, como seguridad se ha puesto diodo zener de 5V.1 evitando así que se deteriore el micro.

Para hacernos una idea, la siguiente imagen, es un esbozo del proyecto volt-amperímetro para CC+AC con LCD.

voltamp-con-arduino+lcd- fig. 14

UN MOMENTO.

Veamos que es lo que tenemos claro hasta el momento, hemos resuelto el voltímetro, el amperímetro y ahora hemos añadido el voltímetro en alterna. El esquema final sería el siguiente:

esq_voltampwat Fig. 15

Sólo nos queda realizar el boceto que aúna los tres dispositivos en uno. Veamos:

EL CÓDIGO.

En esta ocasión se interviene el tiempo para extraer los vatios/hora.

Esto es todo por este tutorial, espero que les interese a los lectores y estoy esperando sus consultas.

10 comentarios sobre «Sensor de Corriente ACS712.»

  1. Hola Vicente. Me sirvió de mucho la manera que utilizaste para medir la corriente continua, usando la función map(), pues cuando probé por primera vez este sensor, con otro sketch, las lecturas no correspondian con la realidad.
    Comentarte que tuve problemas (que luego solucioné) con los 5V que alimentan al sensor, desde Arduino. Midiendo con un tester comprobé que eran 4,68V, con lo que ya no entregaba 2,5V con 0mA. Pude ajustar a 512 el valor de la entrada analógica. El siguiente problema fue el rango de mapeo. Como nunca entregará 5V en su salida, tuve que modificar el valor de 1023 por otro menor, para una corriente máxima de 5A (que es el modelo que yo tengo). Usando un motor de RC de 240mA y el tester pude calibrar ese valor de 1023 y dejarlo en unos 640. De esa forma, el mapeo lo hace desde 512 hasta 640, para valores de corriente entre 0mA y 5000mA.
    Dicho de otra forma, como no recibe 5V nunca entregará ese voltaje a su salida, y por lo tanto Arduino nunca leerá 1023 en su entrada.
    Espero haberme explicado.

    Gracias de nuevo y saludos.

  2. Excelente estaba buscando algo como esto para un probador de baterías estaba tratando de hacer el sensor con un shunt pero no es lo exacto que queria con esto si puedo alcanzar lo que busco muchas gracias

  3. Hola: me alegra ver que hay personas que se brindan a exponer sus trabajos para otros. Yo se lo agradezco, pero perdone que le diga que estoy hecho la picha un lio.
    en un dibujo pone A0,y A1, en un sketch pone A1 A2 , no veo por ningun sitio los 0,66 para el ACS712, y ademas no me funciona . o yo soy muy torpe, o no me explico como se puede variar tanto las cosas, ya que se a pegado un buen rato escribiendo. si no se molesta , (que no es mi intención) podria ser mas escueto y realizar un sketch que fuese el autentico y no dar mas vueltas. se lo agradeceria mucho, pues piense que todo el mundo no somos igual de listos. gracias

  4. Perdon por mi ignorancia…¿como pueden circular 30 A por esas pequeñas borneras verdes, cuando el cable que lleva 30 A tiene que ser mucho mas grueso? ¿No se sobrecalientan?

  5. Hello
    Vincent Garcia
    greetings
    a question
    AMMETER WITH ACS712
    How would the connection be for a 2.4 NEXTION screen and an ARDUINO NANO, how would the codes be?
    CIRCULATION VOLTAGE 30V 10A, I will use the ACS712ELCTR-20A-T
    Cheers

    1. Hola Daniel.
      Ante todo lamento decir que desconozco la pantalla 2.4 NEXTION, aunque entiendo que dispones de su conexionado habitual. A grandes rasgos, la conexión general del ACS712 XXX, lo puedes ver en la figura 2. En cuanto a los códigos poco más puedo añadir ya que como digo desconozco esa pantalla. Entiendo que el código no debería diferir demasiado aunque debes seguir las recomendaciones del fabricante de la librería adecuada para esa pantalla.
      Siento no poder ayudarte más.
      Saludos y cuídate.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.