Ir al contenido

Cómo convertir una señal 4-20mA a 0-10V en un PLC Arduino

Conexión con resistencia de 500 Ω, tabla de mA a voltios, fórmula de escalado, detección de fallo del lazo y código Arduino para entradas 0-10 V
9 de enero de 2019 por
Cómo convertir una señal 4-20mA a 0-10V en un PLC Arduino
Boot & Work Corp. S.L, Support Team

Para convertir una señal de 4-20 mA a 0-10 V, conecta una resistencia de 500 Ω entre la entrada analógica y 0 V (GND) y deja que la corriente del lazo pase por ella. Por la ley de Ohm (V = I × R), 4 mA dan 2 V y 20 mA dan 10 V, así que una entrada 0-10 V de un PLC lee el sensor como una señal de 2-10 V.

Esta guía explica la conexión de un transmisor a 2 hilos, una tabla de mA a voltios y cuentas del ADC, la fórmula de escalado a unidades de ingeniería, cómo detectar un lazo roto y un código Arduino probado para un Arduino PLC. También explica los errores que añaden la resistencia y la impedancia de entrada, y cuándo necesitas un convertidor aislado en lugar de una resistencia.

 
 

¿Qué es una señal de 4-20 mA?

Una señal de 4-20 mA es una señal analógica de corriente. Un transmisor (de presión, nivel, caudal o temperatura) fija la corriente del lazo: 4 mA es el valor más bajo de su rango de medida y 20 mA el más alto. Por ejemplo, un transmisor de presión de 0-10 bar da 4 mA a 0 bar, 12 mA a 5 bar y 20 mA a 10 bar.

4-20 mA es la señal analógica estándar de los transmisores industriales porque la corriente es la misma en todos los puntos de un lazo en serie. La resistencia de un cable largo no cambia el valor, y el "cero vivo" de 4 mA permite al PLC distinguir un cero real de un hilo roto.

Dos propiedades hacen de 4-20 mA la opción por defecto para los sensores de campo:

  • Cables largos. Una señal de tensión pierde parte de su valor en la resistencia del cable y capta ruido de motores, contactores y variadores. En un lazo de corriente, el transmisor mantiene la corriente constante mientras la fuente tenga tensión suficiente, así que la resistencia del cable no cambia la lectura.
  • Cero vivo. La señal nunca baja de 4 mA en funcionamiento normal. Una corriente cercana a 0 mA solo puede significar un cable cortado, un borne suelto o un transmisor sin alimentación.

La mayoría de transmisores de 4-20 mA son de 2 hilos: los mismos dos hilos llevan la alimentación y la señal. El lazo necesita una fuente de continua, normalmente de 24 Vdc.

Una entrada analógica de PLC suele medir tensión. En el Arduino PLC (M-Duino y Ardbox), el ESP32 PLC y el Raspberry PLC las entradas analógicas miden de 0 a 10 Vdc (datasheets de cada familia). La excepción es el ESP32 PLC 14: sus entradas AI0.0 y AI0.1 también tienen un modo 4-20 mA. Para leer un transmisor de 4-20 mA en estas entradas, conviertes la corriente en tensión con una resistencia.

Resistencia de 500 Ω: la ley de Ohm convierte 4-20 mA en 2-10 V

La resistencia es un convertidor de corriente a tensión. La tensión en sus bornes es la corriente del lazo multiplicada por su resistencia.

V = I × R = 0,020 A × 500 Ω = 10 V4 mA × 500 Ω = 2 V · 12 mA × 500 Ω = 6 V · 20 mA × 500 Ω = 10 V

500 Ω es el valor que pone 20 mA justo en el máximo de una entrada 0-10 V. Para una entrada 0-5 V, usa 250 Ω: 4-20 mA pasa a ser 1-5 V. Es el caso de una placa Arduino Uno, Mega o Leonardo, cuyos pines analógicos leen de 0 a 5 V.

La tabla muestra lo que lee una entrada de 10 bits y 0-10 V (de 0 a 1023 cuentas), como en el M-Duino y el Ardbox. La columna "ideal" usa solo los 500 Ω. Las dos últimas columnas incluyen la impedancia de entrada de 39 kΩ de la entrada analógica del M-Duino (ver la sección siguiente).

Corriente del lazoTensión, 500 Ω idealCuentas, idealTensión con entrada de 39 kΩCuentas con entrada de 39 kΩSignificado
0 mA0 V00 V0Hilo roto o sin alimentación
3,6 mA1,80 V1841,78 V182Límite de fallo (NAMUR NE 43)
4 mA2,00 V2051,98 V2020 % del rango
8 mA4,00 V4093,95 V40425 %
12 mA6,00 V6145,92 V60650 %
16 mA8,00 V8187,90 V80875 %
20 mA10,00 V10239,87 V1010100 % del rango
21 mA10,50 V1023 (fondo de escala)10,37 V1023 (fondo de escala)Fallo alto (NAMUR NE 43)

Cuentas = V / 10 V × 1023, redondeado. 4 mA dan 204,6 cuentas, que el ADC lee como 204 o 205. La gráfica muestra la misma recta de 2 V a 10 V.

Resultado de 4mA (2Vdc) - Gráfico lineal

Dos puntos prácticos sobre la resistencia:

  • Potencia. A 20 mA, una resistencia de 500 Ω disipa P = I² × R = 0,2 W. Usa una resistencia con una potencia nominal bastante mayor, por ejemplo 0,5 W.
  • Tolerancia. El error de lectura sigue a la tolerancia de la resistencia uno a uno: una resistencia del 5 % da hasta un 5 % de error. Usa una resistencia de precisión (1 % o mejor) o calibra la entrada.

Conexión de un transmisor de 4-20 mA a 2 hilos a una entrada analógica de un Arduino PLC

La resistencia va en paralelo con la entrada analógica, entre el borne de entrada y el 0 V del PLC. El transmisor va en serie en el lazo, entre el +24 Vdc de la fuente y la entrada.

  1. Paso 1+24 Vdc al transmisorConecta el + de la fuente de 24 Vdc al borne + del transmisor.
  2. Paso 2Del transmisor a la entradaConecta el borne - del transmisor a una entrada analógica, por ejemplo la I0.7 de un M-Duino.
  3. Paso 3500 Ω a 0 VConecta la resistencia entre el mismo borne de entrada y el GND (0 V) del PLC.
  4. Paso 40 V comúnEl 0 V de la fuente de 24 Vdc y el GND del PLC deben ser la misma referencia.
Diagrama del circuito convertidor Arduino Aplicación industrial para señales analógicas Diagrama
Circuito convertidor: la resistencia de 500 Ω entre la entrada analógica y GND convierte la corriente del lazo en tensión.
Conexión de un sensor a 2 hilos: el transmisor está en serie entre la fuente de 24 Vdc y la entrada analógica.

En un transmisor a 3 o 4 hilos, el sensor tiene sus propios bornes de alimentación. Conecta su salida de corriente a la entrada analógica y su retorno de señal al 0 V del PLC. La resistencia sigue entre la entrada y 0 V.

Comprueba la tensión del lazo. A 20 mA la resistencia se queda 10 V de los 24 V de la fuente. El transmisor y el cable tienen los 14 V restantes. El datasheet del transmisor da la tensión mínima de alimentación en sus bornes: debe ser menor que 14 V menos la caída de tensión en el cable (resistencia del cable × 0,02 A). Si no lo es, la corriente deja de subir antes de 20 mA y la parte alta del rango se lee baja.

En el M-Duino y el Ardbox, las entradas analógicas son entradas "Analog/Digital" (datasheets): el mismo borne lee 0-10 V con analogRead() o un nivel digital con digitalRead(). Para un lazo de 4-20 mA, léela con analogRead(). Usa una resistencia para cada lazo: dos transmisores no deben compartir la misma resistencia ni la misma entrada.

La impedancia de entrada y la resolución del ADC cambian la lectura real

La entrada del PLC no es un circuito abierto. Su impedancia de entrada está en paralelo con la resistencia de 500 Ω, así que parte de la corriente del lazo entra en la entrada y la tensión es un poco menor.

Tienes dos formas de corregir el error. Usa la resistencia equivalente (493,7 Ω en un M-Duino) en la conversión, como hace el código de abajo. O haz una calibración a dos puntos: inyecta 4,00 mA y 20,00 mA con un calibrador de lazo, anota las cuentas y úsalas como extremos de la escala. La calibración también elimina la tolerancia de la resistencia, así que es la mejor opción cuando importa la precisión.

Resolución: en una entrada de 10 bits y 0-10 V una cuenta son 9,8 mV. Con 493,7 Ω son unos 0,02 mA, es decir, el 0,12 % del rango de 16 mA. El rango de 4-20 mA usa unas 808 de las 1024 cuentas, porque los 2 V inferiores son el cero vivo.

Fórmula de escalado de 4-20 mA a unidades de ingeniería

Un transmisor de 4-20 mA es lineal. Para obtener el valor de proceso, resta el offset de 4 mA y divide por el rango de 16 mA:

PV = PVmin + (I - 4 mA) / 16 mA × (PVmax - PVmin)Ejemplo, transmisor de 0-10 bar a 12 mA: 0 + (12 - 4) / 16 × 10 = 5 bar

Calcúlalo para tu PLC: calculadora 4-20 mA

La misma fórmula sirve para una sonda de nivel (por ejemplo de 0-250 cm), un transmisor de temperatura (por ejemplo de -50 a 150 °C) o un caudalímetro. Solo cambian PVmin y PVmax. Déjalos como constantes en el programa: si cambias de transmisor, cambias dos números.

Si prefieres trabajar directamente con cuentas, usa las cuentas a 4 mA y a 20 mA de la tabla o de tu calibración: PV = PVmin + (cuentas - cuentas4mA) / (cuentas20mA - cuentas4mA) × (PVmax - PVmin).

Detección de fallo del lazo: un hilo roto lee menos de 3,6 mA

El cero vivo es el diagnóstico. La recomendación NAMUR NE 43 define cómo un transmisor informa de su estado con la corriente del lazo:

Corriente del lazoSignificado según NAMUR NE 43Qué debe hacer el programa del PLC
3,6 mA o menosFallo (bajo)Alarma. No uses el valor. Un hilo roto o la falta de alimentación también se leen aquí (0 mA).
De 3,6 a 3,8 mAFuera del rango de medidaMuestra el mínimo del rango y avisa.
De 3,8 a 20,5 mAMedidaEscala con la fórmula.
De 20,5 a 21 mAFuera del rango de medidaMuestra el máximo del rango y avisa.
21 mA o másFallo (alto)Alarma. No uses el valor.

Límite de una resistencia de 500 Ω en una entrada 0-10 V: 20 mA ya dan los 10 V completos. Con la entrada de 39 kΩ del M-Duino, la entrada llega al fondo de escala a unos 20,3 mA. Por encima de ese valor la lectura se queda en 1023 cuentas, así que el PLC no puede distinguir 20,5 mA de un fallo alto de 21 mA. Dos soluciones:

  • Configura el transmisor para que indique los fallos con la corriente baja (3,6 mA o menos), si tiene esta opción. Así el PLC detecta todos los fallos en la parte baja de la escala.
  • Usa una resistencia menor, por ejemplo de 470 Ω. Con la entrada de 39 kΩ, 21 mA dan 9,75 V y se pueden leer. Pierdes un 6 % de resolución, aproximadamente, y debes usar 470 Ω en la conversión.

Nunca trates una lectura por debajo de 4 mA como "nivel cero" o "presión cero". Una bomba controlada por una sonda de nivel con el cable cortado trabajaría en seco. El programa debe ir a un estado seguro y mantener una protección cableada (un interruptor de flotador, un presostato) que no dependa de la señal analógica.

Código Arduino: leer 4-20 mA, escalar y detectar un lazo roto

Este sketch lee un transmisor de 0-10 bar en la entrada I0.7 de un M-Duino con una resistencia de 500 Ω. Promedia 16 muestras, convierte las cuentas a mA con la resistencia equivalente, comprueba el lazo y escala el valor. Compila para el ATmega2560 del M-Duino (7,3 KB de flash) y la conversión se ha probado en un PC con lecturas simuladas de 0 a 21 mA. Para compilarlo, instala las placas de Industrial Shields en el Arduino IDE: definen los nombres de los pines, como I0_7.

// 4-20 mA transmitter on an M-Duino analog input (0-10 Vdc, 10 bit)
// A 500 ohm resistor between the input and GND turns 4-20 mA into 2-10 V.

const uint8_t AI_PIN = I0_7;        // analog input used for the loop

const float ADC_MAX  = 1023.0;      // 10 bit: M-Duino and Ardbox
const float AI_RANGE = 10.0;        // input range in volts
const float R_SHUNT  = 500.0;       // resistor in ohm
const float R_INPUT  = 39000.0;     // input impedance from the datasheet
const float R_EQ = R_SHUNT * R_INPUT / (R_SHUNT + R_INPUT);  // 493.7 ohm

const float PV_MIN = 0.0;           // value at 4 mA (example: 0 bar)
const float PV_MAX = 10.0;          // value at 20 mA (example: 10 bar)

const float MA_FAULT_LOW = 3.6;     // NAMUR NE 43: 3.6 mA or less is a fault
const uint8_t N_SAMPLES = 16;

float readCounts() {
  uint32_t sum = 0;
  for (uint8_t i = 0; i < N_SAMPLES; i++) {
    sum += analogRead(AI_PIN);
  }
  return (float)sum / N_SAMPLES;
}

float countsToMilliamps(float counts) {
  float volts = counts * AI_RANGE / ADC_MAX;
  return volts / R_EQ * 1000.0;
}

void setup() {
  Serial.begin(115200);
  pinMode(AI_PIN, INPUT);
}

void loop() {
  float counts = readCounts();
  float mA = countsToMilliamps(counts);

  Serial.print(mA, 2);
  Serial.print(" mA  ");

  if (mA <= MA_FAULT_LOW) {
    // Broken wire, transmitter without power or a low fault signal
    Serial.println("LOOP FAULT");
  } else if (counts >= ADC_MAX - 1) {
    // The input is at full scale: the real current can be higher
    Serial.println("INPUT AT FULL SCALE");
  } else {
    float pv = PV_MIN + (mA - 4.0) * (PV_MAX - PV_MIN) / 16.0;
    if (pv < PV_MIN) pv = PV_MIN;   // 3.6 to 4 mA: under range
    Serial.print(pv, 2);
    Serial.println(" bar");
  }

  delay(500);
}

Para usarlo en otro PLC, cambia tres constantes: ADC_MAX (2047 en un ESP32 PLC, 4095 en un Raspberry PLC), R_INPUT (la impedancia de entrada de tu PLC, o quita la corrección en paralelo y calibra) y AI_PIN. Para conseguir una lectura más estable, consulta cómo mejorar la lectura analógica.

Salida esperada con un lazo sano a media escala: 12.00 mA 5.00 bar. Con el cable desconectado: 0.00 mA LOOP FAULT.

Resistencia o convertidor aislado de 4-20 mA a 0-10 V

Una resistencia es suficiente cuando el PLC, la fuente del transmisor y la resistencia comparten el mismo 0 V, dentro de un mismo armario. En los demás casos, la opción correcta es un convertidor de señal activo y aislado.

CriterioResistencia de 500 ΩConvertidor de señal aislado
Cómo funcionaLey de Ohm, pasivoMide la corriente y genera una nueva salida de 0-10 V
Aislamiento galvánicoNo: el lazo y el PLC comparten 0 VSí: entrada, salida y alimentación están separadas
Lazo ya usado por otro equipoSolo si las referencias de 0 V son compatibles y la tensión del lazo es suficienteSí, es un uso típico
Bucles de masa, cables largos entre edificiosRiesgo de offset y ruidoCorta el bucle de masa
AlimentaciónNingunaNecesita su propia alimentación
PrecisiónTolerancia de la resistencia más el error de la impedancia de entradaLa del datasheet del convertidor

Para una instalación en carril DIN, Industrial Shields tiene el IS.ACANTO10-0.5k: una resistencia de 500 Ω con una tolerancia de ±1 % dentro de un borne de paso, así que la conversión queda en el carril, al lado del PLC.

PLC Ardbox Q Analog con Arduino UNO Q y entradas analógicas de 0 a 10 V

Nuevo: Ardbox Q

Leer 4-20 mA con un Ardbox Q Analog

Ardbox Q Analog tiene 6 entradas analógicas de 0 a 10 V con resolución de 10 bits. Con la resistencia de 500 Ω de esta guía, cada entrada lee un transmisor de 4-20 mA como 2 a 10 V. El programa de control se ejecuta en el microcontrolador, y la parte Linux del mismo equipo puede registrar los valores o mostrarlos en un panel de Node-RED.

Ver Ardbox Q Analog Cómo funciona Ardbox Q

Hardware y software para el ejemplo de 4-20 mA a 0-10 V

PLC basado en Arduino

Arduino PLC

M-Duino (familia Ethernet) o Ardbox (familia de 20 E/S). Los dos tienen entradas analógicas/digitales de 0-10 V con 10 bits de resolución.

Borne de paso IS.ACANTO10-0.5k para carril DIN con resistencia de 500 Ω

Resistencia de 500 Ω

Una por lazo. Un borne de carril DIN con una resistencia de ±1 %, o cualquier resistencia del 1 % de 0,5 W o más.

Arduino IDE

Arduino IDE

El Arduino IDE con las placas de Industrial Shields instaladas. El ejemplo "AnalogInput" del IDE sirve como primera prueba rápida.

Transmisores de 4-20 mA en proyectos con PLC

Para lo básico de las entradas analógicas (resolución, rangos, señales de tensión y de corriente), consulta los fundamentos de las entradas analógicas de un PLC industrial.

Próximos pasos con señales de 4-20 mA en un PLC

Ver la familia Arduino PLCConsulta a un ingeniero sobre tus sensores

Llévalo a la práctica

Tres formas de pasar de una señal de 4-20 mA a una medida que funciona: el borne con resistencia para carril DIN, una simulación con transmisores de 4-20 mA y un caso con sensores analógicos.

Preguntas frecuentes sobre la conversión de 4-20 mA a 0-10 V

¿Cómo convierto 4-20 mA a 0-10 V?

Conecta una resistencia de 500 Ω entre la entrada analógica y 0 V y pon la entrada en el lazo. La corriente que pasa por la resistencia da 2 V a 4 mA y 10 V a 20 mA. Si necesitas aislamiento galvánico, usa un convertidor de señal aislado.

¿Qué tensión dan 4 mA con una resistencia de 500 Ω?

2 V (0,004 A × 500 Ω). En una entrada de 10 bits y 0-10 V son unas 205 cuentas, o 202 cuentas en un M-Duino por su impedancia de entrada de 39 kΩ.

¿Qué resistencia convierte 4-20 mA a 0-5 V?

250 Ω. 4 mA dan 1 V y 20 mA dan 5 V. Úsala con entradas que leen de 0 a 5 V, como los pines analógicos de una placa Arduino Uno, Mega o Leonardo.

¿Puedo conectar un sensor de 4-20 mA directamente a un pin analógico de Arduino?

No. El pin analógico mide tensión, no corriente. Necesitas la resistencia de 250 Ω y una fuente de 24 Vdc para el lazo, y el pin nunca debe ver más de su tensión máxima. Un PLC industrial con entradas de 0-10 V y una resistencia de 500 Ω da más margen.

¿Por qué 4-20 mA empieza en 4 mA y no en 0 mA?

El cero vivo de 4 mA alimenta los transmisores a 2 hilos en la parte baja del rango y permite al PLC detectar fallos. Un lazo sano nunca lee menos de unos 3,8 mA, así que una lectura cercana a 0 mA indica un hilo roto o un transmisor sin alimentación.

¿Qué longitud puede tener un cable de 4-20 mA?

Depende de la tensión del lazo. La tensión de la fuente menos los 10 V de la resistencia y la tensión mínima del transmisor da la tensión que queda para el cable. Divídela por 0,02 A para obtener la resistencia máxima del cable (los dos hilos) y usa la resistencia por metro de tu cable. La calculadora 4-20 mA hace este cálculo con tu cable y tu fuente.

Buscar en nuestro blog

Cómo convertir una señal 4-20mA a 0-10V en un PLC Arduino
Boot & Work Corp. S.L, Support Team 9 de enero de 2019
Compartir esta publicación

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs