Autor Tema: Polarizar una resistencia NTC para medir temperatura.  (Leído 10443 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #15 en: 01 de Septiembre de 2014, 20:36:27 »
Ahora falta hacer lo contrario, que es lo que realmente interesa.
Hay que calcular la temperatura en función de la tensión de salida y comprobar el error cometido.


Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #16 en: 02 de Septiembre de 2014, 11:06:04 »
Después de estudiar el tema, los resultados son bastante buenos.

Circuito a utilizar
Utilizaré el mismo circuito sencillo del comienzo. Una resistencia en serie con la NTC:

                            R1                    NTC
   (+5V)----------[====]-----o-----[====]-------------(GND)
                                           |
                                           |_________________ Vout



Rango de temperaturas
He escogido un rango de temperaturas bastante amplio para comprobar si el método era capaz de llegar a todas las temperaturas:

   Temperatura mínima =    -20ºC
   Temperatura máxima =  150ºC



Resistencia de polarizacion
Para escoger la resistencia de polarización R1 óptima, hay que calcular la sensibilidad del divisor de tensión en todo el rango de temperaturas.

En una hoja excel se calcula primero la resistencia NTC con la fórmula y los datos del fabricante, para varias temperaturas:

    R_ntc =   R_ntc_25 * exp( A + B / T + C / T^2 + D / T^3)

    R_ntc_25  = 10000 ohms
    A = -10,2296
    B = 2887,62
    C = 132336
    D = -25025100

    La letra T representa la temperatura en grados kelvin, según la fórmula:
    T = ºC + 273.15

A continuación en otra columna se calcula la tensión de salida del divisor según la fórmula:

   Vout = Vcc * R_ntc / (R1 + R_ntc)

Por último se calcula en otra columna la sensibilidad del sensor dividiendo la variación de la tensión de salida entre la variación de la temperatura

Un gráfico mostrará la sensibilidad en todo el rango. Con este gráfico, se puede ir variando R1 hasta que la sensibilidad sea máxima en el medio del intervalo de temperaturas y la sensibilidad en los extremos sea semejante.
Con estos criterios, el valor estandar de la serie E12 que más se ajusta es:

R1 = 3300 ohmios

Temp   Sensibilidad [mV/ºC]
-20       13,53
-10       17,83
0       22,43
10      26,90
20      30,71
30      33,38
40      34,63
50      34,39
60      32,86
70      30,38
80      27,34
90      24,07
100      20,85
110      17,84
120      15,14
130      12,79
140      10,77
150      9,06

La máxima sensibilidad está entre 40 y 50ºC
La sensibilidad en los extremos es aproximadamente de 10mV/ºC con poca variación entre ambos.


Saludos.
« Última modificación: 02 de Septiembre de 2014, 12:06:47 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #17 en: 02 de Septiembre de 2014, 12:52:58 »
Una vez calculada la mejor resistencia de polarización, el problema consiste en traducir la tensión que da el circuito en un valor de temperatura exacto.

Hay varias fórmulas que devuelven el valor de la temperatura a partir de la resistencia de la NTC. Estas fórmulas tienen dos problemas.
El primero consiste en que son complejas porque es necesario calcular logaritmos. No todos los microcontroladores disponen de esta función implementada y, además consume mucha memoria y tiempo de proceso.
Otro problema consiste en que no tenemos directamente el valor de resistencia de la NTC. Este habría que calcularle a partir de la tensión de salida del divisor resistivo, complicando los cálculos.

Para un pequeño microcontrolador, las funciones matemáticas más sencillas son la suma y la multiplicación.
Los polinomios se pueden calcular a partir sólo de sumas y multiplicaciones, por esa razón las aproximaciones polinómicas son muy utilizadas para aproximar funciones complejas.

En este problema, se ha escogido calcular un polinomio aproximador de grado 5, que puede obtenerse haciendo pasar el polinomio por 6 puntos de la gráfica.


Las temperaturas escogidas son las siguientes (dadas en grados centígrados):

    Temperaturas = [-17.0,   5.0,   43.0,   87.0,   125.0,   147.0]

Los puntos se han escogido según el criterio de Chevyshev (los puntos se escogen, dentro del rango de temperaturas, de forma proporcional al coseno de ángulos equiespaciados)


Ahora hay que averiguar la tensión de salida del divisor resistivo para esas temperaturas.
Se puede hacer de dos formas. A partir de los datos del fabricante o a partir del circuito real.
En este caso he calculado la tensión de salida del divisor de forma teórica a partir de la fórmula del fabricante:


    Temperaturas = [-17.0,    5.0,       43.0,     87.0,     125.0,   147.0]
    Vout                = [4.679,   4.293,   3.157,   1.745,   0.963,   0.687]


A partir de este conjunto de datos hay que calcular el polinomio de grado 5 que pasa por esos puntos. He utilizado para ello el algoritmo de Neville implementado en Python.
Hay muchos paquetes informáticos de matemáticas y algunas calculadoras que pueden hacer esta interpolación.

El resultado es el siguiente:

  Temperatura  = +245.698438861 -210.56120536*Vout +123.656004006*Vout^2 -43.487932545*Vout^3 +7.81600210811*Vout^4 -0.569044086852*Vout^5


Este polinomio se puede arreglar para facilitar los cálculos al microcontrolador:

   Temp = - 0.569044086852
   Temp *= Vout
   Temp += 7.81600210811
   Temp *= Vout
   Temp += -43.487932545
   Temp *= Vout
   Temp += 123.656004006
   Temp *= Vout
   Temp += -210.56120536
   Temp *= Vout
   Temp += 245.698438861


El resultado es una función que devuelve la temperatura cuando se le introduce la tensión del divisor resistivo.
El error se puede calcular restando la temperatura real de la temperatura calculada por el polinomio:

Temp   Error ºC
-20      0,347
-10      -0,385
0      -0,202
10      0,181
20      0,292
30      0,132
40      -0,002
50      0,083
60      0,281
70      0,353
80      0,195
90      -0,085
100      -0,292
110      -0,299
120      -0,120
130      0,102
140      0,165
150      -0,135





Adjunto gráficas:

Circuito eléctrico:


                       R1=3300             NTC 10k
   (+5V)----------[====]-----o-----[====]-------------(GND)
                                           |
                                           |_________________ Vout



Tensión de salida en función de la temperatura [voltios]:





Sensibilidad del circuito a la temperatura [milivoltios / grado centígrado]:





Puntos de interpolación y polinomio interpolador:


    Temperaturas = [-17.0,    5.0,       43.0,     87.0,     125.0,   147.0]
    Vout                = [4.679,   4.293,   3.157,   1.745,   0.963,   0.687]



    Temperatura  = +245.698438861 -210.56120536*Vout +123.656004006*Vout^2 -43.487932545*Vout^3 +7.81600210811*Vout^4 -0.569044086852*Vout^5




Error del polinomio interpolador [grados centígrados]:





Saludos.
« Última modificación: 02 de Septiembre de 2014, 13:03:13 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #18 en: 02 de Septiembre de 2014, 13:18:02 »
Con un polinomio de grado 5, se consigue un error máximo de linealidad de +- 0.4 ºC

Si se desea más precisión hay dos formas de conseguirlo.


Una forma es aumentar el grado del polinomio. Por ejemplo con un polinomio de grado 10, el error de temperatura se reduce a +- 0.04 ºC en el peor de los casos.


Otra forma, más sencilla, consiste en dividir la gráfica en varias zonas y calcular un polinomio para cada zona.
Con esta solución el grado de los polinomios se puede hacer menor.
Por ejemplo, si dividimos el rango total en rangos de 30 ºC, un polinomio interpolador en el rango de 10º a 40ºC de grado 2 (una parábola) puede aproximar la temperatura con un error de sólo 0.1 ºC

El polinomio en este caso es:

    Temperatura = +68.3176452207 +9.9456531719*x -5.7232176956*x^2

Que viene de interpolar los puntos:

   Temperaturas = [12.0, 25.0, 38.0]
   Tensión de salida = [4.124, 3.754, 3.329]



Con 6 polinomios semejantes, se puede cubrir todo el rango de temperaturas desde -20 a 150ºC



Saludos.
« Última modificación: 02 de Septiembre de 2014, 16:27:34 por Picuino »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #19 en: 02 de Septiembre de 2014, 15:36:48 »
Eres profesor de matematicas o algo picuino??  :shock: :shock:

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #20 en: 02 de Septiembre de 2014, 16:22:14 »
Eres profesor de matematicas o algo picuino??  :shock: :shock:

No, pero me gustan bastante las matemáticas (creo que se nota  :) )



Adjunto una libro Excel sencillo para hacer interpolaciones de segundo y de tercer grado (polinómios cuadrádos y cúbicos)



No es complicado, lo único que hay que hacer es meter tres o cuatro puntos de una curva y la hoja calcula el polinomio que pasa por esos puntos.

El problema es escoger los mejores puntos para que el polinomio tenga poco error.
Para eso, una vez que se introduce el máximo y el mínimo rango, la hoja propone los puntos óptimos (con el nombre X chevy).

La hoja viene ya con los datos necesarios para interpolar la función seno(x) en el intervalo de 0 a 90 grados.

Se puede comprobar que la aproximación es bastante buena. En el caso del polinomio de 4 puntos (cúbico) el error es menor de 0.0015
También aparece un gráfico con el error cometido. Para que funcione bien, hay que introducir los valores de la función original que se quiere interpolar.
No es necesario hacer esto último, sólo si se quiere visualizar el error.

Con ayuda de esta hoja se pueden interpolar funciones en rangos pequeños para programarlas después en un microcontrolador.

Si el error es muy grande, se puede hacer el tramo más pequeño para reducir el error.
Si el error es demasiado pequeño, se puede hacer el rango mayor para reducir el número de tramos totales.

Si la función a interpolar es sencilla o necesitamos poca precisión, con un sólo tramo es suficiente.



Como experimento interesante, se puede comprobar qué pasa si se amplía o reduce el rango de valores de la función seno. Entre 0 y 15º la precisión es buenísima. Entre 0 y 360...bastante mala.


Un saludo.
« Última modificación: 02 de Septiembre de 2014, 16:28:48 por Picuino »

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 310
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #21 en: 08 de Julio de 2016, 23:56:26 »
Vaya esta muy completo el analisis........pero esto como se traduciria en un programa para PIC......se podria escribir en ASM???
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #22 en: 09 de Julio de 2016, 07:56:05 »
En ASM se podría hacer, pero es mucho más sencillo en c.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 310
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #23 en: 09 de Julio de 2016, 14:41:47 »
ok amigo podrias orientarme como haria??
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #24 en: 09 de Julio de 2016, 21:30:51 »
¿Qué es exactamente lo que quieres hacer y en qué punto estás?.
Ten en cuenta que esta es una solución más barata que un circuito especializado (te ahorras un par de euros) pero es mucho más complicado de implementar.

Otro punto a tener en cuenta es que para calibrar con precisión la NTC necesitas tener un buen termómetro.

¿Qué precisión necesitas? ¿Y qué resolución?

Saludos.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 310
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #25 en: 09 de Julio de 2016, 22:17:09 »
Bueno estoy leyendo teorias............recabando informacion es para armar un monitor para bombas o motores, monitorear corriente tension y temperatura, pense en crear una tabla de valores que vaya desde 0 grados hasta 60, osea expresar un valor de temperatura un valor del ADC, companraria el valor de adc con con la tabla y darle una tolerancia superior e inferior asi cuando encaje con el valor del adc, ver a que valor de temperatura corrresponde.
la medicion de corriente, tension el manejo del lcd botones todo esta listo solo falta la parte de la temperatura, pensaba usar un NTC de 10 Kohm...........pero veo que hicistes un analisis bien profundo, por eso me llama la atension si se podria usar tu metodo
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #26 en: 10 de Julio de 2016, 12:42:54 »
Creo que se puede utilizar sin problema una NTC para esa aplicación. Con una precisión de un grado imagino que tendrás suficiente.

Lo primero que tienes que hacer es montar el circuito con la NTC, una resistencia de polarización (6700 Ohm) y un microcontrolador con conversor ADC.

La segunda parte es la más compleja. Hay que modificar la temperatura de la NTC, medirla con un termómetro y tomar nota del valor leído por el ADC.
Esto lo puedes sustituir por las ecuaciones del fabricante, pero no es igual de preciso.
Lo ideal sería trabajar con temperaturas cercanas al punto de trabajo. Con calcular 4 ó 5 puntos sería suficiente, por ejemplo (20º, 50º, 80º, 110º, 140º). Las temperaturas no tienen por qué ser exactas, pero si hay que medir exactamente cuánto valen con un termómetro. Cuanto más preciso sea el termómetro, más precisa será tu NTC. Las temperaturas más altas las puedes conseguir con un soldador de aire.

La tercera parte es calcular un polinomio que traduzca los valores leídos por el ADC en valores de temperatura. En esta parte te puedo ayudar.

Un saludo.

Desconectado elñato

  • PIC18
  • ****
  • Mensajes: 328
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #27 en: 10 de Julio de 2016, 18:25:45 »
El problema de los NTC es que no es lineal, y si quieres sacar la temperatura necesitas que el pic (o lo que uses) te haga el calculo metiendole la beta y otros parametros que tienes en el datasheet, es lo unico que no me gusta de los ntc, aparte tambien el hecho de tener que hacer un divisor resistivo. Si por ejemplo quieres hacer una placa donde el usuario se busca el sensor (NTC) entonces se tiene que buscar uno que vaya a juego con la resistencia que tu pongas en la placa. Sin embargo un sensor lineal de este tipo no te tienes que preocupar de mas nada.

Es cierto que la NTC es no lineal.
De hecho tiene una de las peores no linealidades que te puedes imaginar. Si tuviese una función senoidal, no habría problemas. Se podría corregir fácilmente. Pero la función de transferencia de la NTC es una exponencial, que tiene una no linealidad muy fuerte y dificil de corregir:


Por si esto no fuera poco, los términos de la exponencial tienen a la temperatura en una serie racional (dividiendo). Las series racionales son mucho menos lineales que los polinomios o que las series de Taylor.

Total, que antes de estudiarlo yo esperaba una curva con una no linealidad muy fuerte. Sin embargo me llevé una sorpresa al comprobar que la curva, en el intervalo que me interesaba, era bastante lineal:

Adjunto gráfica de la tensión de salida de la NTC (azul) y la tensión que debería salir si fuese lineal (magenta)



El error máximo en el rango de 10ºC a 40ºC es de 0.2%. Dicho de otro modo, un error máximo de 0.2ºC. Todo esto sin linealizar el resultado.

Los únicos parámetros que hay que introducir son lineales (igual que en el AD22100):
   Una constante que multiplica a la lectura (40mV/ºC para la NTC   22.5mV/º para el AD22100)
   Un offset (a 25ºC, 2.92 Voltios para la NTC)


Mirando el datasheet del NTC, también descubrí que la estabilidad con el tiempo era muy buena. Casi no tienen deriva a las 1000 horas.

Por otro lado, es verdad que un divisor resistivo está expuesto a cambios en la tensión de alimentación, pero si se alimenta al ADC con la misma tensión que el divisor resistivo de la NTC, los cambios en la tensión de alimentación se compensan y no es necesario colocar una referencia de tensión de precisión.

No está nada mal para un componente de 28 céntimos.


Saludos.

vas a hacer UNA  placa y solo una para ti ??
si no es el caso hicieste la prueba con varias NTc de un lote ??  4 o 5 unidades ??
o hiciste la prueba con varias de distintos lotes ?? 

Desconectado elñato

  • PIC18
  • ****
  • Mensajes: 328
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #28 en: 10 de Julio de 2016, 18:33:29 »
lei tu tema de matematicas, polinomios y demas............no entiendo nada... nunnca lo use en mi vida laboral.
te consulto mi manera , solo en teoria ya que no lo haria yo:

1 -- mido y me hago una tabla asi que la tension que mida el pic  va a la tabla y la transforma en valores.
2 -- aunque la curva sea absolutamente no lineal cada "pedacito " o sea cada tramo de 2 valores que hice en mi tabla sera una seccion de la curva no lineal y ese tramo en general sera bastante lineal, ( solo ese tramo) .
3 -- el valor que lea el pic  si coincide bastante exacto  con el de tabla  >>> sale con fritas
si no coincide y esta entre 2 valores de mi tabla veo de hacerle un promedio, hace añooos que no me meto con micros, pero calculo hay maneras simples de hacerlo.

no es viable ?? y mas facil ?? o digamos mas amigable 


Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5610
    • Picuino
Re:Polarizar una resistencia NTC para medir temperatura.
« Respuesta #29 en: 10 de Julio de 2016, 19:58:18 »
lei tu tema de matematicas, polinomios y demas............no entiendo nada... nunnca lo use en mi vida laboral.
Probablemente los has usado sin saberlo. Te explico un poco el tema de las tablas y los polinomios.

Si utilizas una tabla y quieres tener buena precisión usando "promedios" necesitarás muchos puntos.
Las tablas son rápidas, pero ocupan mucha memoria. Cuanta más precisión quieras, más memoria utilizan.

Los promedios de los que hablas son en realidad polinomios de grado uno (una recta) y son poco precisos. Se calculan con sólo dos puntos y para ser precisos esos dos puntos tienen que estar cercanos entre sí.

Hay otro tipo de "promedio" que utiliza tres puntos. Eso ya no es una recta, es una ecuación cuadrada, un polinomio de grado dos. Con él puedes conseguir la misma precisión con menos puntos o con puntos más alejados entre sí. Con eso te ahorras memoria porque no son necesarios tantos puntos.

Si sigues así, puedes llegar a usar polinomios de 7 ó 9 puntos con muchísima precisión y una tabla muy pequeña. Eso es lo que utilizan las calculadoras para calcular los senos, cosenos, logaritmos, etc. Si no ¿Cómo podrían las calculadoras hallar 12 decimales de precisión en esas funciones? Sólo con tablas necesitarian una memoria tremenda.

El problema es calcular los polinomios a partir de tres o más puntos. Con dos puntos es más o menos sencillo, es un "promedio" como bien dices, pero con más puntos la cosa se complica. Para eso se puede utilizar una hoja excel como la que adjunto.

Un saludo.