NTC-Temperaturwerte
Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
NTC Temperaturwerte
Gnu Octave kann verwendet werden, um Polynominal-Koeffizienten zu berechnen. Damit lassen sich krumme Kennlinien linearisieren.
Hier wird polyfit angewendet, um nicht den ADC-Wert, sondern einen berechneten Wert zu linearisieren, das so berechnet wurde:
rref = 10.0 ; // kOhm
fADC = (float)ADC/1024.0 ;
fRMES = rref * fADC / (1.0 - fADC ) ;
logrmes = log(fRMES) ;
fTemperatur = polyval(C, logrmes);
Die .m- Datei für GNU-Octave zu Bestimmung der Polynominalkoeffizienten sieht so aus:
Datei btcm_10k_b3350.m
## btcm_10k_b3350.m
##
## NTC-Widerstand
## Datenblatt: https://www.tme.eu/de/details/ntcm-10k-b3380/ntc-mess-thermistoren-tht/sr-passives/
## Bestellnr bei Pollin: 220757
##
## 2022-12-24 HJHerbert
##
## Die 181 Temperaturwerte aus dem Datenblatt
Temperatur=[ -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, \
-41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, \
-25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, \
-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, \
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, \
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, \
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, \
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, \
93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, \
110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125 ];
#
## Die 181 Widerstandswerte aus dem Datenblatt
# R_CENTER in kOhm,
RNTC = [486.088, 456.961, 429.745, 404.308, 380.522, 358.274, 337.457, 317.97, \
299.723, 282.63, 266.612, 251.597, 237.516, 224.306, 211.91, 200.272, 189.343, \
179.075, 169.425, 160.353, 151.82, 143.793, 136.238, 129.125, 122.426, 116.115, \
110.166, 104.558, 99.269, 94.279, 89.57, 85.123, 80.925, 76.958, 73.209, 69.665, \
66.314, 63.144, 60.144, 57.304, 54.615, 52.069, 49.656, 47.369, 45.201, 43.144, \
41.194, 39.343, 37.586, 35.917, 34.333, 32.827, 31.396, 30.036, 28.743, 27.513, \
26.342, 25.228, 24.167, 23.158, 22.196, 21.279, 20.406, 19.573, 18.779, 18.016, \
17.299, 16.61, 15.952, 15.323, 14.723, 14.15, 13.602, 13.079, 12.578, 12.099, \
11.642, 11.204, 10.785, 10.384, 10, 9.632, 9.28, 8.942, 8.619, 8.309, 8.012, \
7.727, 7.453, 7.191, 6.94, 6.698, 6.467, 6.244, 6.03, 5.825, 5.628, 5.438, \
5.256, 5.081, 4.913, 4.751, 4.595, 4.445, 4.301, 4.168, 4.029, 3.9, 3.776, \
3.657, 3.542, 3.431, 3.324, 3.222, 3.122, 3.027, 2.934, 2.845, 2.76, 2.677, \
2.597, 2.52, 2.445, 2.373, 2.304, 2.237, 2.172, 2.109, 2.049, 1.99, 1.934, \
1.879, 1.826, 1.775, 1.725, 1.678, 1.631, 1.586, 1.543, 1.501, 1.461, 1.421, \
1.383, 1.346, 1.31, 1.276, 1.242, 1.21, 1.178, 1.147, 1.118, 1.089, 1.061, \
1.034, 1.008, 0.983, 0.958, 0.934, 0.911, 0.888, 0.866, 0.845, 0.824, 0.804, \
0.785, 0.766, 0.747, 0.729, 0.712, 0.695, 0.679, 0.663, 0.647, 0.632, 0.618, \
0.603, 0.589, 0.576, 0.563, 0.55, 0.538 ];
# Der Referenz-Widerstand,
RREF = 10.0 ;# kOhm
# Es gibt einen Spannungsteiler:
# + 5V ist UREF
# RREF
# ADC-Eingang
# NTC
# GND
# Der ADC-Eingang misst ADC = 1024 * UEIN / UREF
# Spannungsteiler UEIN = UREF * RNTC / ( RREF + RNTC )
# Der ADC-Eingang misst ADC = 1024 * RNTC / ( RREF + RNTC )
# Die 181 die 90 Spanungsteilerverhaeltnisse aus den 181 Widerstandswerten RNTC
VEIN= RNTC ./ ( RREF + RNTC );
# ein 10 Bit ADC misst 1024 Punkte
# Die 181 ADC-Werte
ADC = round( VEIN .* 1024 );
#
# Umskalieren auf 0...0.9990234375
ADCS = ADC ./ 1024 ;
# Berechnen de Polynominalkoeffizienten, welche das Polynom festlegen, durch das T=f(ADCS) berechnet werden kann:
# Aus dem ADC-Wert ausgerechneter Widerstand
RMES = ADCS ./ ( -ADCS .+ 1 ) .* RREF ;
LOGRMES = log(RMES) ;
Ordnung = 5 ; ## Ordnung 1 bringt nur Versatz und Verstärkung
C = polyfit(LOGRMES, Temperatur, Ordnung)
# Der Mess-Rechner muss rechnen:
# rref = 10.0 // kOhm
# fADC = (float)ADC/1024.0
# fRMES = rref * fADC / (1.0 - fADC )
# x = logrmes = log(fRMES)
# Temperatur = polyval(C, x )
#
precision = 8 ; # Octave Nachkommastellen
Ersatzwerte = polyval(C, LOGRMES) ;
Differenzen = Ersatzwerte - Temperatur ;
plot( Temperatur, Differenzen, 'r+' )
# Zeige die Zeile an
txa='TC='
txa = strcat( txa, num2str( C(columns(C)), 8) )
for i=Ordnung:-1:1 ;
txa = strcat( txa, '+ x * (' );
txa = strcat( txa, num2str( C(i), 8) )
endfor
for i=1:Ordnung ;
txa = strcat( txa, ')' );
endfor
txa = strcat( txa, ';' )
Ergebnis für Ordnung = 3: TC=99.412404+ x * (-38.881451+ x * (3.1766893+ x * (-0.15092423)));
Ergebnis für Ordnung = 4: TC=99.355652+ x * (-39.09142+ x * (3.465772+ x * (-0.24466316+ x * (0.0087377335))));
Ergebnis für Ordnung = 5: TC=99.339689+ x * (-39.106833+ x * (3.5406951+ x * (-0.29320445+ x * (0.019672445+ x * (-0.00080927155)))));
Verweise
In WWW suche: GNU octave