index.html (8347B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 <title>Interpolación lineal simple para calcular la temperatura de termorresistencias Pt100</title> 7 <link rel="icon" type="image/png" href="/favicon.png" /> 8 <link rel="stylesheet" type="text/css" href="../article.css" /> 9 </head> 10 <body> 11 <header> 12 <p class="title">Interpolación lineal simple para calcular la temperatura de termorresistencias Pt100</p> 13 <p class="date">25 de noviembre de 2021 • fjbalon</p> 14 </header> 15 <p>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.</p> 16 <p>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:</p> 17 <ul> 18 <li>Relación temperatura-resistencia casi lineal.</li> 19 <li>Alta resistividad (59Ω/cmf en comparación con 36Ω/cmf para níquel).</li> 20 <li>Resistencia eléctrica no degradable en el tiempo.</li> 21 <li>Excelente estabilidad.</li> 22 <li>Muy buena pasividad química.</li> 23 <li>Alta resistencia a la contaminación.</li> 24 </ul> 25 <p>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.</p> 26 <p>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 <emb>+1.0ºC</emb>, y en el mismo diseño, un Pt1000 podría ser <emb>+0.1ºC</emb>.</p> 27 <p>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 <emb>-100~100ºC</emb>.</p> 28 <p>Tengo entonces, por comprobación o por determinación (<emb>"By default, the High Alarm value is +32767 (0x7FFF) and the low alarm value is -32768 (0xFFFF)"</emb>) que el valor límite absoluto es <emb>32768</emb>; siendo entonces un rango de <emb>-32768~32767</emb>.</p> 29 <pre><code>./modpoll -r2 -1 -t3 172.16.20.13 30 31 Protocol configuration: MODBUS/TCP, FC4 32 Slave configuration...: address = 1, start reference = 2, count = 1 33 Communication.........: 172.16.20.13, port 502, t/o 1.00 s, poll rate 1000 ms 34 Data type.............: 16-bit register, input register table 35 36 -- Polling slave... 37 [2]: 6372 38 39 40 ./modpoll -r3 -1 -t3 172.16.20.13 41 42 Protocol configuration: MODBUS/TCP, FC4 43 Slave configuration...: address = 1, start reference = 3, count = 1 44 Communication.........: 172.16.20.13, port 502, t/o 1.00 s, poll rate 1000 ms 45 Data type.............: 16-bit register, input register table 46 47 -- Polling slave... 48 [3]: 8388 49 </code></pre> 50 <p>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 <emb>y = r(x)</emb> y calcular los valores intermedios según esta recta.</p> 51 <p>La ecuación de una recta conocido dos puntos <emb>(x1,y1)</emb> y <emb>(x2,y2)</emb> es:</p> 52 53 <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="\frac{(y-y_{1})}{(y_{2}-y_{1})}=\frac{(x-y_{1})}{(x_{2}-x_{1})}" display="block"> 54 <mrow> 55 <mfrac> 56 <mrow> 57 <mo stretchy="false">(</mo> 58 <mrow> 59 <mi>y</mi> 60 <mo>-</mo> 61 <msub> 62 <mi>y</mi> 63 <mn>1</mn> 64 </msub> 65 </mrow> 66 <mo stretchy="false">)</mo> 67 </mrow> 68 <mrow> 69 <mo stretchy="false">(</mo> 70 <mrow> 71 <msub> 72 <mi>y</mi> 73 <mn>2</mn> 74 </msub> 75 <mo>-</mo> 76 <msub> 77 <mi>y</mi> 78 <mn>1</mn> 79 </msub> 80 </mrow> 81 <mo stretchy="false">)</mo> 82 </mrow> 83 </mfrac> 84 <mo>=</mo> 85 <mfrac> 86 <mrow> 87 <mo stretchy="false">(</mo> 88 <mrow> 89 <mi>x</mi> 90 <mo>-</mo> 91 <msub> 92 <mi>y</mi> 93 <mn>1</mn> 94 </msub> 95 </mrow> 96 <mo stretchy="false">)</mo> 97 </mrow> 98 <mrow> 99 <mo stretchy="false">(</mo> 100 <mrow> 101 <msub> 102 <mi>x</mi> 103 <mn>2</mn> 104 </msub> 105 <mo>-</mo> 106 <msub> 107 <mi>x</mi> 108 <mn>1</mn> 109 </msub> 110 </mrow> 111 <mo stretchy="false">)</mo> 112 </mrow> 113 </mfrac> 114 </mrow> 115 </math> 116 <p>Que despejando la y, valor que querríamos obtener, tenemos:</p> 117 <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="y=y_{1}+\frac{(y_{2}-y_{1})}{(x_{2}-x_{1})}(x-x_{1})" display="block"> 118 <mrow> 119 <mi>y</mi> 120 <mo>=</mo> 121 <mrow> 122 <msub> 123 <mi>y</mi> 124 <mn>1</mn> 125 </msub> 126 <mo>+</mo> 127 <mrow> 128 <mfrac> 129 <mrow> 130 <mo stretchy="false">(</mo> 131 <mrow> 132 <msub> 133 <mi>y</mi> 134 <mn>2</mn> 135 </msub> 136 <mo>-</mo> 137 <msub> 138 <mi>y</mi> 139 <mn>1</mn> 140 </msub> 141 </mrow> 142 <mo stretchy="false">)</mo> 143 </mrow> 144 <mrow> 145 <mo stretchy="false">(</mo> 146 <mrow> 147 <msub> 148 <mi>x</mi> 149 <mn>2</mn> 150 </msub> 151 <mo>-</mo> 152 <msub> 153 <mi>x</mi> 154 <mn>1</mn> 155 </msub> 156 </mrow> 157 <mo stretchy="false">)</mo> 158 </mrow> 159 </mfrac> 160 <mo></mo> 161 <mrow> 162 <mo stretchy="false">(</mo> 163 <mrow> 164 <mi>x</mi> 165 <mo>-</mo> 166 <msub> 167 <mi>x</mi> 168 <mn>1</mn> 169 </msub> 170 </mrow> 171 <mo stretchy="false">)</mo> 172 </mrow> 173 </mrow> 174 </mrow> 175 </mrow> 176 </math> 177 <img class="color-invertible" style="width: 40%;" src="resources/grafico-interpolacion-lineal.png" /> 178 <p>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:</p> 179 <pre><code>#include <stdio.h> 180 #include <stdlib.h> 181 182 int main(int argc,char *argv[]) 183 { 184 float x, x1 = -32768.0, x2 = 32768.0; 185 float y, y1 = -100.0, y2 = 100.0; 186 187 if( argc > 1 ) { 188 x = atof(argv[1]); 189 } 190 191 y = y1 + ((y2 - y1)/(x2 - x1)) * (x - x1); 192 193 printf("Interpolación lineal = %f\n",y); 194 return(0); 195 }</code></pre> 196 <p>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.</p> 197 <pre><code>./interpolacion-lineal 6372 198 Interpolación lineal = 19.447624 199 ./interpolacion-lineal 8388 200 Interpolación lineal = 25.600060</code></pre> 201 <p>Es decir, obtendríamos 19,45ºC y 25,60ºC, respectivamente.</p> 202 </body> 203 </html>