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

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

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Polarizar una resistencia NTC para medir temperatura.
« en: 31 de Agosto de 2014, 18:59:08 »
He estado estudiando la forma de medir temperaturas con una resistencia NTC
Quiero obtener la máxima precisión y linealidad en el rango de 10 a 40 grados centígrados con un circuito muy sencillo.

El circuito que se utilizará para polarizar la resistencia NTC es el siguiente:


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



La salida Vout irá conectada a la entrada de un conversor Analógico-Digital de un microcontrolador.


Valor nominal de la resistencia NTC
He escogido para la NTC un valor nominal a 25ºC de 10k ohm porque es un buen valor de compromiso:
   Si la resistencia es más baja, la corriente aumenta y la resistencia NTC se calienta con la corriente de polarización, con lo cual pierde precisión.
   Si la resistencia es más alta, la impedancia de Vout aumenta mucho y el error de lectura del ADC aumenta, perdiendo también precisión.



Valor de la resistencia NTC con la temperatura

He utilizado para los cálculos la fórmula de la resistencia NTC, con los parámetros del fabricante:


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


    Las constantes, según el fabricante, son:

    R_ntc_25  = 10000 ohms                  Resistencia a 25 grados
    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



Valor nominal de R1
Ahora el problema es conseguir un valor de R1 que optimice la linealidad y resolución en un rango de 10ºC a 40ºC

He introducido todos los datos en una hoja de cálculo con un gráfico y he probado varias resistencias de polarización (R1) hasta llegar al valor estandar de 6800 ohmios.
El resultado es la gráfica que adjunto.



El eje X es la temperatura.
En la gráfica se puede ver en color azul el valor de tensión de salida (Vout). Esta va bajando a medida que la temperatura aumenta.
En color magenta se puede ver los puntos del conversor ADC que cambian con cada grado de temperatura (para una resolución de 10bits) .
Se puede ver cómo en el rango 15-35ºC la resolución se maximiza y se consiguen 8 puntos por grado ºC. Dicho de otra manera, se consigue una resolución de 1/8 = 0.125ºC
Con un conversor ADC de 12bits, se podría llegar a una resolución de 0.031ºC, que es un valor bastante bueno.

Otra ventaja de este valor de R1 consiste en que la gráfica es lo más lineal posible en este rango de temperaturas (10º - 40º).



Circuito final
Para conseguir estas curvas, el valor de R1 es de 6800 ohmios, y el circuito final es:


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



   He escogido a propósito un valor estandar para R1, para que sea más sencillo de encontrar y más barato.
   El valor realmente óptimo para R1 es 7157 que no se puede encontrar en tiendas y, además, depende de la variación de los parámetros de la resistencia NTC
   Es recomendable utilizar una resistencia del 1% con una deriva térmica de +-100ppm para minimizar las desviaciones.



Mejorar la precisión
Una vez conseguida la resolución y la máxima linealidad, para conseguir exactitud es necesario comparar la salida de tensión con un termómetro calibrado y:
   1.- Corregir la linealidad. Se puede conseguir con bastante precisión con una corrección cuadrática (polinomio de segundo grado)
   2.- Ajustar el offset. La desviación con el tiempo del circuito es bastante baja. Una vez corregido el Offset, la precisión se mantendrá bastante tiempo.

En mi caso sólo necesito resolución y no me hace falta precisión, de manera que el montaje tal y como está es suficiente.
El circuito me servirá para compensar la frecuencia de un oscilador a cuarzo, de manera que utilizaré una tabla (LUT) para corregir la frecuencia cierta cantidad en función de la temperatura medida.
Sólo tengo que cambiar la temperatura y medir la tensión Vout y la frecuencia real. En la tabla introduciré para cada Vout la compensación de frecuencia.


Saludos.
« Última modificación: 31 de Agosto de 2014, 19:38:39 por Picuino »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #1 en: 31 de Agosto de 2014, 20:43:36 »
Para esa temperatura no te sale mejor usar un IC dedicado a este fin del tipo 5V-S-GND ??

Hace poco encontre uno muy interesante AD22100 echale un vistazo.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #2 en: 31 de Agosto de 2014, 20:46:01 »
Excelente explicación  ((:-)) ((:-))

Por curiosidad, como compensarás la frecuencia, con un varicap?

Espero que puedas publicar el circuito final.

Un saludo!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #3 en: 01 de Septiembre de 2014, 04:05:10 »
En realidad quiero compensar la frecuencia a un OCXO que tiene una entrada de tensión para el control de frecuencia (ya lleva un cto interno que la cambia).

Si tuviera que hacerlo en un cristal normal, se puede compensar sin necesidad de cambiar la frecuencia del cristal, numéricamente.
Por ejemplo, los relojes utilizan cristales de 32768Hz, pero esta frecuencia no es exacta.
Si un reloj resulta tener un cuarzo con frecuencia media de 32770.8Hz, el circuito interno puede mover la aguja de los segundos cada 32771 pulsos (durante 4 segundos) y por último mueve la aguja contando 32770 pulsos.
La media será de un segundo cada 32770.8 Hz (error de 3ppm, 8 segundos al mes) No hace falta que el cristal sea muy exacto, sólo es necesario que sea estable y contar bien.

Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #4 en: 01 de Septiembre de 2014, 04:36:38 »
Para esa temperatura no te sale mejor usar un IC dedicado a este fin del tipo 5V-S-GND ??

Hace poco encontre uno muy interesante AD22100 echale un vistazo.

Había considerado otros chips de Analog Devices que te dan directamente la temperatura por SPI, pero este no lo conocía.
Conozco los LM35 (y tengo algunos samples por ahí guardados)

Estos chips tienen la ventaja de darte la temperatura de forma lineal.
Por otro lado tienen varias desventajas:

El problema de estos chips es que dan un rango muy grande de temperaturas, de forma que la salida de tensión varía poco con la temperatura.
    En el caso del LM35 sólo varía 10mV cada grado.
    El AD22100 veo que es mucho mejor, 22.5mV cada grado.
    La resistencia NTC da la mejor sensibilidad, varía 40 mV cada grado en el rango 15-35ºC. Es el doble de sensible en este rango que el anterior.

Otro problema es el precio:
   El AD22100KTZ  cuesta 3 Euros en Mouser
   El LM35 cuesta 1.26 Euros en Mouser
   Una resistencia NTC de 10k cuesta 0.09 Euros en formato smd y 0.28 Euros en formato through-hole radial (ambos en Mouser)


Desde luego con los samples de TI o de Analog Devices, el precio es de cero, pero quería estudiar la opción para comprar más barata.


En realidad, sí quería comparar el circuito final con un buen termómetro.
Utilizaré para eso el circuito ADT7410: resolución de 0.008 ºC, máximo error de 0.050ºC a 25ºC, 2.82 Euros en Mouser (gratis como sample)
No me gustan este tipo de circuitos porque, al ser SMD, creo que miden la temperatura de la PCB más que la temperatura del aire, y en mi caso la PCB estará calentada por un regulador de tensión.
Voy a utilizar para el circuito de prueba una PCB que tengo de 0.5mm de grosor, para montar el circuito casi en el aire (en una tira muy estrecha)


Saludos.
« Última modificación: 01 de Septiembre de 2014, 04:41:48 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #5 en: 01 de Septiembre de 2014, 04:59:05 »
Estoy comprobando el Datasheet del ADT7410 y tiene una precisión (Accuracy) de +-0.1 grado centigrado a 4Vcc.
A 5 Vcc sube la medida 0.1ºC y a 3 Vcc baja la medida 0.1ºC

El ADT7310 es igual al anterior, pero con interface SPI (más líneas). Parece ser que este modelo tiene mejor precisión (+-0.05ºC en el rango 0-80 ºC).
Adjunto imagen del Datasheet.


Saludos.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #6 en: 01 de Septiembre de 2014, 07:41:23 »
Yo es que lo que necesito son sensores externos y entonces por spi no me valen es por eso que despues de buscar mucho encontre este, aparte de un gran rango (hasta 150ºC), no se porque no hacen mas sensores asi de este tipo, el lm35 sin amplificador no sirve de mucho para sensar externamente.
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.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #7 en: 01 de Septiembre de 2014, 09:03:33 »
Lo malo del LM35 es, además, que para valores de temperatura por debajo de 0ºC ... ¡ Su salida es negativa!
Es realmente horrible para trabajar con un microcontrolador.

Por supuesto, tiene sus ventajas. Puedes conectarlo directamente a un polímetro y te dará una lectura directa en grados sin necesidad de ningún componente más.
Como la sensibilidad es de 10mV/ºC, con el polímetro digital en el rango de 2 voltios, se leerán directamente décimas de grado. Una maravilla, pero no para un microcontrolador.


Puedes probar a utilizar un termómetro digital con interface CAN. No me refiero a que utilices el protocolo CAN, es demasiado, me refiero a utilizar el I2C o el SPI, pero traduciendo las tensiones con transceptores CAN en el sensor y en la placa receptora.
No creo que sea mucho peor que el envío de tensión analógica. Si AD22100 tuviese salida de corriente sería más inmune, pero la tensión no es inmune a interferencias.
El tamaño total quizás sea máyor, pero el precio no lo creo.

Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #8 en: 01 de Septiembre de 2014, 09:24:53 »
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.
« Última modificación: 01 de Septiembre de 2014, 15:42:12 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #9 en: 01 de Septiembre de 2014, 09:35:10 »
Adjunto gráfica con el error de temperatura del divisor resistivo con NTC, comparado con una función lineal centrada en 25º y con rampa de 40mV/ºC




Se puede comprobar que en el rango de 15ºC a 35ºC, el error de linealidad es menor de 0.04ºC


Saludos.

P.D. Estas gráficas las he realizado suponiendo una resistencia de polarización más ajustada: 7130 Ohm = 6800 + 330 ohmios
« Última modificación: 01 de Septiembre de 2014, 09:40:37 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #10 en: 01 de Septiembre de 2014, 15:49:13 »
Varias páginas interesante sobre NTC de precisión, no sabía que podían tener tanta precisión:
http://www.ussensor.com/products/thermistors/leaded-thermistors/interchangeable-thermistors/ultra-precision-interchangeable-thermistor
http://www.analogtechnologies.com/thermistor.htm?gclid=CLCN49rWwMACFU7MtAodPyYAqA

Saludos.

P.D. Por lo que he leído, el precio es mayor que el de un sensor de temperatura de precisión de Analog Devices.
« Última modificación: 01 de Septiembre de 2014, 15:54:41 por Picuino »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #11 en: 01 de Septiembre de 2014, 16:07:33 »
A ver si te enteras la forma de linearizar una ntc, he leido por algunos sitios que es posible pero no he encontrado como. Tambien en otros fabricantes he visto que venden IC's para adaptar las señales de las NTC, pero no era lo que yo buscaba.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #12 en: 01 de Septiembre de 2014, 16:09:36 »
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.

Si, lo peor de los NTC es que tienes que calibrar cada uno a mano.
En los CIs, se supone que el fabricante ya lo ha hecho por tí antes de venderlo y es un ahorro de dinero.

También es verdad que existen NTC que no necesitan calibración (son muy exactos y todos los que te venden son iguales), pero son más caros todavía que los circuitos integrados sensores de temperatura.


Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #13 en: 01 de Septiembre de 2014, 16:14:52 »
A ver si te enteras la forma de linearizar una ntc, he leido por algunos sitios que es posible pero no he encontrado como. Tambien en otros fabricantes he visto que venden IC's para adaptar las señales de las NTC, pero no era lo que yo buscaba.

Hay varias formas.

En este documento aparecen dos fórmulas, una muy exacta y otra menos exacta:

http://cp.literature.agilent.com/litweb/pdf/5965-7822E.pdf


Lo malo de las dos formulas es que necesitas calcular logaritmos. En ciertos microcontroladores esto es muy difícil.
Además con esas fórmulas se calcula la temperatura a partir de la resistencia. En el circuito que planteo no se conoce la resistencia, sino el la tensión de un divisor de tensión (la fórmula no sirve directamente)


Otra forma es mediante polinomios de Chebyshev. No soy muy optimista porque creo que la respuesta de la NTC es muy no lineal.
De todas formas voy a intentar calcularlos a ver que precisión dan y respondo. Igual me llevo otra sorpresa y descubro que es más lineal de lo que esperaba.


Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Polarizar una resistencia NTC para medir temperatura.
« Respuesta #14 en: 01 de Septiembre de 2014, 20:34:30 »
Bueno, ya tengo los resultados y son bastante buenos.

He interpolado los valores de tensión de salida con 5 puntos:
   Temperatura = [-17.798, -1.450, 25.000, 51.450, 67.798]
   Vout = [4.388, 3.925, 2.923, 1.921, 1.428]


Polinomios de Chevyshev
Los valores de temperatura están escogidos según los puntos de chebyshev.
Estos puntos se calculan primero como el coseno de 5 ángulos equiespaciados en el rango 0-180:
18, 54, 90, 126, 162

El coseno de dichos ángulos es:
0,951    0,588    0,000   -0,588    -0,951

se colocan al revés para mayor claridad:
-0,951    -0,588    0,000   0,588    0,951


Ahora se divide el rango de temperaturas de -20 a 70ºC de forma proporcional a los valores coseno:

   Temperatura = [-17.798, -1.450, 25.000, 51.450, 67.798]

Y se calcula por interpolación la salida de tensión que debería tener cada temperatura:

   Vout = [4.388, 3.925, 2.923, 1.921, 1.428]


Después se construye un polinomio que pase por todos esos puntos:

    vout(x) = +3.87584680716 -0.0342556010336*x -0.000240808482527*x^2 +3.63995277358e-06*x^3 -7.23389909366e-09*x^4



Calculo del error cometido por el polinomio
Por último he calculado el error cometido por el polinomio en comparación con la fórmula más exacta dada por el fabricante.
El resultado es de un error máximo de:

     0.10ºC dentro del rango   -7º a 70ºC
     0.15ºC dentro del rango -20º a 70ºC

Adjunto gráfica.



Saludos.