Hallo Gemenide
Zum auslesen der Daten aus einem MCP3421 nutze ich diesen Code:
1
i2c_start(MCP_r);
2
i2c_readAck();
3
for(i=0;i<3;i++)
4
{
5
data[i]=i2c_readAck();
6
}
7
i2c_readNak();
8
i2c_stop();
Die Daten des 2. Byte stehen dann im data[0], die Daten des 3. Byte
stehen dann im data[1] und die Daten des 3. Byte stehen dann im data[2].
Diese werdn mit
1
data_com=(data[0]*10000)+(data[1]*100)+data[2];
addiert. Sample und PGA stelle ich vorher auf 1c (PGA=1/Sample=18)
Danach lasse ich mir die Werte anzeigen mit:
1
itoa(data[0],Buffer,10);// Variable umwandeln...
2
lcd_printlc(1,2,Buffer);// ...und anzeigen
3
4
itoa(data[1],Buffer,10);// Variable umwandeln...
5
lcd_printlc(2,2,Buffer);// ...und anzeigen
6
7
itoa(data[2],Buffer,10);// Variable umwandeln...
8
lcd_printlc(3,2,Buffer);// ...und anzeigen
9
10
itoa(data_com,Buffer,10);// Variable umwandeln...
11
lcd_printlc(4,2,Buffer);// ...und anzeigen
Als Ergenis bekomme ich angezeigt:
(data[0]) 0 (ändert sich nicht)
(data[1]) 5 (ändert sich schnell)
(data[2]) 28 (ändert sich gar nicht)
(data_com) 528 (änderung gesamt)
da sich data[1] und data_com schnell ändern reagiert der Temp Fühler
drauf.
Wieso ändert sich data[2] mit 28 gar nicht?
Du bist um 1 Byte verschoben.
Das Byte das die obersten 2 bits des 18-bit Wertes enthält, schmeisst du
quasi weg (i2c_readAck vor dem "for").
Die 28 sind das Configuration Register.
wenn dann data(0)*65536 + data(1)*256 + data(2)
maximal (im positiven Bereich) und binär solltest du %011111111111111111
= 131072 messen können was dann 131072*0.000015625V=2.048V sind
Sorry, mal langsam.
Joe F. schrieb:> Du bist um 1 Byte verschoben.> Das Byte das die obersten 2 bits des 18-bit Wertes enthält, schmeisst du> quasi weg (i2c_readAck vor dem "for").> Die 28 sind das Configuration Register.
Das ist eine Erklärung für die Anzeige. ok. Wie kommt das und ich das
besser machen?
Suchender schrieb:> Wie kommt das und ich das> besser machen?
Indem du den Unterschied zwischen deinem und dem von mir geposteten Code
anguckst... und das erste i2c_readAck() weglässt... ;-)
Mein Code hat allerdings noch ein Fehler, man muss das Vorzeichen noch
auf 32-bit erweitern, also so:
Habe das
Suchender schrieb:> i2c_start(MCP_r);> i2c_readAck();> for (i=0; i<3; i++)
i2C_readACK rausgenommen
Joe F. schrieb:> value = (data[0] << 16) | (data[1] << 8) | data[2];
und das eingetragen. Damit bekomme ich eine andere Anzeige als erwartet.
Für data(0) und data(1) wird jetzt 0 angezeigt. Es ändert sich nur
data(2)
Suchender schrieb:> Für data(0) und data(1) wird jetzt 0 angezeigt. Es ändert sich nur> data(2)
Ja, weil dein Eingangssignal offenbar sehr schwach ist.
Habe einen Fehler gefunden. Der Temperaturbereich meiner Hand ist
relativ klein. Dadurch erfolgen nur kleine Änderungen. Lege ich den
Sensor an einen Lötkolben erfolgt ein weit aus grösserer Ausschlag.
Nach Angabe des Herstellers im Datenblatt, kann man den Pin6 (Vin-) auf
GND legen. Das habe ich gemacht.
Mit der Einstellung von PGA=1 sind die Änderungen sehr klein. Bie PGA=8
sieht man das schon besser.
Was noch fehlt ist die Berechnung der Temperatur. Habe das gefunden bzw.
berechnet:
2.047V/131071= 0.000015625V (131071 <-> 17Bit)
Die kleinste mögliche Spannung, die der MCP3421A messen kann, bei einem
Gain* von 1V/V ist somit 15,625uV. Da das Thermoelement 40uV/C liefert,
kann eine Temperaturauflösung von 0.39C erreicht werden.
0.015625mV/0.04mV=0.39 Grad
Das sind die Angaben im Datenblatt mit Berechnung. Wie kann man das
Darstellen?
Suchender schrieb:> Nach Angabe des Herstellers im Datenblatt, kann man den Pin6 (Vin-) auf> GND legen. Das habe ich gemacht.
Damit kannst du aber nur Temperaturen messen, die größer als die
Temperatur am Referenzpunkt sind.
Bei kleineren Temperaturen entsteht eine negative Spannung, die du dann
nicht mehr messen kannst.
Wenn dir das reicht, okay, wenn nicht, musst du dir was überlegen, wie
du eine passende Referenzspannung erzeugst (Vref/2/PGA).
Suchender schrieb:> Wie kann man das> Darstellen?
Referenztemperatur muss bekannt sein, und der Rest ist ein Dreisatz.
Nach den Angaben im Datenblatt kann man doch den Pin6 (Vin-) auf GND
legen. Danach müsste doch ein Punkt des Thermolementes GND bezogen sein.
Wenn die Temp am Sensor eine Spannung von 40 uV je Grad erzeugt, müsste
doch anliegende Spannung unter berücksichtigung von PGA die
Raumtemperatur abbilden. Mit steigender Temp, z.B. durch anlegen eines
Fingers, ändert sich die Spannung und damit die Temperatur.
Habe ich einen Denkfehler dabei?
Suchender schrieb:> Mit steigender Temp, z.B. durch anlegen eines> Fingers, ändert sich die Spannung und damit die Temperatur.> Habe ich einen Denkfehler dabei?
Soweit erstmal kein Denkfehler. Das Thermoelement erzeugt die Spannung
aber immer aufgrund der Temperaturdifferenz zwischen dem Messpunkt und
einem (thermischen) Referenzpunkt. Wenn beide auf Raumtemperatur sind,
kommt 0V raus.
Wenn du den Messpunkt mit dem Finger erwärmst, kommt eine positive
Spannung raus. Wenn du den Messpunkt in Eiswasser steckst, kommt eine
negative Spannung raus, und die könntest du dann so nicht mehr messen.
Ein Thermoelement misst die Temperatur also nicht absolut sondern immer
relativ. Daher muss man auch die Temperatur des Referenzpunktes kennen
und in die Berechnung miteinbeziehen (addieren).
Wie kann man so einen (thermischen) Referenzpunkt erzeugen?
Könnte mir vorstellen, das er von einem Bezugspunkt mit bekannten
Parametern (Spannung) abgeleitet wird.
Stellen wir die Frage mal anders rum. Was mach mit einem Fühler,
ausgebildet als Tempfühler anderes als Temperatur messen? Zeigt so ein
Termoelement eigentlich nicht die Spannung die am Messpunkt entsteht?
Hatte das Datenblatt so verstanden, das das Thermoelemnt aus 2
verschiedenen Metallen besteht. Es hat die Anschlüsse + und -. Die
entstehende Spannung ist eine Differenzspannung an + und - und wird
durch den MCP gemessen.
Messe also im Grunde eine Differensspannung und die mit steigender Temp
steigende Differenzspannung.
Sorry für die Frage, wieder ein Denkfehler drin?
Suchender schrieb:> Wie kann man so einen (thermischen) Referenzpunkt erzeugen?
Der thermische Referenzpunkt ist Bestandteil deines Thermoelementes.
Ich nehme an, du hast ein "Typ K" Element mit grünem Stecker. In diesem
Stecker ist der Referenzpunkt.
Wenn am Messpunkt eine höhere Temperatur herrscht wie am Referenzpunkt
(=Vergleichsstelle), dann erzeugt das Thermoelement am + Anschluss eine
positive Spannung gegenüber dem - Anschluss.
Wenn die Temperatur der Messstelle geringer ist als die der
Vergleichsstelle, wird der + Anschluss negativ im Bezug auf den -
Anschluss.
Was willst du denn überhaupt messen? Die Raumtemperatur? Das wird damit
nicht gelingen, ausser dir gelingt es den Referenzpunkt ständig in einem
Eimer Eiswasser unterzubringen.
Du hast Recht. Hatte vergessen es anzugeben. Ist ein Fühler "K" mit
grünen Stecker und als Oberflächenfühler aufgebaut. Da meine ich mit, an
der Spitze von dem kleinen Griffel ist ein dünnes Blech, was auf eine
Oberfläche aufgelegt oder halt angedrückt werden kann.
Wenn ich deinen Beitrag richtig verstanden habe, wird vom referenzpunkt
z.B. die Raumtemperatur gemessen und der Fühler zeigt mir an, wieviel
Grad darüber am Sensor anliegen.
Suchender schrieb:> Wenn ich deinen Beitrag richtig verstanden habe, wird vom referenzpunkt> z.B. die Raumtemperatur gemessen und der Fühler zeigt mir an, wieviel> Grad darüber am Sensor anliegen.
So ist es, und ich wüsste jetzt auch nicht, wie ich es nochmal anders
erklären könnte.