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?
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
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.
Oh Das dicke fette Danke habe ich noch vergessen! :-)
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?
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?
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
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.
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
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
@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
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
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).
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.