Interpolación lineal simple para calcular la temperatura de termorresistencias Pt100

25 de noviembre de 2021 • fjbalon

El principio básico de un RTD es que su sensor de cable, hecho de un metal con una resistencia eléctrica conocida, cambia su valor de resistencia a medida que la temperatura sube o baja. Aunque las termorresistencias tienen ciertas limitaciones, que incluyen una temperatura de medición máxima de alrededor de 1,100°F (600°C), en general, son la solución de medición de temperatura ideal para una multitud de procesos.

Los cables de detección en un RTD pueden estar hechos de níquel (Ni), cobre (Cu) o tungsteno (W), pero el platino (Pt) es, con mucho, el metal más popular usado en la actualidad. Es más caro que otros materiales, pero el platino tiene varias características que lo hacen particularmente adecuado para las mediciones de temperatura, que incluyen:

Entre los sensores RTD de platino, Pt100 y Pt1000 son los más comunes. Los sensores Pt100 tienen una resistencia nominal de 100Ω en el punto de hielo (0°C). La resistencia nominal de los sensores Pt1000 a 0°C es de 1.000Ω. La linealidad de la curva característica, el rango de temperatura de operación y el tiempo de respuesta son los mismos para ambos. El coeficiente de temperatura de resistencia es también el mismo.

Sin embargo, debido a la diferente resistencia nominal, las lecturas de los sensores Pt1000 son mayores en un factor de 10 en comparación con los sensores Pt100. Esta diferencia se hace evidente cuando se comparan configuraciones de 2 cables, donde se aplica el error de medición del cable. Por ejemplo, el error de medición en un Pt100 podría ser +1.0ºC, y en el mismo diseño, un Pt1000 podría ser +0.1ºC.

Tras contextualizar expongo el problema: leyendo mediante modbus los datos recibidos de un par de termorresistencias Pt100, me percaté que recibía, evidentemente, los datos raw. Pero no encontraba en documentación de los sensores ni en Internet el factor de conversión de esta unidad a grados. Mi única pista era la interfaz web del aparato, que establecía el rango de limitación como -100~100ºC.

Tengo entonces, por comprobación o por determinación ("By default, the High Alarm value is +32767 (0x7FFF) and the low alarm value is -32768 (0xFFFF)") que el valor límite absoluto es 32768; siendo entonces un rango de -32768~32767.

./modpoll -r2 -1 -t3 172.16.20.13

Protocol configuration: MODBUS/TCP, FC4
Slave configuration...: address = 1, start reference = 2, count = 1
Communication.........: 172.16.20.13, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table

-- Polling slave...
[2]: 6372


./modpoll -r3 -1 -t3 172.16.20.13

Protocol configuration: MODBUS/TCP, FC4
Slave configuration...: address = 1, start reference = 3, count = 1
Communication.........: 172.16.20.13, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table

-- Polling slave...
[3]: 8388

Y obteniendo los valores raw de cada sensor, necesitaría reproducir lo más fiel posible una función a la representada con estos valores. Para ello, realizaría una interpolación lineal simple, consiste en trazar una recta que pasa por dos puntos conocidos y = r(x) y calcular los valores intermedios según esta recta.

La ecuación de una recta conocido dos puntos (x1,y1) y (x2,y2) es:

( y - y 1 ) ( y 2 - y 1 ) = ( x - y 1 ) ( x 2 - x 1 )

Que despejando la y, valor que querríamos obtener, tenemos:

y = y 1 + ( y 2 - y 1 ) ( x 2 - x 1 ) ( x - x 1 )

Por deformación profesional, en lugar de hacer estos cálculos a mano he desarrollado un pequeño programa en C que calculase esta ecuación, donde los valores de x corresponden a los valores raw y los valores de y a los valores en grados; siendo la y precisamente el valor a obtener:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
  float x, x1 = -32768.0, x2 = 32768.0;
  float y, y1 = -100.0, y2 = 100.0;

  if( argc > 1 ) {
  x = atof(argv[1]);
  }

  y = y1 + ((y2 - y1)/(x2 - x1)) * (x - x1);

  printf("Interpolación lineal = %f\n",y);
  return(0);
}

De tal forma que, pasando como parámetro el valor obtenido por modbus, y estando x1, x2, y1, e y2 calibrados en código, sólo cabría obtener la variable esperada y.

./interpolacion-lineal 6372
Interpolación lineal = 19.447624
./interpolacion-lineal 8388
Interpolación lineal = 25.600060

Es decir, obtendríamos 19,45ºC y 25,60ºC, respectivamente.