Viele Thermistoren, aber keine Anzeige

Bereits im September 2012 beantwortete Olin Lathrop eine ähnliche Frage zur Verkabelung einer digitalen Anzeige mit einem Thermistor , aber meine Situation unterscheidet sich geringfügig von der von Jim McDerby. Auch ich habe an verschiedenen Stellen Solarthermie-Paneele montiert und musste zwei der drei Delta-T-Regler durch Geräte aus Deutschland ersetzen (Wie kommt es, dass wir dieses Zeug hier nicht mehr herstellen?). Ich hatte den Aux auf einem alten Controller mit Digitalanzeige so eingerichtet, dass er über einen Drehschalter gelesen werden konnte, eine Reihe von Thermistoren, die an verschiedenen Stellen verstreut waren. Die neuen Controller verwenden ausgeklügeltere Sensoren, sodass ich jetzt mit einem Haufen Thermistoren zurückbleibe, von denen einige in Beton eingebettet sind und keine Möglichkeit haben, sie zu lesen.

Der Unterschied besteht darin, dass ich mich im Gegensatz zu Jim nicht um Olins Punkt kümmern muss, "lade diese Signale, sonst wird es dein bestehendes solarthermisches System verwirren" . Ich wollte Olin eine Folgefrage stellen, aber Ihre Website-Regeln verbieten das, also bin ich hier und meine Frage lautet:

Was ist der einfachste Weg, die Thermistoren zu lesen?

Ich denke, zum Wohle der Website und der Art und Weise, wie Fragen gestellt werden sollen, sollte die zweite Hälfte Ihrer Frage entfernt werden. Wir mögen klare, prägnante Fragen und stellen sicher, dass Sie uns alle wichtigen Informationen geben helfen Ihnen, das vorliegende Problem zu lösen
Ich habe mir die Freiheit genommen, Ihre Frage zu bearbeiten und etwas prägnanter zu machen. Ich weiß Ihre Bemühungen zu schätzen, höflich zu fragen, aber hier sind kurze und auf den Punkt gebrachte Fragen effektiver, insbesondere für zukünftige Leser.

Antworten (2)

Wenn Sie Zugang zu beiden Leitungen eines NTC-Thermistors haben, ist die Elektronik zum Ablesen der Temperatur recht einfach:

Ich habe absichtlich den Mikrocontroller und den Thermistorteiler gezeigt, der von derselben Versorgung läuft. Dadurch werden die Messwerte ratiometrisch, wobei sich die tatsächliche Versorgungsspannung aufhebt.

Der Widerstand dieser Arten von Thermistoren variiert über ihren verwendbaren Temperaturbereich ziemlich stark. Die dem A/D zugeführte Spannung ist als Funktion des Widerstands ziemlich nichtlinear, und der Widerstand ist als Funktion der Temperatur ziemlich nichtlinear. Was ich normalerweise mache, ist das ganze Durcheinander in eine Nachschlagetabelle zu packen. Sie können alle fiesen Gleitkomma-Exponentiale verwenden, die Sie zum Berechnen der Nachschlagetabelle zur Erstellungszeit verwenden möchten. Zur Laufzeit erhalten Sie einfach den A/D-Wert und schlagen ihn in einer Tabelle nach, wenn Sie viel Programmspeicher haben, oder Sie machen die Tabelle kleiner als den A/D-Bereich und interpolieren zwischen benachbarten Einträgen unter Verwendung der unteren Bits von A /D lesen. In jedem Fall ist es zur Laufzeit ziemlich einfach, vom A/D-Messwert zu einer beliebigen Temperaturdarstellung zu wechseln, die Sie intern wählen.

Ich habe kürzlich ein Projekt gemacht, bei dem ein dsPIC unter anderem eine Temperatur lesen musste. Ich habe den Präprozessor verwendet, um die Nachschlagetabelle für mich zu erstellen. Zuerst habe ich eine Präprozessor-Subroutine erstellt, um Ohm in °C umzuwandeln, indem ich die Gleichung und Konstanten direkt aus dem Thermistor-Datenblatt verwende:

////////////////////////////////////////////////// //////////////////////////////
//
// Unterprogramm THERM_R_C r
//
// Setzen Sie die Variable DEGC auf die Temperatur in Grad C, die von angezeigt wird
// Thermistor mit einem Widerstand von R. R ist in Ohm.
//
/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 ;Widerstand bei Referenztemperatur
/const c0k real = 273,15 ;degK bei 0 degC

/var existiert degc real

/Unterprogramm therm_r_c
  /var local r real = [arg 1] ;Thermistorwiderstand in Ohm abrufen
  /var local lrr real = [log[/rrref]]
  /var lokal x real

  /set x a1
  /set x [+ x [* b1 lrr]]
  /set x [+ x [* c1 [exp lrr 2]]]
  /set x [+ x [* d1 [exp lrr 3]]]
  /set x [/ 1 x]
  /set degc [- x c0k]
  /End Sub

Ich habe dann dem A/D-Modul Code hinzugefügt, der den A/D-Messwert zur Temperatur-Lookup-Tabelle zur Erstellungszeit geschrieben hat:

////////////////////////////////////////////////// //////////////////////////////
//
// Temperatursensor zu Temperatur-Lookup-Tabelle.
//
// Dieses Lookup-Format ist mit der Bibliotheks-Subroutine kompatibel
// LOOKUP_LIN_PROG. Das erste Wort ist die Anzahl der Segmente in der Tabelle,
// die eine Potenz von 2 und mindestens 2 sein muss. Nachfolgende Wörter sind die Daten
// Punkte. Da Segmente die Bereiche zwischen benachbarten Datenpunkten sind, gibt es
// Segmente+1 Datenpunkte.
//
// Sowohl die Eingabe- als auch die Ausgabewerte der Tabelle sind vorzeichenlose 16-Bit-Ganzzahlen. Der
// Eingangswert ist der gefilterte A / D-Messwert, der nach links verschoben wird, um den maximal zu füllen
// 16 Bit. FFULL ist der Eingangswert für eine Skalenendwertanzeige.
//
// Da die Temperaturwerte vorzeichenbehaftet sind, wird ihnen in der 32768 hinzugefügt
// Tabelle, damit sie als vorzeichenlose Werte interpoliert werden können. Der Benutzer der
// Lookup-Tabelle muss 32768 vom Ergebnis subtrahieren, um die Temperatur zu erhalten
// entsprechend dem 0-FFF0h gefilterten und verschobenen Temperatursensor A/D
// Lektüre.
//
/const tempibits integer = [rnd [log2 ntempseg]] ;num int Bits im Eingabewert
/if [ [exp 2 tempibits] ntempseg] dann
  /show "NTEMPSEG ist keine Potenz von 2"
         .Fehler "NTEMPSEG"
  /stoppen
  /endif

tbl_temp: ;Beginn des A/D-Lesens in die Temperatur-Lookup-Tabelle
         .pword [v ntempseg] ;Anzahl der linearen Segmente in der Tabelle.
/Block
  /var local ii integer ;0-NTEMPSEG Datenpunktnummer
  /var lokaler Messwert Integer; 16-Bit-verschobener A/D-Messwert an diesem Punkt
  /var local v real ;Spannung an diesem Datenpunkt
  /var local r real ;Thermistorwiderstand
  /var local dpoint integer ;ganzzahliger Tabellenwert an diesem Datenpunkt
  /var lokaler s-String

  /set ii 0 ;init zum ersten Datenpunkt
  /block ;Hier jeder neue Datenpunkt zurück
    /set reading [shiftl ii [- 16 tempibits]] ;erzeuge hier einen 16-Bit-Tabelleneingabewert
    /set v [* [/ reading ffull] vfull] ;Stelle an dieser Stelle Spannung her
    /set v [max v 0.005] ;clip auf min/max Spannungsbereich
    /set v [min v [- vfull 0.005]]

    /set r [/ [- vfull v] v] ;Verhältnis der oberen zu unteren Widerstände
    /set r [* r tempr2] ;Thermistorwiderstand

    /call therm_r_c [vr] ;Temperatur aus diesem Widerstand berechnen

    /set dpoint [+ [rnd [/ degc .1]] 32768] ;integern Tabellenwert erstellen

    /set s ""
    /Tabopcode aufrufen s
    /set s [str s ".pword"]
    /Taboperand s aufrufen
    /set s [str s Punkt]
    /startcomm anrufen 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"] " Ohm"]
    /set s [str s " " [fp degc "fw 7 sig 0 mxl 6 rit 1"] " C"]
    /schreibe s

    /set ii [+ ii 1] ;weiter zur nächsten Datenpunktnummer
    /if [<= ii ntempseg] dann
      /wiederholen
      /endif
    /endblock
  /endblock

Der größte Teil dieses Codes formatiert die Tabelle so, dass sie durch Betrachten des Ergebnisses und während des Debuggens leicht zu überprüfen ist.

Hier ist der endgültige Montagecode für den Tisch:

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

Beachten Sie, dass Sie aufgrund der Funktionsweise des Widerstandsteilers die maximale Widerstandsauflösung in der Mitte des Bereichs erhalten. Mit anderen Worten, machen Sie R2 zu dem Wert, den der Thermistor an dem Punkt haben wird, an dem Sie die maximale Auflösung wünschen.

In diesem Fall hatte der Prozessor einen 12-Bit-A/D, aber ich habe nur eine Tabelle mit 256 Einträgen verwendet. Die hohen 8 Bits des in die Tabelle indizierten A/D-Lesens und die zusätzlichen niedrigen 4 Bits wurden verwendet, um zwischen den durch die hohen 8 Bits identifizierten benachbarten Tabelleneinträgen linear zu interpolieren.

Denken Sie daran, dass diese Thermistoren nicht so genau sind, aber Sie können mit dieser Methode eine große Auflösung erzielen. Für ein stabiles Regelsystem ist eine gute Auflösung sinnvoll, um die Zahlen "glatt" zu halten. Genauigkeit ist, was es ist. Schauen Sie sich das Thermistor-Datenblatt an und vergessen Sie nicht, auch den Fehler von R2 zu berücksichtigen. Anders ausgedrückt, diese NTC-Thermistoren mit einem Widerstandsteiler können Ihnen möglicherweise nur sagen, dass es 51,2 ° C ± 2 ° C sind, aber Sie können Ihnen sagen, dass die Temperatur gerade um 0,1 ° C gestiegen ist.

gute Antwort; Ich wäre jedoch vorsichtig mit dem 10uF-Kondensator. Ein so großer Kondensator hat einen Leckstrom, der das Verhalten beeinflusst, und er wird wahrscheinlich mit einer gewissen Unvorhersehbarkeit temperaturabhängig sein. Murata hat eine gute Erklärung für ihre Keramikkondensatoren; sie zitieren eine Beispielspezifikation C*Rleakage >= 50s, was für eine 10uF-Kappe nur 5MΩ -- Bei kalten Temperaturen beträgt der Thevenin-Widerstand des Widerstandsnetzwerks etwa 10 K, und der Fehler aufgrund des Kappenlecks kann im Vergleich zum Thermistorsignal groß sein.
Ich würde einen Kondensator im Bereich von 0,1 uF - 1,0 uF verwenden, damit der Leckstrom weniger problematisch ist.
Gute Arbeit 1+, könnte eventuell mit der Möglichkeit einer Kalibrierung verbessert werden.

Ich habe das meiste davon nicht gelesen, aber wenn Sie es scannen, scheint Ihre Frage zu lauten: "Wie liest man einen Thermistor am einfachsten?" Meine Antwort ist, ein Ohmmeter zu verwenden und die Temperatur in einer Widerstand-zu-Temperatur-Tabelle nachzuschlagen. Erledigt.