Tratando de obtener lecturas (más) precisas del termistor (electrónica, matemática y código interno)

Así que estoy tratando de obtener lecturas de temperatura precisas de este termistor TDK B57164K472J...

Está conectado en serie con una resistencia de 1 K y conectado a un ADC integrado de ESP8266.

El termistor tiene una Beta de 3950 y la hoja de datos incluye una tabla para resistencias entre -55 y 150 C.

En mi intento de aumentar la precisión, yo mismo calculo la Beta para el intervalo en el que se encuentra la resistencia del termistor usando la siguiente ecuación:

B = 1 / ( 1 / T1 - 1 / T2 ) log ( R1 / RR2 )

Luego trato de determinar la temperatura usando esta ecuación:

T = T1 * B / log ( R1 / R2 ) / ( B / log ( R1 / R2 ) - T1 )

El código completo se puede ver aquí: https://pastebin.com/ECQHruKN

Factores que posiblemente estén afectando la precisión: la referencia de voltaje de intervalo del ESP indica 3,56 V, se supone que es 3,3 V y mi multímetro indica 3,26.

No estoy seguro de la señalización, es decir si mis términos deben ser positivos o negativos, o cuando deben ser los otros.

No estoy seguro acerca de mi circuito... es fácil de aprender para mí, pero he visto circuitos de termistores más complejos, no solo estaba seguro de cómo implementarlos, y aún menos seguro de que iba a poder para solucionarlos.

La ayuda sería muy apreciada. Gracias.

Esquemático

esquemático

simular este circuito : esquema creado con CircuitLab

¿Cuál es su rango de temperatura previsto? ¿Cómo estás leyendo el voltaje de referencia del ADC?
Proporcione un diagrama esquemático que muestre cómo ha diseñado su circuito. Muestre el voltaje de la fuente de alimentación para el circuito de resistencia + termistor. ¿Cómo se conectan la resistencia y el termistor? --es decir, VCC->resistencia->termistor->GND, o VCC->termistor->resistor->GND, u otro? ¿Supongo que el punto medio del par termistor + resistencia conectado en serie está conectado directamente a la entrada ADC?
@MadHatter: rangos normales al aire libre, +/- 40 C para aquí en Canadá...
@JimFischer: agregué un esquema ... El VCC en el riel (3,26 V) es diferente del VCC asumido (3,3 V), que es diferente de la referencia de voltaje medida por el propio ADC (3,56 V) (hay una función donde el ADC puede devolver el voltaje interno en lugar de un valor externo).
Un par de resistencias no necesita (y su ADC no tiene) una referencia de voltaje absoluto. Probablemente el valor de diez bits del convertidor es una lectura de relación, 1023 significa 'igual a Vcc' y 0 significa 'igual a tierra'.
@Whit3rd: Eso es lo que obtuve ... Pensé que las lecturas de ADC siempre eran proporciones, de 0 a tierra, y su valor máximo era el voltaje de referencia o el voltaje de riel (instantáneo) ... ¿No todos los ADC leen desde 0 fo <bits máximos>? ¿Y qué quiere decir cuando dice que el par de resistencias no necesita una referencia de voltaje absoluto ...? Si hubiera una referencia de voltaje absoluto, ¿no ayudaría eso a obtener valores confiables del ADC?
Si la referencia del ADC es el riel de suministro, o proporcional a él, entonces la salida de un divisor de voltaje entre el riel de suministro y tierra también será proporcional al riel de suministro, por lo que cualquier cambio en el voltaje del riel de suministro no afectará el lectura del ADC (asumiendo que la relación del divisor de voltaje permanece constante). Sin embargo, la respuesta de Spehro implica que no es así como funciona el ADC del ESP8266, y en su lugar tiene un voltaje de referencia interno pero no muy preciso.
@nekomatic: Traté de hacer lo que me recomendó, y esencialmente invertí la polaridad para que el voltaje a través del termistor sea <1 V, y estoy jugando con los números y un multímetro, y mientras la referencia interna del ADC lee 3.56 V ( puede iniciar el ADC para generar ese voltaje en lugar de un valor externo, implica un reinicio), pero las matemáticas tratando de obtener la resistencia del termistor, estoy más cerca con un valor de multímetro de 3.26 V que con el de 3.56 V. Todavía estoy tratando de obtener números razonables y experimentando al mismo tiempo...

Respuestas (7)

El ADC ESP8266 no es realmente muy bueno para fines de instrumentación. Creo que no es muy lineal (especialmente para voltajes cercanos a 0 V) ​​y el voltaje de referencia interno puede ser de +/- 10 % o una tolerancia peor, poco especificado (sin límites de precisión que yo pueda ver, una especie de funcionalidad "bonificada" que usted no debería depender demasiado para aplicaciones serias).

También tiene un NTC bastante malo y está pasando mucha corriente a través de él a altas temperaturas debido a la pequeña resistencia de 1K (lo que significa autocalentamiento).

El método preferido para la medición del termistor es radiométrico, por lo que el voltaje de referencia se cancela, sin embargo, el chip Espressif no muestra el voltaje de referencia, también muchas placas (supongo que la suya es una) incluyen un divisor en la entrada que cargará su entrada al menos algo, tal vez 220K/100K para un valor nominal de ~3.52V para 1024 conteos +/- lo que sea. 10 bits no son demasiados para un rango tan amplio de resistencia.

Hay otras formas de medir la resistencia de un termistor, pero generalmente requieren más circuitos, por ejemplo, para convertir la resistencia en frecuencia y cambiar entre una resistencia o resistencias de referencia y el termistor.

Dada la gran memoria en el ESP8266, puede olvidarse de todas las matemáticas sofisticadas y simplemente construir una tabla de búsqueda simple con 1024 entradas, pero probablemente tendría que construir una plataforma de calibración para hacer eso (al menos un voltaje programable) para cancelar el errores y el chip realmente no está especificado para ninguna precisión o estabilidad en particular, por lo que la mayoría de nosotros usaría un ADC externo u otro circuito para que la precisión y la estabilidad se horneen desde el principio.

Tengo este módulo ADS1115/1015 (ADC I2C, 12 o 16 bits, no estoy seguro)... Supongo que lo intentaré... Principalmente quería familiarizarme con el lado electrónico de las cosas, pero luego quería ganar sobre la precisión... También obtuve estos termistores de Arrow pensando que eran buenos... ¿Qué no tienen de bueno? Acabo de ver que tenía una hoja de datos más completa que la mayoría, y opté por esos... Estoy un poco decepcionado al saber que al menos no están "bien"... 🙁
Si realiza una búsqueda paramétrica en, por ejemplo, Digikey, encontrará que obtiene termistores del 1 % (tolerancia beta y de resistencia) por 60 o 70 centavos y termistores de +/-0,1 °C por unos pocos dólares. El ADS1115 es una buena parte, pero la referencia interna no está disponible fuera del chip, por lo que no es ideal. Los termistores son más adecuados para un rango estrecho de temperaturas; de lo contrario, necesitará mucho rango dinámico en la medición. Puede tener un rango de temperatura de -40 a 125 °C y la relación de resistencia es de 1000:1, por lo que es difícil obtener mucha resolución en los extremos.
No es que sean malos, es solo que para las mediciones de temperatura absoluta quieres lo mejor que puedas obtener. En mi experiencia, los NTC se usan mejor para cosas relativas como el control PID, etc.
@SpehroPefhany: Ah, te refieres a eso... Cuando los obtuve, estaba mirando principalmente la hoja de datos, para ver si estaba completa... Cuando encontré termistores THT que no eran demasiado caros y que tenían una hoja de datos con un valor beta, obtuve los primeros... Ni siquiera pensé en la varianza y la precisión, no pensé que la resistencia en sí variaría en intervalos, así que me olvidé de la fabricación y los materiales... Supongo que estoy Sin embargo, sigo aprendiendo de la experiencia, así que supongo que todavía puede verse como algo positivo... 😊

A menos que tenga una referencia de temperatura superior a 1C, no me molestaría en tratar de obtener una precisión absoluta más alta que la que obtiene utilizando la información de la hoja de datos nominal. Si necesita una referencia de temperatura de alta precisión real, utilice un par térmico o un sensor de temperatura de platino (RTD).

Si quieres probar esto de todos modos:

  1. El voltaje de referencia, si su información es correcta, causará mucho más error que el error Beta del 3% y el error de resistencia del 5%.
  2. La primera línea de calibración sería verificar la resistencia a los 25 °C especificados, ya que el fabricante especifica 5 %.
  3. Luego trabaje en la deriva Beta del 3%... Suponiendo que necesita precisión en un amplio rango más allá de la temperatura ambiente.

También considere comprar un NTC con mejores especificaciones para ahorrarse algo de tiempo. Puede encontrar 2% Beta, 2% de Resistencia o mejor por no mucho más que el suyo.

Sí, me decepciona saber que la gente piensa que mis termistores no son muy buenos... : \ Los obtuve de Arrow durante su semana de envío gratuito y pensé que serían perfectos para aprender y útiles para futuras aplicaciones , pero eres el segundo en decir que son un poco horribles, y ahora estoy un poco decepcionado, pero eso es principalmente un problema emocional 😋
Si desea una alta precisión real, utilice un RTD de platino de alta calidad. Leer un termopar con precisión implica medir una diferencia de voltaje muy pequeña y, en cualquier caso, la precisión solo será tan buena como su referencia de unión fría, por lo que ahora tiene dos sensores de los que preocuparse.
@nekomatic: Bueno, el ejercicio aún parecía sólido, además pensé que podría usarlos para verificar la temperatura dentro de los gabinetes o cerca de los componentes, para advertirme sobre un posible mal funcionamiento o para garantizar un rendimiento constante si, digamos, tengo una caja con sensores en algún lugar con una celda solar, baterías y sensores... Asegurarse de que no se caliente demasiado podría ser importante... ¿Los termistores son adecuados para ese tipo de propósito? ¿Cuál es un buen uso para los termistores?
Los termistores son baratos y son una opción perfectamente buena cuando necesita una precisión de baja a moderada: las aplicaciones sugeridas suenan ideales. ¡Claramente estás aprendiendo desde el principio a trabajar con ellos! Parece que la parte mala de su configuración no son sus termistores sino el ADC del ESP8266.

¿Qué tan precisas quieres que sean tus lecturas? 0.1 de un grado? 0.01 de un grado?

Tienes un par de problemas. En primer lugar, su ADC no es muy preciso para empezar. También debería buscar reducir cualquier ruido al que esté sujeto actualmente su ADC. Las MCU producen ruido, si no ha hecho nada al respecto, es probable que su ADC esté sujeto a suficiente ruido como para brindarle resultados inconsistentes.

Luego está el termistor, para empezar, no son realmente dispositivos súper precisos. Para empezar, sufren de autocalentamiento y luego está la estabilidad de su entrada.

También necesita datos de calibración precisos en su termistor, ya que en algunos casos puede haber una diferencia del 5% con respecto a los valores de la hoja de datos. Pero obtener una lectura a 25 grados no es fácil, ¿cómo mantienes el sensor a 25 grados mientras lo mides? Obtener una lectura a 100 grados es mucho más fácil, el agua hirviendo tiene que estar a 100 grados (al nivel del mar, las partes más calientes se convierten en vapor). Entonces puedes meterlo en un poco de agua hirviendo.

Una vez que haya resuelto todos los problemas de su circuito, puede comenzar a pensar en su programación. Los termistores tienen una relación logarítmica con la temperatura a la resistencia. Generalmente tienen mejor precisión en algún rango de temperatura. El enfoque habitual es seleccionar el rango de temperatura específico que le interesa (un rango más pequeño significa una mayor precisión) y luego usar sus funciones de registro en ese rango. Ya sea generando una tabla de búsqueda o si tiene un chip lo suficientemente rápido que no está terriblemente ocupado, puede hacer los cálculos reales sobre la marcha.

Pero luego esto vuelve a la precisión de su ADC. Si solo puede producir 1024 valores discretos, entonces solo puede medir 1024 temperaturas discretas.

Ahora, si solo le importa que la temperatura esté definitivamente entre, digamos, 35,0 y 35,5 y solo le interesan las temperaturas entre -20 y 50. Entonces esto sería totalmente factible con lo que tiene. Pero si quisieras un rango más grande o una precisión más alta, realmente no será posible con lo que estás usando.

Para obtener más precisión, debería usar un rango más pequeño y, a la inversa, para un rango más grande, debe reducir la precisión. Luego, en algún momento, su ADC no podrá distinguir la diferencia entre dos valores o el ruido hará que sea imposible obtener una lectura estable.

Recomiendo usar esta hoja de cálculo . Puede jugar con los valores y ver cuáles serán los márgenes de error junto con los valores de resistencia recomendados para medir en un rango de temperatura determinado.

Bueno, otros recomendaron usar otro ADC, que tengo un módulo ADS1115/1015 que puedo probar, solo pude soldarle pines, pero su comentario permitió el hecho de que podría limitar el rango efectivo de mi termistor con resistencias, de modo que el intervalo 0 - Vref coincide con mi rango de temperatura deseado para mi termistor, aumentando así la resolución efectiva, los 1024 valores cubren un rango más pequeño de voltajes reales... No estoy seguro si esto es correcto o tiene sentido, pero creo es sonido, si no implícito... Como tal, gracias 😊
boiling water has to be at 100 degreesSolo al nivel del mar. He medido en mi casa a 97C
¿Vives en una montaña?
lo siento... quise decir 97 no 91...
@poorandunlucky Su termistor está emparejado con otra resistencia para crear un divisor de voltaje. Al seleccionar el valor apropiado para esa resistencia en función del rango de temperatura que le interesa, puede mejorar la precisión. Y, por supuesto, cuanto más pequeño sea el rango que le interesa, más podrá mejorarlo. Le recomiendo que juegue con esta hoja de cálculo. Puede ingresar el rango templado y le dará una resistencia recomendada, así como los márgenes de error esperados.
Sin embargo, tiene un buen punto, uno debe verificar a qué temperatura está hirviendo su agua. Todavía hace una buena referencia de temperatura estable que es fácil de generar.
Medir la temperatura con una precisión de 0,01 grados (en lugar de solo con una resolución de 0,01 grados) es realmente muy difícil. Afortunadamente, probablemente no necesites hacerlo a menos que estés haciendo algún tipo de experimento científico.
@hekete: Gracias por la página, parece una referencia muy completa. Muchas gracias. 😊
@nekomatic: Vivo al nivel del mar, o aproximadamente a 20 m del nivel del mar... No debería estar muy lejos de los 100 C para usar eso como una temperatura de calibración estable. Sé que la temperatura no es extremadamente útil después de la décima, y ​​ese es realmente mi objetivo en este momento... Sin embargo, todavía me encantaría poder medir las centésimas, podría ser un proyecto futuro divertido, pero por ahora Voy por décimas. 😊

Además de los otros comentarios/respuestas que ha recibido hasta la fecha, la figura que agregó a su publicación original muestra una falla de diseño que debe corregirse. Según mis cálculos, si el voltaje nominal de VCC es de 3,3 V, entonces para valores de temperatura del termistor de

T = [-40 0 25 40]  (°C)

los voltajes de salida nominales correspondientes V_OUT de su circuito son

V_OUT = [ 3.2667    3.0633    2.7211    2.4198 ]  (VDC)

(Nota: V_OUT es el voltaje que está conectado al pin de entrada ADC). De acuerdo con la hoja de datos de Espressif para el ESP8266EX (p. 16):

El rango de voltaje de entrada [ADC] es de 0 a 1,0 V cuando TOUT está conectado a un circuito externo.

Por lo tanto, estos voltajes V_OUT son demasiado altos y posiblemente podrían dañar la entrada del ADC.

FWIW, si intercambia las posiciones de la resistencia y el termistor para que la topología del circuito se vuelva

VCC -- thermistor --(V_OUT)-- resistor -- GND

los voltajes V_OUT nominales resultantes aplicados al ADC para las temperaturas del termistor antes mencionadas son

V_OUT = [ 0.0333    0.2367    0.5789    0.8802 ]  (VDC)

que estaría bien. Esta topología también garantiza que V_OUT aumente con el aumento de la temperatura del termistor, Y la resolución en el peor de los casos (sin tener en cuenta otras fuentes de error, por ejemplo, las tolerancias de los componentes) sería de aproximadamente 0,5 °C/bit en el extremo de -40 °C, lo que no es demasiado terrible.

En las preguntas frecuentes de Espressif para el ESP8266 (desplácese hacia abajo hasta la sección " Periféricos "), el artículo titulado "¿ Para qué debo usar el ADC interno? " dice (énfasis agregado).

El ADC interno se puede usar para detectar temperatura o detectar la corriente aproximada consumida por dispositivos externos. Tenga en cuenta que debido a que las lecturas de ADC son propensas al ruido, solo debe usarse para aplicaciones donde no se requiere una alta precisión. Por ejemplo, mecanismos de corte térmico, etc.

Los otros encuestados de su publicación abordan consideraciones adicionales relacionadas con este ^^^ tema con respecto a las formas de reducir los errores en sus mediciones, por ejemplo, ajustar las tolerancias de los componentes, usar un método de medición radiométrico (que probablemente requeriría un chip ADC externo con al menos dos entradas para medir VCC y V_OUT), etc.

El tema de preguntas frecuentes titulado "¿ Qué tan preciso es el ADC interno? " dice (énfasis agregado):

Si se requiere una alta precisión, utilice la API system_adc_fast_read. Pero el circuito de RF debe apagarse antes de medir y el Wi-Fi se desconectará. Para una precisión relativamente más baja cuando se puede tolerar una diferencia de lecturas de 1 o 2, recomendamos a los usuarios que configuren Wi-Fi en el modo sin suspensión wifi_set_sleep_type(NONE_SLEEP_T).

Para menor precisión, el usuario puede ingresar al modo de suspensión. El consumo de energía es menor en este caso.

Cuando el transmisor de Wi-Fi emite energía de radiofrecuencia, la potencia que extrae de la fuente de alimentación el transmisor de radiofrecuencia y la radiación electromagnética emitida por el transmisor de radiofrecuencia+antena agrega ruido eléctrico (posiblemente sustancial) a a) los buses de alimentación de la placa ( ej., caída de voltaje VCC), y b) su resistencia cercana + termistor + circuito de cables de conexión. Tenga en cuenta que los cables de los componentes y los cables de conexión actuarán como antenas y recibirán parte de la energía de radiofrecuencia emitida por el transmisor Wi-Fi. IOW, las caídas de voltaje del bus de alimentación y la absorción no deseada de energía de RF en el bus de alimentación y en sus componentes son otras fuentes de ruido importantes que deben gestionarse si desea que sus mediciones de temperatura muestren reproducibilidad, precisión y exactitud.

Si tiene una resistencia de entrada analógica adicional, divida el voltaje de suministro y mídalo con la entrada analógica. Esto le permitirá compensar el error de voltaje y la deriva.

@JimFischer: Es extremadamente considerado de su parte abordar mi situación de una manera tan integral. ¡Estoy muy agradecido por su esfuerzo! De hecho, parece que el ADC del ESP8266, además de tener un límite de entrada recomendado de 1 V, no es el más preciso del mundo... Algunos otros colaboradores de este hilo, tres (creo), han mencionado una gran variación de potencia y sensibilidad al ruido, pero pensé que el ruido eléctrico, no el ruido de RF... Su aporte y respuesta son muy valiosos, ¡gracias nuevamente! 😊
No estoy seguro de entender lo que quieres decir ..?

Ya tiene varias respuestas que cubren diferentes aspectos del problema. En esta respuesta, intentaré cubrir solo una parte muy específica de la pregunta: cómo obtener un modelo matemático preciso a partir de los datos de calibración. En otras palabras, cómo ajustar un modelo a los datos.

Espera que la relación resistencia-temperatura sea de la forma:

1/ T = un 0 + un 1 log( R )

donde T es la temperatura absoluta y R es la resistencia en ohmios. Lo primero que haría sería graficar 1/ T como una función de log( R ) para ver si la relación es realmente lineal. Lo hice usando la matriz de datos de su código Lua. Pude ver que es casi lineal, pero hay una ligera curvatura visible.

Para tener en cuenta esta curvatura, ajusté un polinomio de segundo grado y obtuve un ajuste casi perfecto con:

1/ T = a 0 + a 1 log( R ) + a 2 log( R ) 2
a 0 = 1.35715e-3 ± 2.464e-6 (0.1816%)
a 1 = 2.11435e-4 ± 5.886e-7 ( 0,2784%)
a 2 = 2,93419e-6 ± 3,324e-8 (1,133%)

Digo que el ajuste es "casi perfecto" porque no hay una tendencia obvia en los residuos, que parecen ruido de redondeo. Entonces podría usar la fórmula anterior en lugar de la tabla si le resulta más conveniente. Alternativamente, puede volver a hacer el ajuste en un rango de temperatura más pequeño que refleje mejor el uso previsto del termistor.

Le agradezco su elegante adición, sin embargo, me temo que mi problema tiene sus raíces en gran medida en la capa física... No creo que pueda apreciar su contribución en este momento, con todos esos cables, instrumentos y partes sueltas frente a mí, pero una vez que haya comprendido lo que hay que comprender y logré alcanzar números razonables, o al menos una indicación lo suficientemente buena de que mi propia comprensión de las fuerzas que actúan en este sistema no será un problema en sí mismo en el futuro, me aseguraré de revisar sus ecuaciones. 😊

Bueno, me gustaría agradecer a todos aquellos que intentaron ayudarme con mi problema. Incluso si su aporte no identificó el problema exacto, me permitió tomar la responsabilidad de mirar el protoboard y también recuperar la confianza en mí mismo hacia las matemáticas. Mención especial para el amable hombre que buscó las especificaciones del ADC del ESP8266, donde solo debe estar sujeto a < 1 VDC.

En cuanto a mi termistor de la serie TDK 472, aparentemente es bueno... Algunas personas pensaron que no era una buena parte, pero responde sorprendentemente... Mi única queja es que las patas se oxidan fácilmente, pero eso es algo cubierto la hoja de especificaciones... Está destinado a ser soldado, no para jugar, de todos modos... Creo que es una parte de calidad, pero tal vez hay, de hecho, mejor por ahí... Estoy satisfecho con él hasta ahora.

El (principal) problema era la ecuación de Steinhart-Hart.

De hecho, mi circuito no estaba conectado correctamente para el límite de 1 V del ADC, de hecho, mi circuito podría haberse construido mejor con respecto al rango de temperaturas al que debería estar sujeto, pero mis ecuaciones Beta y Temperatura las había tomado de una página de calculadora , y no había verificado dos veces... Al verificarlos, no se parecían en nada a las ecuaciones reales de Steinhart-Hart... De hecho, mi Beta estaba muy lejos de la Beta provista por el fabricante, pero no tenía idea de cuánto debería fluctuar, o incluso lo que representaba, así que realmente no consideré eso al mirar mis variables durante la depuración. Sin embargo, la ecuación arrojó temperaturas algo razonables, tal vez plausibles, y tal vez sea "alguna" ecuación de termistor, pero no es la ecuación de Steinhart-Hart...

Ahora mi valor Beta está cerca de lo que proporciona el fabricante, pero descubrí que esos resultados eran un poco inexactos... Codifiqué las matemáticas para los coeficientes A, B, C, y ahora los estoy usando para encontrar la temperatura...

Mi termistor TDK responde muy bien, debido a sus capacidades de transferencia térmica, pierde calor muy rápido en el aire ambiente, si alguien alguna vez se pregunta... Me gusta, de todos modos... Siento que fue una buena compra de Arrow 😊

Nuevamente, gracias a todos por intentar ayudarme, y me ayudaron, aunque no fuera por lo que les había pedido 🙂

Si desea ver mi código actualizado, no dude en preguntar y publicaré una copia actualizada.

De nuevo: gracias a todos

Código fuente de publicación WRT. La forma preferida de hacer esto, en mi humilde opinión, es obtener una cuenta de GitHub (o algo similar), publicar allí la última y mejor versión de su código fuente y luego proporcionar aquí un enlace a esa página de GitHub. Con este enfoque, a medida que continúa realizando mejoras en el código fuente, simplemente carga el código fuente en su cuenta de GitHub. Las personas que lean este mensaje en el futuro pueden simplemente hacer clic en el enlace (aquí) que los lleva a su página de GitHub, donde pueden encontrar y descargar la última y mejor versión de su código fuente.