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
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
Tengo entonces, por comprobación o por determinación (
./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
La ecuación de una recta conocido dos puntos
Que despejando la y, valor que querríamos obtener, tenemos:
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.