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
simular este circuito : esquema creado con CircuitLab
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.
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:
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.
¿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.
boiling water has to be at 100 degrees
Solo al nivel del mar. He medido en mi casa a 97CAdemá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.
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.
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
sombrereroloco
jim fischer
pobre y desafortunado
pobre y desafortunado
Con3ro
pobre y desafortunado
nekomático
pobre y desafortunado