Forum: Mikrocontroller und Digitale Elektronik multikanal PT100 Thermometer


von thermo (Gast)


Lesenswert?

Benötige etwas Hilfe bei der Wahl von Komponenten.

Möchhte gerne eine Multikanal Thermometer Schaltung aufbauen.
Auf Basis voon PT100 Wiederständen.

Als Grundschaltung für einen Kanal wollte ich die schon bekannte 
Ausführung mit LM317 als Konstantstrom-Quelle und ein LM324 zum 
abkoppeln, offset elimienieren und verstärken nutzen.

Da ich vor habe 5 Pt100 Wiederstände zu nutzen bin ich mir bei dem 
Controller noch nicht ganz sicher.

Kann ich mit einem ATMega8, 5 separate Spannungen digitalisieren und 
jeweils an ein 5 Zeilen LCD-Display Anzeigen ?

Welches Display würdet ihr mir dafür empfehlen ?

Gruß

von 4421 (Gast)


Lesenswert?

LM324 ... aaaahhhhhhh.... schon mal den Offset angeschaut ?

von thermo (Gast)


Lesenswert?

Biin doch noch ein Anfänger auf dem Gebiet :)

Der Offset beträgt beim LM324 3,5mV.

Hab jetzt mal bei einem elektronik anbieter die OP's verglichen und bin 
auf den LMC6484 gestossen. Der ist relativ günstig knapp 2,5€ und hat 
einen Offset von 0,75mV

Denke der sollte für meinen Einsatz ok sein :)

von Helmut L. (helmi1)


Lesenswert?

Suchst du Schaltungen zum PT100 guckst du hier

Beitrag "Temperaturmessschaltung möglichst genau?"

Gruss Helmi

von thermo (Gast)


Lesenswert?

Da habe ich schon etwas gelesen.

Wie ich sehen konnte bevorzugen tust du den OPA2340 ....
Kostet aber fasst das doppelte wie ein
IC LMC6484AIN

von thermo (Gast)


Lesenswert?

und da ich mindestens 4 davon benötige sammelt sich der Preisunterschied 
:)

von 4421 (Gast)


Lesenswert?

Schon mal eine Fehlerrechnung gemacht ? Welchen Temperaturfehler 
produziert 1mV offsetspannung ?

von Helmut L. (helmi1)


Lesenswert?

@thermo

Wenn du dir die PT100 Box ansiehst ist dort eine moeglichkeit der 
automatischen Kalibrierung anhand von 2 Festwiderstaenden beschrieben.
Wenn du das in regelmaessigen Abstaenden machst fallen Offset und 
Gainfehler der Schaltung raus und  Stabilitaet und Genauigkeit wird nur 
noch durch die beiden Festwiderstaende bestimmt. Und die sind wesentlich 
besser als die OPs . Damit kannst du auch TL062 und Konsorten einsetzen.

Gruss Helmi

von thermo (Gast)


Lesenswert?

Nur mal als Hinweis. Es kommt nicht darauf an sehr genau zu messen.
Auch ein Fehler von 0.5° C ist für meine Anwendung OK!

Das Thermometer soll für kryotech Anwendungen benutzt werden.
Messbereich -200°C bis 50°C. Wichtig ist die schnelle Reaktionszeit 
(Ansprechzeit)

Ein weiterer Chip im Bereich von 2,5€ ist der
IC AD8604ARU ( Drift 2µV / °C) , Offset 0.6mV

von Gasst (Gast)


Lesenswert?

Warum nimmst Du nicht einfach ganz simple OP07?

von thermo (Gast)


Lesenswert?

Weil ein OP07 ein einfacher OP ist ich brauche aber 4 Stück in einem 
Gehäuse :)

@Helmi

Danke für den Tip bezüglich PT100box !
Muss es nur noch schaffen die Schaltung zu verstehen.

Deine Multiplexer Variante ist sicherlich eleganter und Kostengünstiger.
Aber ich wollte es erstmal mit 4 quad Op's machen.

Der ATMega8 hat 6 ADC Kanäle wenn ich an 4 davon 4 Verstärkte PT100 
Spannungen lege müsste ich doch in der Lage sein auch ohne multiplexer 
auszukommen.

Ich bin Softwareentwickler also sollte der Assembler / C Teil für mich 
kein Problem darstellen.

Stellt sich die Frage welches 4 Zeiliges Display für die anzeige 
verwenden.
Und kann ich über den ATMega8 dieses ansteuern ?

von Helmut L. (helmi1)


Angehängte Dateien:

Lesenswert?

>Deine Multiplexer Variante ist sicherlich eleganter und Kostengünstiger.
>Aber ich wollte es erstmal mit 4 quad Op's machen.

Aber dann hast du den Verstaerker mit den ganzen Widerstaenden 4 mal
und dann 4 mal abgleich der Schaltung. Bei meiner Schaltung kannst du 
auch einen 8-fach Multiplexer nehmen und hast 8 Kanaele. Wenn du jetzt 
meine Variante mit den Festwiderstaenden nimmst brauchst du 2 Kanaele 
fue rfuer die Festwiderstaende und hast 6 Kanaele fuer die Messung. 
Vorteil du brauchst nur 2 genaue Festwiderstaende an hand deren die 
anderen Kanaele softwaremaessig kalibriert werden. Also keine Potis in 
der Schaltung.


>Der ATMega8 hat 6 ADC Kanäle wenn ich an 4 davon 4 Verstärkte PT100
>Spannungen lege müsste ich doch in der Lage sein auch ohne multiplexer
>auszukommen.

Schon aber der Aufwand ist hoeher. Siehe oben.

>Ich bin Softwareentwickler also sollte der Assembler / C Teil für mich
>kein Problem darstellen.

 Das ist auch immer der Teil der die geringsten Probleme macht.

>Stellt sich die Frage welches 4 Zeiliges Display für die anzeige
>verwenden.

Da kannst du wohl jedes gaengige Display verwenden. Die sind fast alle 
gleich.

>Und kann ich über den ATMega8 dieses ansteuern
Das sollte wohl moeglich sein. Haben viele andere auch hinbekommen.
Koennte die da auch Code fuer geben.

Schaltung anbei.

Gruss Helmi

von thermo (Gast)


Lesenswert?

Ok, Helmi hasst mich überzeugt !

Werde dein Board so wie es ist nachbauen !
Was muss ich an deiner Schaltung anpassen damit der Messbereich für die 
4 PT100 Wiederstände für -200°C bis +50°C ausgelegt wird ?

Gruß

von Helmut L. (helmi1)


Lesenswert?

Mit automatischer Kalibration oder ueber Poti kalibrieren ?

von thermo (Gast)


Lesenswert?

OK, hab deine Beschreibung nochmal genauer durchgelesen.
Die zwei anderen Kanäle kalibrieren sich anhand von zwei 
Festwiederständen.

-200C entspricht 18,49 Ohm
+50°C entspricht 119,40 Ohm

Demzufolge müsste ich sowieso um die Werte einzustellen Potis verwenden 
da es keine Festwiederstände mit diesen werten gibt :)

von Gasst (Gast)


Lesenswert?

Nimm einfach Festwiderstände und als Softwareprofi sollte es für Dich 
kein Problem sein, die Meßwerte auf °C entsprechend genau umzurechnen.

von Klaus (Gast)


Lesenswert?

@thermo
Potis haben eine "Schleifbahn". Die ist niemals ganz exakt.
Möglicherweise bei Verwendung von 10-Gang-(Spindel-) Poti lässt sich das 
hinreichend genau einstellen.
Aber Du brauchst ein exaktes Multimeter mit mind. 4 1/2 Stellen 
Genauigkeit im 200 Ohm Messbereich.
Beachte: Nicht nur der Anzeigeumfang des Ohmmeters, sondern die 
WIRKLICHE spezifizierte Genauigkeit muss stimmen. Und das Gerät muss neu 
sein, oder gültig kalibriert.
Wer hat sowas schon?

Alternative:
===========
Festwiderstände   ( ja, nur mit einfachem "i" ):
Hast Du schonmal was von Reihen- oder Parallelschaltung gehört ?

119,40 Ohm
Aus einem Vorrat von 120 Ohm Werten, mit 1% Toleranz, da findet sich 
bestimmt ein "passender". Allerdings wieder das Problem des 
Herausmessens mit exaktem Ohmmeter...
Wert kann theoretisch exakt erreicht werden durch Parallelschalten eines 
24 kOhm zum 120 Ohm.
Wenn der 120 Ohm ein hochgenauer Messwiderstand ist (z.B. 0,01%), so 
wird durch einen 1% Wert des 24k das Ergebnis trotzdem im 0,01% 
Genauigkeitsbereich liegen.
Nachteil ist: Messwiderstände mit 0,01% sind leider recht teuer.

18,49 Ohm
Kann sinngemäß ebenso zusammengesetzt werden.
Wichtig wäre wiederum ein hochgenauer Grundwert, möglichst exakt am 
Wunschwert.
Z.B. zwei 10 Ohm Messwiderstände (0,01%), in Reihe, gibt 20 Ohm.
Dazu fehlt jetzt die Parallelschaltung eines 245 Ohm (rechnerisch 
ermittelt).
Wenn sowieso die obigen 120 Ohm als hochgenaue Werte vorrätig sind, 
bietet sich an, zwei davon in Reihe, also 240 Ohm, ergänzt um einen 4,99 
oder 5,11 aus der E96 Reihe.

Ob allerdings deine restliche Schaltung die hiermit erzielte Genauigkeit 
hergibt, kann ich nicht beurteilen.

von thermo (Gast)


Lesenswert?

Ich bin zwar kein Elektroniker aber Reihen oder Parallelschaltung ist 
mir bekannt :)

Die 119,4 Ohm sollten denke ich mit etwas Auswahl der 1% 
Metallschichtwiderstände leicht ausgepickt werden können mit 
entsprechendem DMM.

R2 = 18,49 Ohm / (1 - 18,49/R1)

Hab auf die schnelle etwas C-Code geschrieben um zu ermitteln welche 
Widerstandskombination bis 100 Ohm rein rechnerisch am besten passen 
müsste.

Hier der Source :
1
#include "stdafx.h"
2
#include <math.h>
3
4
const int widcount = 23;
5
6
float rg = 18.49f;
7
float r1[]={20.0f,
8
      22.0f,
9
      23.2f,
10
      24.0f,
11
      24.9f,
12
      27.0f,
13
      30.0f,
14
      33.0f,
15
      36.0f,
16
      39.0f,
17
      43.0f,
18
      47.0f,
19
      51.0f,
20
      51.1f,
21
      56.0f,
22
      62.0f,
23
      68.0f,
24
      68.1f,
25
      75.0f,
26
      82.0f,
27
      90.9f,
28
      91.0f,
29
      100.0f};
30
31
32
int findeoptimalenR2(float r2)
33
{
34
  float difopt = 0.0f;
35
  int opt = 0;
36
37
  for(int n=0;n<widcount;n++)
38
  {
39
    if(difopt == 0.0f)
40
      difopt = (float) fabs(r2 - r1[n]);  
41
    else
42
    {
43
      if(fabs(r2 - r1[n]) < difopt)
44
      {
45
        difopt = (float) fabs(r2 - r1[n]);  
46
        opt = n;
47
      }
48
    }
49
  }
50
51
  return opt;
52
}
53
54
int main(int argc, char* argv[])
55
{
56
  float r2 = 0;
57
58
  printf("R1        R2        Ropt      (r2-Ropt)        RGes=18,49 Ohm\n");
59
  printf("-------------------------------------------------------------\n");
60
    
61
  for(int i=0;i<widcount;i++)
62
    {
63
    r2 = rg / (1 - (rg/r1[i]));
64
65
    int opt = findeoptimalenR2(r2);
66
    printf("%7.3f   %7.3f   %7.3f   %7.3f\n",r1[i],r2,r1[opt],(float) fabs(r2 - r1[opt]));
67
  }
68
69
  return 0;
70
}

von thermo (Gast)


Lesenswert?

Hab mir die verfügbaren Metallschicht-Widerstände (1%) bis 100 Ohm bei 
rs-online ausgepickt und darauf ist der surcecode entstanden.

Als Ergebnis bekommt man eine Tabelle mit den einzelnen verfübaren 
Widerständen für R1 dann den entsprechend idealen Wert für R2 bzw. den 
nächsten optimalen und die diferenz von tatsächlich errechneten und 
verfügbaren R2.

Rein rechnerisch bekommt man mit der Kombination aus R1=91 Ohm und 
R2=23.2 Ohm das nächst beste Ergebnis um auf den Wert von 18.49 Ohm zu 
kommen.

von Helmut L. (helmi1)


Lesenswert?

@thermo

Du brauchst die Widerstaende gar nicht  exakt bei -200Grad (18.49) und 
50 Grad einzustellen.  Es gehen auch die naechsten glatten Normwerte. 
Z.B. 20 Ohm und 120 Ohm.  Die Temperaturen die denen entsprechen kennst 
du und damit kannst du den Rest kalibrieren.   Die must doch nur 2 
Punkte kennen und damit kannst du deine lineare Funktion doch bestimmem. 
Die Werte sollten nur moeglichst am Anfang und am Ende deines 
Messbereiches liegen.
Von daher brauchst du dir keine krummen Werte zusammenzuschalten. Dem 
Prozessor ist es ziemlich egal mit welchen Werten er rechnen muss.

Gruss Helmi

von thermo (Gast)


Lesenswert?

Trotzdem hier der Sourcecode für das Reichelt Sortiment bis 1KOhm 
Metalschicht 1%

// parallel.cpp : Definiert den Einsprungpunkt für die 
Konsolenanwendung.
//

#include "stdafx.h"
#include <math.h>

const int widcount_reichelt = 151;

float r1_reichelt[]={19.1f,
          20.0f,
          21.0f,
          22.0f,
          22.1f,
          24.0f,
          24.9f,
          25.5f,
          26.1f,
          27.0f,
          27.4f,
          30.0f,
          30.1f,
          33.0f,
          33.2f,
          34.8f,
          36.0f,
          36.5f,
          38.3f,
          39.0f,
          39.2f,
          40.2f,
          43.0f,
          46.4f,
          47.0f,
          47.5f,
          49.9f,
          51.0f,
          51.1f,
          52.3f,
          56.0f,
          56.2f,
          59.0f,
          60.4f,
          61.9f,
          62.0f,
          63.4f,
          66.5f,
          68.0f,
          68.1f,
          69.8f,
          71.5f,
          75.0f,
          80.6f,
          82.0f,
          82.5f,
          84.5f,
          86.6f,
          88.7f,
          90.9f,
          91.0f,
          93.1f,
          95.3f,
          97.6f,
          100.0f,
          102.0f,
          105.0f,
          110.0f,
          113.0f,
          115.0f,
          120.0f,
          121.0f,
          124.0f,
          127.0f,
          130.0f,
          133.0f,
          137.0f,
          140.0f,
          150.0f,
          154.0f,
          158.0f,
          160.0f,
          169.0f,
          174.0f,
          180.0f,
          182.0f,
          196.0f,
          200.0f,
          210.0f,
          215.0f,
          220.0f,
          221.0f,
          232.0f,
          237.0f,
          240.0f,
          243.0f,
          249.0f,
          255.0f,
          261.0f,
          270.0f,
          274.0f,
          280.0f,
          294.0f,
          300.0f,
          301.0f,
          316.0f,
          324.0f,
          330.0f,
          332.0f,
          340.0f,
          348.0f,
          357.0f,
          360.0f,
          365.0f,
          374.0f,
          383.0f,
          390.0f,
          392.0f,
          402.0f,
          412.0f,
          422.0f,
          430.0f,
          432.0f,
          442.0f,
          453.0f,
          464.0f,
          470.0f,
          475.0f,
          487.0f,
          499.0f,
          510.0f,
          511.0f,
          523.0f,
          536.0f,
          549.0f,
          560.0f,
          562.0f,
          590.0f,
          604.0f,
          619.0f,
          620.0f,
          634.0f,
          649.0f,
          665.0f,
          680.0f,
          681.0f,
          698.0f,
          715.0f,
          732.0f,
          750.0f,
          787.0f,
          806.0f,
          820.0f,
          825.0f,
          845.0f,
          866.0f,
          887.0f,
          909.0f,
          910.0f,
          953.0f,
          976.0f};


int findeoptimalenR2(float* r1,float r2,const int anzahl)
{
  float difopt = -1;
  int opt = 0;

  for(int n=0;n<anzahl;n++)
  {
    float dif = (float) fabs(r2 - r1[n]);

    if(difopt == -1)
      difopt = dif;
    else
    {
      if(dif < difopt)
      {
        difopt = dif;
        opt = n;
      }
    }
  }

  return opt;
}

void rechne_tabelle(float rg,float* r1,const int anzahl)
{
  float r2 = 0;
  float optdif = -1;
  float bestr1 = 0;
  float bestr2 = 0;


  printf("R1          R2           Ropt        (r2-Ropt) 
RGes=%7.3f Ohm\n",rg);
  printf("---------------------------------------------------------------- 
------\n");

  for(int i=0;i<anzahl;i++)
    {
    if(rg < r1[i])
    {
      r2 = rg / (1 - (rg/r1[i]));

      int opt = findeoptimalenR2(r1,r2,anzahl);

      float dif = (float) fabs(r2 - r1[opt]);

      printf("%9.3f   %9.3f   %9.3f   %9.3f\n",r1[i],r2,r1[opt],dif);

      if(optdif == -1)
        optdif = dif;
      else
      {
        if(dif < optdif)
        {
          optdif = dif;
          bestr1 = r1[i];
          bestr2 = r1[opt];
        }
      }
    }
  }

  printf("\n\n beste kombination r1=%9.3f || r2=%9.3f\n",bestr1,bestr2);

}

int main(int argc, char* argv[])
{
  rechne_tabelle(18.49f,r1_reichelt,widcount_reichelt);

  printf("\n\n");

  rechne_tabelle(119.4f,r1_reichelt,widcount_reichelt);

  return 0;
}

von thermo (Gast)


Lesenswert?

beste Werte für 18,49Ohm mit 63,4 Ohm || 26,1 Ohm
und für 119,4 Ohm -> 470 Ohm ||  160 Ohm

von Helmut L. (helmi1)


Lesenswert?

@thermo

Du machst die das Leben unnoetig kompliziert.
Mach 20 u. 120 Ohm rein. Die dementsprechenden Temperaturen must du 
sowieso in der Software eintragen. Ob du das jetzt -200 und 50 
eintraegst oder -19xx und 5x  eintraegst ist der CPU egal. Fue rdie CPU 
gibt es keine schoenen Zahlen.

Gruss Helmi

von thermo (Gast)


Lesenswert?

OK!

120 & 20 !

Gruß

von thermo (Gast)


Lesenswert?

So,

hab nun nach Helmis Vorschlag eine Schaltung mit einem OPA4340 
aufgebaut.
Kontsantstromquelle über den ersten OP und dann einen 
Differenzverstärker dahinter.

Als Spannungs-Referenz füt die Konstantstromquelle habe ich einen 
REF5050 von TI eingesetzt. Liefert konstant 5.02V laut meinem 
Multimeter.

Funktioniert auch alles Prima ! Die gemässene Spannung am Ausgang 
entspricht
relativ genau der erforderlichen Spannung in Bezug auf die Temperatur.

Mein nächstes Problem liegt darin das ich zwei externe SPI Devices an 
den ATMega16 anschliessen muss.

Einen externen 12Bit ADC + das Siemens S65 Display.

Wie geht man da am besten vor ?

Das Display soll unter anderem die Temperatur von vier PT100 Sensoren 
anzeigen die über multiplexer geschaltet werden.

Der Ablauf sollte wie folgt sein :

- Multiplexer auf PT100-1 schalten.
- ADC initialisieren.
- Wert digitalisieren
- ADC deaktivieren
- Digitalisierten Wert auf Temperatur umrechnen
- Wert auf dem Display anzeigen.

Die oben aufgeführten Schritte für die anderen drei PT100 Widerstände 
wiederholen.

Wie am besten beide SPI Interfaces ansteuern ?

Gruß

von Helmut L. (helmi1)


Lesenswert?

>Wie geht man da am besten vor ?

>Das Display soll unter anderem die Temperatur von vier PT100 Sensoren
>anzeigen die über multiplexer geschaltet werden.

>Der Ablauf sollte wie folgt sein :

>- Multiplexer auf PT100-1 schalten.
>- ADC initialisieren.
>- Wert digitalisieren
>- ADC deaktivieren
>- Digitalisierten Wert auf Temperatur umrechnen
>- Wert auf dem Display anzeigen.


Sollte schon so funktionieren.

Wobei man das vielleicht noch etwas anders machen kann.
Am besten schaltest du den MUX direkt nach der AD-Wandlung schon um.
Dann hat die Schaltung Zeit sich einzuschwingen waehrend du den Wert 
umrechnen kannst und zur Anzeige bringst. So hast du etwas schnellere 
Messzyklen. Aber wenn du Zeit hast geht das auch so. Aber wie gesagt 
nach dem Umschalten des MUX etwas warten damit die Schaltung sich 
einschwingen kann.

Gruss Helmi

von thermo (Gast)


Lesenswert?

Danke Helmi für den Vorschlag , hört sich logisch an.

Als Multiplexer habe ich die ADG709BRUZ im Auge.
Haben 14nS Umschaltzeit und einen relativ geringen Wiederstand von 3 
Ohm.

Mall sehen wie Weit ich komme.

von Helmut L. (helmi1)


Lesenswert?

>Haben 14nS Umschaltzeit und einen relativ geringen Wiederstand von 3
>Ohm.

Es ist nicht nur die Umschaltzeit des MUX sondern auch die 
einschwingzeit der OPs mit ihren Kapazitaeten usw.

Rechne mal mit mS Umschaltzeit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.