Forum: Mikrocontroller und Digitale Elektronik Auswertung des MAX6675 Temperaturkonverter-IC


von Ralf (Gast)


Lesenswert?

Hallo

Ich habe da ein Problem...
Für eine Temperaturmessung mit einem Type-K Thermofühler nutze ich den 
MAX6675 um den analogen Spannungswert des Temperaturfühlers zu 
digitalisieren.

Das Datenblatt:
http://datasheets.maxim-ic.com/en/ds/MAX6675.pdf
Der MAX6675 liefert einen 12-Bit Wert.


Da ich leider kein Temperaturmessgerät hier habe um die ausgegebenen 
Werte des ICs zu prüfen würde mich interessieren, welcher Temperaturwert 
der ausgegebene Bitwert repräsentiert.

Ein Beispiel:
Mein MAX6675 liefert (bei Raumtemperatur gerade) den Wert: 0x308
In binär also: 1100001000
Wenn ich nach dem Datenblatt die untersten Bits ausblende erhalte ich
11000010 = 0x0C2 = 194 (dezimal).

Heist das also, dass ich nun eine Temperatur von 19,4°C habe oder muss 
ich das noch weiter umrechnen?

von Udo (Gast)


Lesenswert?

Hi,

wie hast Du denn die Werte ausgelesen? Auch wenn
der Wertebereich 12Bit ist, sendet der Wandler
16Bit über den SPI. D.h. man muss so vorgehen:

1. 16Bit einlesen.
2. Wert um 3 Bit nach rechts schieben == 12Bit Ergebnis.
3. Die niedrigsten 2 Bit stellen dann 1/4 Grad dar.
   - 00 == .0
   - 01 == .25
   - 10 == .50
   - 11 == .75
4. Das 12Bit Ergebnis um 2 Bit nach rechts schieben
   ist die Temperatur in Grad.
5. 3. + 4. ist das Endergebnis.

Funktioniert bei mir jedenfalls bestens.

Ciao
   Udo

von Ralf (Gast)


Lesenswert?

Hi!


Mmm dann mach ich das mal kurz beispielhaft an meiner gemessenen 
Temperatur von 0x308  (das ist der unveränderte 16 Bit bzw. 12 Bit 
Hex-Wert den der MAX mir gesendet hat).

Also...

1. 0x0308 = 0000001100001000
2. Wert um 3 Bits nach rechts: 0000001100001
   Wird zu 12 Bit wenn MSB als Dummy wegfällt: 000001100001
3. Niedrigste 2 Bit: 01 => .25°C
4. Nochmal um 2 Bit nach rechts: 0000011000 = 24°C
5. Vereinigen: 24.25°C

Das hört sich auch sehr plausibel an. Außer Schritt 3 kann ich alles im 
Datenblatt finden.

von Ralf (Gast)


Lesenswert?

Oh

Das dicke fette Danke habe ich noch vergessen! :-)

von Ralf (Gast)


Lesenswert?

So ich hab das jetzt mal in C umgesetzt und die Temperaturen auf 
"Glaubwürdigkeit" überprüft. Dazu habe ich noch einen zweiten 
Temperaturmesser (ebenfalls mit Type-K Fühler) aufgetrieben.

Nun stelle ich aber fest, dass es da doch eine ziemliche Abweichung in 
den Temperaturen gibt.

Mein Temperaturmesser (Referenzgerät) zeigt mir 22-23°C an, mein MAX6675 
rechnet 26°C aus. 4° Temperaturdifferenz ist nicht gerade sonderlich 
präzise. Zwar messe ich später bei weitaus höheren Temperaturen (bis 
300°C) aber für mich stellt sich gerade eher die Frage ob nicht irgendwo 
ein Fehler im Messaufbau liegt.


Ich habe nämlich den Anschluss des Type-K Steckers umgebaut.
Ich habe die Enden der Messleitung an einen Audiostecker gelötet. Der 
wird in die entsprechende Buchse gesteckt und keine 2mm neben der Buchse 
sitzt schon der MAX6675.

Ist es denn überhaupts okay einfach die Enden des Type-K Steckers an 
(ich glaube Aluminium) zu löten?

von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

Hmm im Datenblatt steht auch

"Bit D2 is normally low and
goes high when the thermocouple input is open."


Das ist bei mir jedoch nicht der Fall. Wenn ich das Thermoelement 
entferne ist D2 weiterhin auf low...?

Ich schau mir das gerade am Logic Analyzer an, also an falschem C Code 
kann es nicht liegen. Habe mal 2 Bildchen im Anhang, damit ihr euch auch 
davon ein Bild machen könnt.


Da läuft doch ganz offensichtlich etwas falsch oder täusche ich mich da?

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Hi,

im Datenblatt steht auch, dass die "thermocouple input is open" 
Erkennung nur geht, wenn Du T- mit GND verbunden hast.
Hast Du daran gedacht ?

Frank

von Ralf (Gast)


Lesenswert?

Oh!

Stimmt, direkt ein Absatz darunter...naja..wer lesen kann... ;)

Nein, bei mir gehen T- und T+ des Sensors direkt auf T- und T+ des MAX, 
ohne weitere Verbindungen.

Macht es (bis auf die Erkennung des nicht angeschlossenen Sensors) Sinn 
oder bringt es Vorteile T- mit GND zu verbinden? Zur Not könnte ich da 
noch was machen.

Ich kenne mich mit solchen Temperaturfühlern leider nicht so gut aus.

von Michael (Gast)


Lesenswert?

Hallo Bastlerfreunde,

ich habe auch ein Problem mit dem Max6675. Ich kann zwar bits auslesen 
und die temperatur ist auch richtig, aber der max6675 bleibt dann 
hängen. er gibt immer den ersten gemessenen aus und ändert danach die 
Temperatur nicht: einmal 24°C - immer 24°C. Man muss ihn irgendwie 
resetten, damit eine neue Messung beginnt. Und da weiß ich nicht, wie es 
gehen soll.

Laut Datenblatt, muss man CS auf low ziehen um mit einer Messung zu 
beginnen. Ich habe das so verstenden, dass man das so macht:

1: clock ist low und cs ist high
2: cs low setzen => aktiviert den Max6675
3: clocksignal draufgeben und bits auslesen (ich nehme nur die ersten 
13Bit
   und breche danach
   wieder ab (erstes bit ist dummybit und immer 0, danach folgen 12 bit 
zur
   temperaturerfassung, die restlichen 3 bit werden zur erfassung nicht
   gebraucht)
4: zum beenden der messung cs wieder auf high

5: neue messung => cs wieder auf low und weiter 1:

leider funktioniert das nicht. ich muss die ganze versorgungsspannung 
des Max trennen und wieder neu anlegen um eine neue Messung 
durchzuführen.
Aber eigentlich sollte die  Temperatur ja kontinuierlich ausgegeben 
werden ohne jedesmal neu zu resetten...
Hat jemand eine Ahnung woran es liegen könnte, dass der Max nicht 
resettet??? jedesmal die versorgung zu kappen ist nicht grad der hit.

Andere Fragen:
//////////////////////////////////////////////////////////////////////// 
///
2)
wenn man den cs-pegel nicht wieder auf high bringt(abschaltet), sondern 
einfach weiterlaufen lässt, kommt dann die temperatur kontinuierlich? 
also immer 16 bit aneinandergehängt? oder muss man zwischendurch  aus- 
und wieder einschalten?

//////////////////////////////////////////////////////////////////////// 
///
3)
mit wlecher mindestfrequenz muss man sein clocksignal reinschicken?
ich habe nämlcih bemerkt, dass bei einer zu niedrigen frequenz die 
temperatur zwischen 3 verschiedenen werten springt (8°C; 24°C; 36°C). 
meine messung hatte dabei 1,2sec gedauert. eine erklärung dafür könnte 
sein, dass der Max6675 in den ersten 0,6sec auch die ersten 6 bits der 
aktuellen temperatur ausgibt aber sich dann während der messung die 
temperatur um ein halbes grad ändert. dadurch ändern sich auch die 
letzten 6 bits die während den zweiten 0,6sec.
Beispiel zum temperatursprung ( 13 bit):
24°C   = 00000011 00000
23,5°C = 00000010 11110
Die ersten 8 bit der aktuell herrschenden 24°C werden eingelesen. jetzt 
ändert sich die temperatur aber auf 23,5°C (leerzeichen zur 
verdeutlichung) und es werden dementsprechend die letzten 5 bit 
ausgegeben.
ALs ergebnis bekommt man also folgende bitfolge, wenn sich während einer 
messung die temperatur ändert:

0000001111110 = 31,5°C

Kann es also sein, dass wegen einem zu langem messvorgang (zu niedrige 
clockfrequenz) zu diesen Temperatursprüngen kommt? Oder liegt das an was 
anderem? Ändert der Max6675 überhaupt die bitfolge während einer 
messung, oder speichert er eine bitfolge ab und sendet diese dann, bevor 
er wieder eine neue bitfolge generiert? letzteres denke ich nicht, da im 
datenblatt keine speicher angedeutet sind. es ist zwar ein "Digital 
controller" drin, aber ich denke, dass der nur die bitfolge generiert 
und nichts speichert. es müsste demnach eine mindestfrequenz geben, mit 
der man ds clocksignal schicken muss, damit es nicht zu solchen 
temperatursprüngen kommt. Oder seht ihr das anders?
//////////////////////////////////////////////////////////////////////// 
///

das war jetzt auf einen schlag recht viel, aber ich komme momentan 
einfach nicht mehr weiter. Ich wäre sehr dankbar, wenn mir da jemand 
weiterhelfen könnte, oder auch nur einen Tipp hat.

Beste Grüße
Michael

von Sven K. (svenk)


Lesenswert?

Hmm,
das Datenblatt hast Du doch gelesen ?
Dort steht folgendes:

##########

Serial Interface
The Typical Application Circuit shows the MAX6675
interfaced with a microcontroller. In this example, the
MAX6675 processes the reading from the thermocouple
and transmits the data through a serial interface.
Force CS low and apply a clock signal at SCK to read
the results at SO. Forcing CS low immediately stops
any conversion process. Initiate a new conversion
process by forcing CS high.
Force CS low to output the first bit on the SO pin. A
complete serial interface read requires 16 clock cycles.
Read the 16 output bits on the falling edge of the clock.
The first bit, D15, is a dummy sign bit and is always
zero. Bits D14–D3 contain the converted temperature in
the order of MSB to LSB. Bit D2 is normally low and
goes high when the thermocouple input is open. D1 is
low to provide a device ID for the MAX6675 and bit D0
is three-state.

##########

So, das bedeutet das man 16 mal ein CLOCK benutzen muss.
Da steht nichts davon nur die ersten 13 mal ein CLOCK auf
die Leitung zu legen.

Ebenso steht da, das man CS low ziehen muss um einen Wert auszulesen.
Dann steht da auch, dass weitere Messungen nicht! durchgeführt werden,
bis CS wieder auf HIGH liegt.

Gruß Sven

von Chris D. (m8nix)


Lesenswert?

@Ralf (Gast)

>Mein Temperaturmesser (Referenzgerät) zeigt mir 22-23°C an, mein MAX6675
>rechnet 26°C aus. 4° Temperaturdifferenz ist nicht gerade sonderlich
>präzise.

>Ich habe nämlich den Anschluss des Type-K Steckers umgebaut.
>Ich habe die Enden der Messleitung an einen Audiostecker gelötet. Der
>wird in die entsprechende Buchse gesteckt und keine 2mm neben der Buchse
>sitzt schon der MAX6675.

>Ist es denn überhaupts okay einfach die Enden des Type-K Steckers an
>(ich glaube Aluminium) zu löten?

Hallo Ralf,

vermutlich hast du die Kompensation der Vergleichsstelle vergessen?
Der Übergang am Ende der Typ-K Messleitung auf ein anderes 
Leitermaterial erzeugt eine weitere Thermospannung, die wiederum selbst 
Temperaturabhängig ist.
Deshalb misst man üblicherweise die Temperatur am Übergang 
(Vergeleichsstelle) und berechnet die dort erzeugte Spannung mit ins 
Messergebnis mit ein. Ist hier sehr gut beschrieben:
http://www.ipetronik.com/pdf/Newsletter/Ipetronik_NL2_2004_d.pdf

Es gibt spezielle Stecker für Thermoelemente:
http://www.omega.de/pdf/specs/np147.pdf
Die sind aus Cu. Dadurch wird ein weiterer Übergang (bei dir Alustecker 
-> Kupferleiterbahn) vermieden.

Gruss Chris

von Michael (Gast)


Lesenswert?

Hallo sven,

vielen Dank für die Antwort. Ich hab das ganze jetzt mal mit einem µC 
durchprobiert (vorher hing der MAX an einer echtzeitkarte am PC) und es 
ist so, dass der MAX zwar 16 bits ausgeben würde, aber wenn man vorher 
(nach dem 13ten bit) CS wieder auf high setzt, wird die messung 
abgebrochen. die bits für die temperatur wurden aber trotzdem gesendet. 
wartet man dann 200msec und stzt CS wieder auf low und gibt ein 
clocksignal drauf, dann gibt beginnt eine neue messung.
Mit dem kontinuierlichen senden hattest du recht, man muss immer wieder 
zwischen high und low bei cs wechseln um bits zu senden und neu zu 
messen. aber es ist nicht nötig alle 16 bit einzulesen. ich habs mir 
jetzt quasi selbst beantwortet, aber gestern war mein hirn einfach schon 
zu belastet :) und ich hatte keinen anderen ausweg gesehen, als mir von 
aussen hilfe zu holen :)
die ganzen fragen sind acuh nur darum aufgekommen, weil meine angezeigte 
temperatur ständig zwischen drei werten (um die 8°C, 24°C, 36°C)hin und 
her gesprungen ist.

wenn ich das hier interpretiere:
"Forcing CS low immediately stops
any conversion process."

... dann heißt das ja, dass eine 16bitfolge generiert wird die irgendwo 
abgespeichert wird und dann ausgegeben wird. es kann also nicht sein, 
dass mein oben gezeigtes beispiel mit dem verändern der bitwerte 
stattfindet.
Von daher muss der fehler wo anders legen.
ist schonmal gut, das beruhigt mich erstmal, weil dann auch die 
clockfrequenz nicht an die Arbeitsfrequenz des ADC angepasst werden muss 
- sehr schön :)

Dann mach ich mal weiter.
Vielen Dank
Grüße
Michael

von gf (Gast)


Lesenswert?

Nur falls hier mal wieder jemand drüber stolpert habe ich ein paar 
Zeilen Code für euch.
1
/**
2
 * initializes the ports and pins for egt measurement
3
 */
4
void egt_init(){
5
  
6
  //clk and cs as output
7
  EGT_REG |= (1 << EGT_REG_CLK) | (1 << EGT_REG_CS);
8
  //pullup for data pin
9
  EGT_PORT &= (1<<EGT_DATA);
10
  //cs high for measure
11
  EGT_PORT |= (1<<EGT_CS);
12
}
13
14
/**
15
 * communciates with max6675 to determine egt
16
 * all delay-calls are because the max6675 does not support timings as fast as the mega 
17
 */
18
uint16_t get_egt(){
19
20
  uint16_t temp=0;
21
  
22
  //cs low for data
23
  EGT_PORT &= ~(1<<EGT_CS); 
24
  _delay_ms(1);
25
26
  //now go through relevant bits and shift them in
27
  for(int i=0; i<10; i++){
28
29
    //clk-toggle for next bit (skips irrelevant msb in first iteration)
30
    EGT_PORT |= (1 << EGT_CLK);
31
    _delay_ms(EGT_DELAY);
32
    EGT_PORT &= ~(1 << EGT_CLK);
33
    _delay_ms(EGT_DELAY);
34
35
    // shift
36
    temp = temp << 1;
37
    
38
    // add pin state (0 or 1)
39
    temp += EGT_PIN & (1<<EGT_DATA_PIN);    
40
  }
41
  
42
  //cs high for measure
43
  EGT_PORT |= (1<<EGT_CS); 
44
45
  return temp;
46
}

Das ist so aber nur auf 1 Grad genau (die letzten Bits werden 
ignoriert).

von Jojo S. (Gast)


Lesenswert?

gf schrieb:
> Nur falls hier mal wieder jemand drüber stolpert habe ich ein paar
> Zeilen Code für euch.

Ich habe auch so einen MAX den ich jetzt auslesen wollte und da googlen 
heute ja schneller geht als selber coden habe ich deine Zeilen mal in 
ein Testprojekt kopiert.
Der Sensort wurde ausgelesen, aber die angezeigten Werte waren viel zu 
gross, genau um den Faktor 2. Fand ich sehr merkwürdig weil der Code ja 
nicht sehr viel macht und plausibel aussieht. Ich habe immer bei der 
Bitschieberei gesucht aber laut Datenblatt ist das auch ok. Dann habe 
ich mir den Code heute nochmal angesehen und die Unschärfe sofort 
entdeckt:
1
    // add pin state (0 or 1)
2
    temp += EGT_PIN & (1<<EGT_DATA_PIN);
lass mich raten: dein EGT_DATA_PIN liegt auf dem Bit 0 eines Ports... 
Meiner lag auf Bit 1 und dann wird natürlich immer eine 2 statt einer 1 
in das Ergebniss geschoben.
Ich werde das heute abend mal durch diese Zeile ersetzen:
1
    temp += ((EGT_PIN >> EGT_DATA_PIN) & 1);
Zu den vielen Konstanten braucht man auch noch die defines, hier ist 
nochwas zum kopieren, Ports und Pins müssen natürlich an die eigene 
Hardware angepasst werden:
1
// MAX6675 sensor
2
3
#define EGT_REG    DDRC
4
#define EGT_PORT  PORTC
5
6
#define EGT_REG_CLK  DDC0
7
#define EGT_CLK    PC0
8
#define EGT_REG_CS  DDC2
9
#define EGT_CS    PC2
10
#define EGT_DATA  PC1
11
#define EGT_PIN    PINC  
12
#define EGT_DATA_PIN  PC1
13
14
#define EGT_DELAY  1

gf, falls zu hier noch mitliest: wofür steht deine Abkürzung EGT_ ? 
External Grill Temperature wird es nicht sein?

von Nils (Gast)


Lesenswert?

Jojo S. schrieb:
> wofür steht deine Abkürzung EGT_ ?

Exhaust Gas Temperatur ;)

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.