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.