Muchos termistores pero sin lectura

En septiembre de 2012, Olin Lathrop respondió una pregunta similar sobre el cableado de una pantalla digital a un termistor , pero mi situación es ligeramente diferente a la de Jim McDerby. Yo también tengo paneles solares térmicos montados en diferentes lugares, y he tenido que reemplazar dos de los tres controladores delta-T con unidades de Alemania (¿Cómo es que ya no hacemos estas cosas aquí?). Tenía el Aux, en un controlador antiguo con una pantalla digital, configurado para leer a través de un interruptor giratorio, un montón de termistores dispersos en varios lugares. Los nuevos controladores usan sensores más sofisticados, por lo que ahora me quedan un montón de termistores, algunos incrustados en concreto, sin forma de leerlos.

La diferencia es que, a diferencia de Jim, no tengo que preocuparme por el punto de Olin sobre "cargar estas señales, de lo contrario confundirá su sistema térmico solar existente" . Iba a hacerle una pregunta de seguimiento a Olin, pero las reglas de su sitio web lo prohíben, así que estoy aquí y mi pregunta es:

¿Cuál es la forma más sencilla de leer los termistores?

Creo que, por el bien del sitio y la forma en que se plantean las preguntas, se debe eliminar la segunda mitad de su pregunta. Nos gusta que las preguntas sean claras, concisas y nos aseguren de brindarnos toda la información importante para ayudarle a resolver el problema en cuestión
Me tomé la libertad de editar tu pregunta y hacerla un poco más concisa. Agradezco su esfuerzo por preguntar cortésmente, pero aquí las preguntas breves y directas son más efectivas, especialmente para los futuros lectores.

Respuestas (2)

Si tiene acceso a ambos cables de un termistor NTC, entonces la electrónica para leer la temperatura es bastante simple:

Deliberadamente mostré el microcontrolador y el divisor de termistor funcionando con el mismo suministro. Eso hace que las lecturas sean proporcionales, con la cancelación del voltaje de suministro real.

Estos tipos de termistores varían mucho en resistencia en su rango de temperatura utilizable. El voltaje presentado al A/D es bastante no lineal en función de la resistencia, y la resistencia es bastante no lineal en función de la temperatura. Lo que suelo hacer es poner todo el lío en una tabla de búsqueda. Puede usar todos los exponenciales de coma flotante desagradables que desee para calcular la tabla de búsqueda en el momento de la compilación. En tiempo de ejecución, solo obtiene el valor A/D y lo busca en una tabla si tiene mucha memoria de programa, o hace que la tabla sea más pequeña que el rango A/D e interpola entre entradas adyacentes usando los bits inferiores de A /D lectura. De cualquier manera, es bastante simple en tiempo de ejecución pasar de la lectura A/D a cualquier representación de temperatura que elija internamente.

Recientemente hice un proyecto en el que un dsPIC tenía que leer una temperatura, entre otras cosas. Usé el preprocesador para construir la tabla de búsqueda para mí. Primero, creé una subrutina de preprocesador para convertir ohmios a °C usando la ecuación y las constantes directamente de la hoja de datos del termistor:

/////////////////////////////////////////////////// ///////////////////////////////
//
// Subrutina THERM_R_C r
//
// Establecer la variable DEGC a la temperatura en grados C indicada por el
// termistor que tiene una resistencia de R. R está en ohmios.
//
/const a1 real = 3.354016e-3
/const b1 real = 2.569850e-4
/const c1 real = 2.620131e-6
/const d1 real = 6.383091e-8
/const rref real = 10.0e3 ;resistencia a la temperatura de referencia
/const c0k real = 273.15 ;grados K ​​a 0 gradosC

/var existe degc real

/subrutina therm_r_c
  /var local r real = [arg 1]; obtener la resistencia del termistor en ohmios
  /var local lrr real = [registro [/ r rref]]
  /var locales x reales

  /juego x a1
  /establecer x [+ x [* b1 lrr]]
  /establecer x [+ x [* c1 [exp lrr 2]]]
  /establecer x [+ x [* d1 [exp lrr 3]]]
  /conjunto x [/ 1 x]
  /establecer gradosc [- x c0k]
  /endsub

Luego agregué el código al módulo A/D que escribió la lectura A/D a la tabla de búsqueda de temperatura en el momento de la compilación:

/////////////////////////////////////////////////// ///////////////////////////////
//
// Sensor de temperatura a la tabla de búsqueda de temperatura.
//
// Este formato de búsqueda es compatible con la subrutina de la biblioteca
// BUSCAR_LIN_PROG. La primera palabra es el número de segmentos en la tabla,
// que debe ser una potencia de 2 y al menos 2. Las palabras siguientes son los datos
// puntos. Dado que los segmentos son los rangos entre puntos de datos adyacentes, no
// segmentos+1 puntos de datos.
//
// Los valores de entrada y salida de la tabla son enteros de 16 bits sin signo. El
// el valor de entrada es la lectura A/D filtrada desplazada a la izquierda para llenar al máximo el
// 16 bits. FFULL es el valor de entrada para una lectura de escala completa.
//
// Como los valores de temperatura están firmados, se les sumará 32768 en el
// tabla para que puedan interpolarse como valores sin signo. El usuario de la
// la tabla de búsqueda debe restar 32768 del resultado para obtener la temperatura
// correspondiente al sensor de temperatura A/D filtrado y desplazado 0-FFF0h
// lectura.
//
/const tempibits integer = [rnd [log2 ntempseg]] ;num int bits en el valor de entrada
/si [ [exp 2 tempibits] ntempseg] entonces
  /mostrar "NTEMPSEG no es una potencia de 2"
         .error "NTEMPSEG"
  /detener
  /terminara si

tbl_temp: ;inicio de la lectura A/D en la tabla de búsqueda de temperatura
         .pword [v ntempseg] ;número de segmentos lineales en la tabla.
/bloquear
  /var local ii entero ;0-NTEMPSEG número de punto de datos
  /var entero de lectura local; lectura A/D desplazada de 16 bits en este punto
  /var local v real ;voltaje en este punto de datos
  /var local r real ;resistencia del termistor
  /var entero de punto de referencia local; valor de tabla entero en este punto de datos
  /var cadena s local

  /set ii 0 ;iniciar al primer punto de datos
  /block; de vuelta aquí cada nuevo punto de datos
    /establecer lectura [shiftl ii [- 16 tempibits]] ;hacer valor de entrada de tabla de 16 bits aquí
    /establecer v [* [/ leyendo ffull] vfull] ;hacer voltaje en este punto
    /set v [max v 0.005] ;cortar al rango de voltaje mínimo/máximo
    /establecer v [min v [- vfull 0.005]]

    /set r [/ [- vfull v] v] ;proporción de resistencias de arriba a abajo
    /set r [* r tempr2] ;resistencia del termistor

    /llamar a therm_r_c [vr] ;calcular la temperatura a partir de esta resistencia

    /set dpoint [+ [rnd [/ degc .1]] 32768] ;hacer valor de tabla entero

    /establecer s ""
    /llamar a tabopcode s
    /establecer s [str s ".pword"]
    /llamar al taboperando s
    /establecer s [str s dpunto]
    /llamar a iniciar comunicaciones
    /set s [str s [int ii "fw 4"]]
    /set s [str s " " [fp v "fw 6 sig 0 mxl 6 rit 3"] " V"]
    /set s [str s " " [int [rnd r] "fw 7"] " Ohmios"]
    /set s [str s " " [fp degc "fw 7 sig 0 mxl 6 rit 1"] " C"]
    /escribir s

    /set ii [+ ii 1] ;avanzar al siguiente número de punto de datos
    /si [<= ii ntempseg] entonces
      /repetir
      /terminara si
    /bloque final
  /bloque final

La mayor parte de este código está formateando bien la tabla para que sea fácil de verificar mirando el resultado y durante la depuración.

Aquí está el código ensamblador final para la tabla:

tbl_temp: ;inicio de la lectura A/D en la tabla de búsqueda de temperatura
         .pword 256 ;número de segmentos lineales en la tabla.
         .palabra 32134; 0 0,005 V 1796400 Ohmios -63,4 C
         .palabra 32222; 1 0,010 V 917775 Ohmios -54,6 C
         .palabra 32321; 2 0,020 V 457087 Ohmios -44,7 C
         .palabra 32382; 3 0,029 V 303525 Ohmios -38,6 C
         .palabra 32427; 4 0,039 V 226744 ohmios -34,1 C
         .palabra 32463; 5 0,049 V 180675 Ohmios -30,5 C
         .palabra 32493; 6 0,059 V 149963 ohmios -27,5 C
         .palabra 32520; 7 0,068 V 128025 ohmios -24,8 C
   ...
         .palabra 33252; 124 1,211 V 3830 ohmios 48,4 C
         .palabra 33256; 125 1,221 V 3771 ohmios 48,8 C
         .palabra 33260; 126 1,231 V 3713 ohmios 49,2 C
         .palabra 33264; 127 1,241 V 3655 ohmios 49,6 C
         .palabra 33269; 128 1,250 V 3598 ohmios 50,1 C
         .palabra 33273; 129 1,260 V 3542 ohmios 50,5 C
         .palabra 33277; 130 1,270 V 3488 ohmios 50,9 C
         .palabra 33281; 131 1,280 V 3433 ohmios 51,3 C
   ...
         .palabra 34540; 249 2,432 V 100 ohmios 177,2 C
         .palabra 34618; 250 2,442 V 85 ohmios 185,0 C
         .palabra 34713; 251 2,452 V 71 ohmios 194,5 C
         .palabra 34835; 252 2,462 V 56 ohmios 206,7 C
         .palabra 35000; 253 2,471 V 42 ohmios 223,2 C
         .palabra 35254; 254 2,481 V 27 ohmios 248,6 C
         .palabra 35759; 255 2,491 V 13 ohmios 299,1 C
         .palabra 36256; 256 2,495 V 7 ohmios 348,8 C

Tenga en cuenta que debido a cómo funciona el divisor de resistencia, obtiene la resolución de resistencia máxima en el medio del rango. En otras palabras, haga que R2 sea el valor que tendrá el termistor en el punto en el que desea la máxima resolución.

En este caso, el procesador tenía un A/D de 12 bits pero solo usé una tabla con 256 entradas. Los 8 bits altos de la lectura A/D indexados en la tabla, y los 4 bits bajos adicionales se usaron para interpolar linealmente entre las entradas de la tabla adyacente identificadas por los 8 bits altos.

Tenga en cuenta que estos termistores no son tan precisos, pero puede obtener mucha resolución con este método. Para un sistema de control estable, una buena resolución es útil para mantener los números "suaves". La precisión es lo que es. Mire la hoja de datos del termistor y no olvide tener en cuenta el error de R2 también. Dicho de otra manera, es posible que estos termistores NTC con un divisor de resistencia solo puedan decirle que es 51,2 °C ± 2 °C, pero pueden decirle que la temperatura subió 0,1 °C.

gran respuesta; Sin embargo, tendría cuidado con el condensador de 10uF. Un capacitor tan grande tendrá una corriente de fuga que afectará el comportamiento, y probablemente dependerá de la temperatura con cierta imprevisibilidad. Murata tiene una buena explicación para sus condensadores cerámicos; citan una especificación de ejemplo C*Rleakage >= 50s que para un límite de 10uF es solo 5MΩ -- a bajas temperaturas, la resistencia de Thevenin de la red de resistencias es de alrededor de 10K y el error debido a la fuga de la tapa puede ser grande en comparación con la señal del termistor.
Usaría un capacitor en el rango de 0.1uF - 1.0uF para que la corriente de fuga sea un problema menor.
Buen trabajo 1+, eventualmente podría mejorarse con la posibilidad de una calibración.

No leí la mayor parte, pero al escanearlo, su pregunta parece ser "cuál es la forma más sencilla de leer un termistor". Mi respuesta es usar un ohmímetro y buscar la temperatura en una tabla de resistencia a la temperatura. Hecho.