Muchos termistores pero sin lectura

2

De vuelta en septiembre de '12, 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 esto aquí?). Tenía un Aux, en un controlador antiguo con pantalla digital, configurado para leer a través de un interruptor giratorio, un grupo de termistores dispersos en varios lugares. Los nuevos controladores usan sensores más sofisticados, por lo que ahora me quedan muchos 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 solar térmico 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?

    

2 respuestas

4

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

Mostrédeliberadamenteelmicrocontroladoryeldivisordeltermistordesdelamismafuente.Esohacequelaslecturasseanratiométricas,conlacancelacióndelvoltajedesuministroreal.

Estetipodetermistoresvaríanbastanteenresistenciaalolargodesurangodetemperaturautilizable.ElvoltajepresentadoalaA/Desbastantenolinealenfuncióndelaresistencia,ylaresistenciaesbastantenolinealenfuncióndelatemperatura.Loquenormalmentehagoesponertodoellíoenunatabladebúsqueda.Puedeutilizartodaslasexponencialesdepuntoflotantedesagradablesquedeseacalcularlatabladebúsquedaenelmomentodelacompilación.Eneltiempodeejecución,soloobtieneelvalorA/Dylobuscaenunatablasitienemuchamemoriadeprograma,osihacelatablamáspequeñaqueelrangoA/DeinterpolaentrelasentradasadyacentesutilizandolosbitsmásbajosdeA/Dlectura.Decualquiermanera,eneltiempodeejecuciónesbastantesimplepasardelalecturaA/Dacualquierrepresentacióndetemperaturaqueelijainternamente.

HacepocohiceunproyectoenelqueundsPICteníaqueleerunatemperatura,entreotrascosas.Uséelpreprocesadorparaconstruirlatabladebúsquedaparamí.Primero,creéunasubrutinapreprocesadoraparaconvertirOhmsa°Cusandolaecuaciónylasconstantesdirectamentedelahojadedatosdeltermistor:

////////////////////////////////////////////////////////////////////////////////////SubroutineTHERM_R_Cr////SetthevariableDEGCtothetemperatureindegreesCindicatedbythe//thermistorhavingaresistanceofR.RisinOhms.///consta1real=3.354016e-3/constb1real=2.569850e-4/constc1real=2.620131e-6/constd1real=6.383091e-8/constrrefreal=10.0e3;resistanceatthereferencetemperature/constc0kreal=273.15;degKat0degC/varexistdegcreal/subroutinetherm_r_c/varlocalrreal=[arg1];getthermistorresistanceinOhms/varlocallrrreal=[log[/rrref]]/varlocalxreal/setxa1/setx[+x[*b1lrr]]/setx[+x[*c1[explrr2]]]/setx[+x[*d1[explrr3]]]/setx[/1x]/setdegc[-xc0k]/endsub

LuegoagreguécódigoalmóduloA/DqueescribiólalecturaA/Denlatabladebúsquedadetemperaturaenelmomentodelacompilación:

////////////////////////////////////////////////////////////////////////////////////Temperaturesensortotemperaturelookuptable.////Thislookupformatiscompatiblewiththelibrarysubroutine//LOOKUP_LIN_PROG.Thefirstwordisthenumberofsegmentsinthetable,//whichmustbeapowerof2andatleast2.Subsequentwordsarethedata//points.Sincesegmentsaretherangesbetweenadjacentdatapoints,there//segments+1datapoints.////Boththetableinputandoutputvaluesareunsigned16bitintegers.The//inputvalueisthefilteredA/Dreadingshiftedlefttomaximallyfillthe//16bits.FFULListheinputvalueforafullscalereading.////Sincethetemperaturevaluesaresigned,32768willbeaddedtotheminthe//tablesothattheycanbeinterpolatedasunsignedvalues.Theuserofthe//lookuptablemustsubtract32768fromtheresulttogetthetemperature//correspondingtothe0-FFF0hfilteredandshiftedtemperaturesensorA/D//reading.///consttempibitsinteger=[rnd[log2ntempseg]];numintbitsininputvalue/if[[exp2tempibits]ntempseg]then/show"  NTEMPSEG is not a power of 2"
         .error  "NTEMPSEG"
  /stop
  /endif

tbl_temp:                    ;start of A/D reading to temperature lookup table
         .pword  [v ntempseg] ;number of linear segments in the table.
/block
  /var local ii integer      ;0-NTEMPSEG data point number
  /var local reading integer ;16 bit shifted A/D reading at this point
  /var local v real          ;voltage at this data point
  /var local r real          ;thermistor resistance
  /var local dpoint integer  ;integer table value at this data point
  /var local s string

  /set ii 0                  ;init to first data point
  /block                     ;back here each new data point
    /set reading [shiftl ii [- 16 tempibits]] ;make 16 bit table input value here
    /set v [* [/ reading ffull] vfull] ;make voltage at this point
    /set v [max v 0.005]     ;clip to min/max voltage range
    /set v [min v [- vfull 0.005]]

    /set r [/ [- vfull v] v] ;ratio of top to bottom resistances
    /set r [* r tempr2]      ;thermistor resistance

    /call therm_r_c [v r]    ;compute temperature from this resistance

    /set dpoint [+ [rnd [/ degc .1]] 32768] ;make integer table value

    /set s ""
    /call tabopcode s
    /set s [str s ".pword"]
    /call taboperand s
    /set s [str s dpoint]
    /call startcomm s
    /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"] " Ohms"]
    /set s [str s "   " [fp degc "fw 7 sig 0 mxl 6 rit 1"] " C"]
    /write s

    /set ii [+ ii 1]         ;advance to next data point number
    /if [<= ii ntempseg] then
      /repeat
      /endif
    /endblock
  /endblock

La mayor parte de la mayor parte de este código está formateando bien la tabla para facilitar su verificación al observar el resultado y durante la depuración.

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

tbl_temp:                    ;start of A/D reading to temperature lookup table
         .pword  256 ;number of linear segments in the table.
         .pword  32134       ;   0    0.005 V   1796400 Ohms     -63.4 C
         .pword  32222       ;   1    0.010 V    917775 Ohms     -54.6 C
         .pword  32321       ;   2    0.020 V    457087 Ohms     -44.7 C
         .pword  32382       ;   3    0.029 V    303525 Ohms     -38.6 C
         .pword  32427       ;   4    0.039 V    226744 Ohms     -34.1 C
         .pword  32463       ;   5    0.049 V    180675 Ohms     -30.5 C
         .pword  32493       ;   6    0.059 V    149963 Ohms     -27.5 C
         .pword  32520       ;   7    0.068 V    128025 Ohms     -24.8 C
   ...
         .pword  33252       ; 124    1.211 V      3830 Ohms      48.4 C
         .pword  33256       ; 125    1.221 V      3771 Ohms      48.8 C
         .pword  33260       ; 126    1.231 V      3713 Ohms      49.2 C
         .pword  33264       ; 127    1.241 V      3655 Ohms      49.6 C
         .pword  33269       ; 128    1.250 V      3598 Ohms      50.1 C
         .pword  33273       ; 129    1.260 V      3542 Ohms      50.5 C
         .pword  33277       ; 130    1.270 V      3488 Ohms      50.9 C
         .pword  33281       ; 131    1.280 V      3433 Ohms      51.3 C
   ...
         .pword  34540       ; 249    2.432 V       100 Ohms     177.2 C
         .pword  34618       ; 250    2.442 V        85 Ohms     185.0 C
         .pword  34713       ; 251    2.452 V        71 Ohms     194.5 C
         .pword  34835       ; 252    2.462 V        56 Ohms     206.7 C
         .pword  35000       ; 253    2.471 V        42 Ohms     223.2 C
         .pword  35254       ; 254    2.481 V        27 Ohms     248.6 C
         .pword  35759       ; 255    2.491 V        13 Ohms     299.1 C
         .pword  36256       ; 256    2.495 V         7 Ohms     348.8 C

Tenga en cuenta que debido a la forma en que funciona el divisor de resistencia, obtendrá la resolución de resistencia máxima en el centro del rango. En otras palabras, haga de R2 el valor que tendrá el termistor en el punto en el que desee la resolución máxima.

En este caso, el procesador tenía una 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 adicionales adicionales se utilizaron 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 exactitud 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, estos termistores NTC con un divisor de resistencia solo pueden decirle que es 51.2 ° C ± 2 ° C, pero puede decirle que la temperatura simplemente subió 0.1 ° C.

    
respondido por el Olin Lathrop
3

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 ohmiómetro y buscar la temperatura en una tabla de resistencia a la temperatura. Hecho.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas