Forum: Mikrocontroller und Digitale Elektronik MCP 3421 - Anzeige Fehler ?


von Suchender (Gast)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

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.

von Crazy Harry (crazy_h)


Lesenswert?

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

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Crazy H. schrieb:
> wenn dann

Müsste also so funktionieren:
1
int32_t value;
2
3
(...)
4
5
i2c_start(MCP_r);
6
for (i=0; i<3; i++)
7
  data[i]=i2c_readAck();
8
9
i2c_readNak();
10
i2c_stop();
11
12
value = (data[0] << 16) | (data[1] << 8) | data[2];

in value steht dann der 18-bit ADC Wert (als signed 32-bit).

: Bearbeitet durch User
von Suchender (Gast)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

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:
1
int32_t value;
2
3
(...)
4
5
i2c_start(MCP_r);
6
for (i=0; i<3; i++)
7
  data[i]=i2c_readAck();
8
9
i2c_readNak();
10
i2c_stop();
11
12
value = (data[0] << 16) | (data[1] << 8) | data[2];
13
if (value & 0x00020000) // negative number
14
  value |= 0xfffc0000;

von Suchender (Gast)


Lesenswert?

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)

von Joe F. (easylife)


Lesenswert?

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.

von Suchender (Gast)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

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.

von Crazy Harry (crazy_h)


Lesenswert?

Und was ist mit den Thermospannungen an den Übergängen IC <--> Lötzinn 
<--> Kupfer (Platine) <--> Lötzinn <--> Stecker <--> Thermoelement?

von Suchender (Gast)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

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).

: Bearbeitet durch User
von Suchender (Gast)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

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.

: Bearbeitet durch User
von Suchender (Gast)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

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.

von Suchender (Gast)


Lesenswert?

Da werde ich mich ins Netz auf die Suche begeben. Mal sehen was man da 
machen kann.
Danke für deine Hilfe

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.