Forum: Mikrocontroller und Digitale Elektronik Temperatursensor TMP36 Problem


von extern (Gast)


Lesenswert?

Guten Abend,

ich habe den Temperatursensor TMP36, allerdings kann ich damit nicht die 
richtige Temperatur ermitteln. Ebenfalls benutze ich einen Arduino UNO.

Oftmals bekomme ich die richtige Temperatur raus, aber manchmal kommt es 
auch vor, dass plötzlich extrem hohe Temperaturen ( ca.50 °C) angezeigt 
werden.

Hier noch der Aufbau (zusätzlich habe ich noch einen 0,1µF Kondensator 
zw. 5V und GND):
https://learn.adafruit.com/system/assets/assets/000/000/476/medium800/temperature_tmp36fritz.gif?1447975816

von Pete K. (pete77)


Lesenswert?

extern schrieb:
> Oftmals bekomme ich die richtige Temperatur raus, aber manchmal kommt es
> auch vor, dass plötzlich extrem hohe Temperaturen ( ca.50 °C) angezeigt
> werden.

Glaskugel sagt Softwarefehler.

von Mike J. (linuxmint_user)


Lesenswert?

Es kann sein dass er auf seinem Steckboard oder bei den Leitungen einen 
Wackelkontakt hat.
Es ist aber auch möglich dass er beim ADC etwas falsch macht und die 
ADC-Werte subtrahiert und der Wert dann doppelt so hoch ist.

@ extern (Gast)
Lass dir mal die reinen ADC-Werte ausgeben und schau dann mal wie hoch 
der höhere Wert ist, vermutlich ist er einfach doppelt so hoch, dann 
liegt dein Fehler in der Art wie du deine ADC-Werte sammelst/abfragst.

von extern (Gast)


Lesenswert?

1
float temperatur;
2
float spannung;
3
int analog_wert;
4
5
void setup() {
6
  Serial.begin(9600);
7
}
8
9
void loop() {
10
11
  // Ausgangsspannung von TMP36 bestimmen
12
  analog_wert = analogRead(A0);
13
  Serial.println(analog_wert);
14
  spannung = (analog_wert/1024.0)*5.0;
15
 
16
  // Temperatur in Grad Celsius bestimmen
17
  temperatur = (spannung-0.5)*100;
18
  delay(2000);
19
}

Ich glaube nicht, dass der Fehler an der Software liegt und es auch 
keine Probleme beim analogen einlesen gibt, da die falschen Temperaturen 
immer zufällig auftreten. Könnte vielleicht wirklich am Aufbau mit dem 
Steckbrett liegen.

von extern (Gast)


Lesenswert?

Ich weiß jetzt zumindest wo der Fehler liegt.

Mit dem Multimeter messe ich an dem mittleren Pin eine konstante 
Spannung, die Sinn machen würde. Allerdings zeigt mir mein Programm eine 
falsche Spannung an.
1
int wert;
2
float voltage;
3
4
void setup() {
5
  Serial.begin(9600);
6
}
7
8
void loop() {
9
  wert=analogRead(A0);
10
  Serial.println(wert);
11
  voltage=wert*5.0;
12
  voltage/=1024.0;
13
  Serial.print(voltage); Serial.println(" V");

Das hier müsste doch aber stimmen, habe ich auch von dieser Seite:
https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor

von Mike J. (linuxmint_user)


Lesenswert?

Wie hoch ist denn die Spannung die gemessen wird?
Kommst du bei der Berechnung auf den richtigen analogen Wert?

Hast du den ADC kalibriert?
Dein ADC muss kein 2.56V haben, es können auch 2.4V oder 2.7V sein.
Der Wert der internen Aref ist extrem konstant, aber nicht sehr genau.

Miss bitte die Spannung am Aref-Pin wenn der Controller läuft.

von extern (Gast)


Lesenswert?

Mike J. schrieb:
> Wie hoch ist denn die Spannung die gemessen wird?
> Kommst du bei der Berechnung auf den richtigen analogen Wert?

Mit dem Multimeter messe ich ziemlich genau 0.7V. Mein Arduino 
"berechnet" allerdings fast jedes Mal wenn ich ihn anschließe eine neue 
Spannung, gerade 1.18 V.
Dementsprechend wird auch nicht der richtige analoge Wert eingelesen.

Edit: Nach ungefähr 5 Minuten Betriebszeit kommt er auf eine Spannung 
von 0.72 V.

Mike J. schrieb:
> Hast du den ADC kalibriert?
> Dein ADC muss kein 2.56V haben, es können auch 2.4V oder 2.7V sein.
> Der Wert der internen Aref ist extrem konstant, aber nicht sehr genau.

Nein habe ihn nicht kalibriert, was meinst du damit genau 
beziehungsweise wie geht das?

Mike J. schrieb:
> Miss bitte die Spannung am Aref-Pin wenn der Controller läuft.

Habe im Moment leider kein Multimeter zur Hand. Was müsste der Aref-Pin 
denn anzeigen?

von Mike J. (linuxmint_user)


Lesenswert?

extern schrieb:
> Nein habe ihn nicht kalibriert, was meinst du damit genau
> beziehungsweise wie geht das?
Also den ADC an sich kann man nicht kalibrieren, aber man kann die reale 
ADC-Spannung ermitteln und dann einfach den Messwert mit der echten 
Referenz-Spannung berechnen.

Der Wert von 2,56V (ATmega8) ist nur ein Wert der angestrebt wird, aber 
oft liegt der Wert etwas daneben.
Ich hatte bei einem Chip 2,701V am Aref-Pin gemessen.

> Was müsste der Aref-Pin denn anzeigen?

Bei deinem ADC (ATmega328P) liegt die Referenzspannung aber zwischen 
1.0V und 1.2V, typischer Weise bei 1.1V, aber dieser Wert ist konstant 
und schwankt nicht.

Wenn dein Wert schwankt, dann liegt das an etwas anderes.


Hast du eigentlich die interne Referenz bei deinem Arduino eingestellt 
oder wird der ADC des Arduino immer mit der internen Referenz 
initialisiert?
(ich kenne mich da nicht so aus)

Zum testen kannst du den Pin A0 auch einfach an eine feste Spannung oder 
einem 10kOhm Poti hängen.

extern schrieb:
> Mit dem Multimeter messe ich ziemlich genau 0.7V
Das sind dann also 20°C.

> Habe im Moment leider kein Multimeter zur Hand.
Aha ...

von holla die waldfee (Gast)


Lesenswert?

wie bekommt der Arduino Strom? Batterien, Netztteil?

von extern (Gast)


Lesenswert?

holla die waldfee schrieb:
> wie bekommt der Arduino Strom? Batterien, Netztteil?

über USB vom PC

Mike J. schrieb:
> Bei deinem ADC (ATmega328P) liegt die Referenzspannung aber zwischen
> 1.0V und 1.2V, typischer Weise bei 1.1V, aber dieser Wert ist konstant
> und schwankt nicht.
>
> Wenn dein Wert schwankt, dann liegt das an etwas anderes.

Ich habe nun nachgemessen. Zwischen Aref und GND messe ich konstant 
5.032 V.

Mike J. schrieb:
> Hast du eigentlich die interne Referenz bei deinem Arduino eingestellt
> oder wird der ADC des Arduino immer mit der internen Referenz
> initialisiert?

Ich habe nicht eigestellt. Ich verstehe aber auch nicht was es mit der 
Referenzspannung überhaupt auf sich hat und weshalb das Problem dadurch 
auftreten soll.

von Mike J. (linuxmint_user)


Lesenswert?

extern schrieb:
> Ich habe nicht eigestellt. Ich verstehe aber auch nicht was es mit der
> Referenzspannung überhaupt auf sich hat und weshalb das Problem dadurch
> auftreten soll.

Ja, wie gesagt und ich habe keine Ahnung von dem Arduino-Zeugs, also 
taste ich mich langsam ran.

Also scheinbar wurde die Versorgungsspannung von 5V als Referenz 
gewählt.
Ich denke mal nicht dass das Problem dadurch auftritt da du ja fertige 
Codeteile nutzt von denen man davon ausgehen kann dass sie 
funktionieren.

Vielleicht gibt es einen kleinen Wackelkontakt zwischen deiner TMP36 
Platine und dem Arduino-Board.
Vielleicht einfach mal die Kabel tauschen, möglicher Weise hat eins 
einen Wackelkontakt.

Ich würde 100nF zwischen Vcc und GND vom TMP36 schalten und vielleicht 
noch 100nF an den Ausgang.

von extern (Gast)


Lesenswert?

es scheint nun so, als würden die krassen Schwankungen nicht mehr 
auftreten. Aber nun ist der gemessene Wert mit dem Arduino ungefähr 
0.02V niedriger als mir das Multimeter anzeigt. Muss ich mich mit dieser 
Genauigkeit zufrieden geben?

von Mike J. (linuxmint_user)


Lesenswert?

extern schrieb:
> Muss ich mich mit dieser Genauigkeit zufrieden geben?

Nein, das kann man per Software kompensieren indem du den analogen Wert 
korrigierst.
1
  wert=analogRead(A0);
2
  Serial.println(wert);
3
  voltage=wert*5.032; // Referenz-Spannungskorrektur
4
  voltage/=1024.0;
5
  voltage-=20; // 20mV = 2°C subtrahieren
6
  Serial.print(voltage); Serial.println(" V");

von extern (Gast)


Lesenswert?

Ich bin aber echt nicht zufrieden damit :D

Die Werte liegen jetzt 0.04V auseinander und das macht sich bei der 
angezeigten Temperatur natürlich bemerkbar.
1
 analog_wert = analogRead(A0);
2
  Serial.println(analog_wert);
3
  spannung = analog_wert*(5/1023.0);
4
  Serial.println(spannung);

hier nochmal der Code zum einlesen, ich habe den noch etwas verändert. 
Bei der Berechnung der Spannung muss durch 1023 geteilt werden, da dies 
der maximale Wert ist.

von extern (Gast)


Lesenswert?

Das habe ich mir auch schon überlegt, allerdings sind die Werte nicht 
immer diesselben. Die Referenzspannung liegt jetzt bei 5.013V und und 
auch die Spannung am analogenInput stimmt manchmal mit dem "richtigen" 
Wert überein und manchmal liegt sie sogar 0.04V darunter

von Mike J. (linuxmint_user)


Lesenswert?

extern schrieb:
> allerdings sind die Werte nicht immer die selben.

Ja, so ist das wenn man die Versorgungsspannung als Referenz nimmt.

Kannst ja die interne Referenz einschalten, dann hast du einen sehr 
stabilen Wert als Referenz.
analogReference(INTERNAL1V1);

Du musst einen Kondensator so nahe wie möglich mit dem Ref_Pin 
verbinden, also am besten direkt auf dem Arduino-Board und nicht extern 
auf einem Steckbrett.

Dann einfach mit einem Multimeter den Wert messen und eintragen.
1
  float vref = 1.1;
2
  spannung=analog_wert*vref; // Referenz-Spannungskorrektur
3
  spannung/=1024.0;

Ich arbeite wenn es geht ohne float-Werte.
Man kann ja auch mit mV rechnen.

So in der Art, dann steht der Wert eben ohne Komma da.
1
  uint16_t spannung = 0; // in mV
2
  uint16_t vref = 1100; // in mV
3
  spannung=((uint32_t)analog_wert*vref)/1024;

von Pete K. (pete77)


Lesenswert?

Vielleicht ist es ein Fake Arduino mit Problemen beim ADC? Schon mal 
einen anderen Controller probiert?

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.