Forum: Mikrocontroller und Digitale Elektronik BMP180 Kalibrationswerte


von Damian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein "kleines" Problem mit dem BMP180...
Kann es sein das die Kalibrationswerte nicht stimmen?
Darf "UT" negativ sein ?

Bitte um Hilfe...

von H. D. (lactobacillus)


Lesenswert?

UT (also der rohe Messwert) darf meines Wissens nicht negativ sein.

von Damian (Gast)


Lesenswert?

H. D. schrieb:
> UT (also der rohe Messwert) darf meines Wissens nicht negativ
> sein.

habe ich evtl. in meiner "teilroutine" was falsch....?
1
  uint16_t UP; // holds the raw pressure value read from BMP180
2
  int16_t UT; // holds the raw temperature value read from BMP180
3
  long B6, X1, X2, X3, B3, B5, B7;
4
  unsigned long B4;
5
  int16_t truetemperature;
6
  uint16_t truepressure;
7
8
  i2c_start(BMP180_address+I2C_WRITE);
9
  i2c_write(0xF4);
10
  i2c_write(0x2E);
11
  i2c_stop();
12
  _delay_us(500);
13
14
  i2c_start(BMP180_address+I2C_WRITE);
15
  i2c_write(0xF6);
16
  i2c_stop();
17
18
  i2c_start(BMP180_address+I2C_READ);
19
  UT  = i2c_readAck()<<8;
20
  UT |= i2c_readNak();
21
  i2c_stop();
22
  
23
  char Buffer[20];
24
  
25
  uart_puts("UT = ");
26
  sprintf(Buffer, "%d", UT);
27
  uart_puts(Buffer);
28
  uart_puts("   ");
29
    uart_puts("\r");
30
  _delay_ms(500);

von Alex L. (a_l)


Lesenswert?

Hallo,

habe nie geschaut welche werte die Rohwerte haben, allerdings habe ich 
bei meiner Umsetzung für den BMP180 für UT einen unsigned int genommen.

Grüße

von Wolfgang (Gast)


Lesenswert?

Damian schrieb:
> uint16_t UP; // holds the raw pressure value read from BMP180
>   int16_t UT; // holds the raw temperature value read from BMP180

Im Datenblatt ist beiden Variablen der Datentyp long zugeordnet und dem 
Abschnitt 5.5 kannst du entnehmen, dass UT 16 Bit und UP zwischen 16 und 
19 Bit hat. Im Berechnungsbeispiel auf S.15 taucht für UT ein Wert von 
27898 auf. Du solltest also die Wahl deiner Variablentypen nochmal 
überdenken.

von Damian (Gast)


Lesenswert?

Danke für den Hinweis Wolfgang.

Was mir jedoch komisch vorkommt, ist das der "UT"  Wert sehr stark ins 
negative geht...  Ich würde mich freuen, wenn mir jemand sagen könnte, 
der schon mal mit dem gleichen Sensor gearbeitet hat ob das sein kann 
oder nicht. Das Gefühl werde ich nicht los, dass der Minus Bereich auf 
einen defekt hinweist.

von Alex L. (a_l)


Lesenswert?

Hallo,

habe den Sensor gerade nicht hier. Kann mal schauen, ob ich die Tage das 
mal schaffe einen Rohwert auszulesen. Hatte das auch mal gemacht, nur 
nicht gespeichert. Könnte nur mit Rohwerten der Kalibrationswerte von 
einem meiner Sensoren liefern.

Grüße

von Damian (Gast)


Lesenswert?

Alex L. schrieb:
> Hallo,
>
> habe den Sensor gerade nicht hier. Kann mal schauen, ob ich die Tage das
> mal schaffe einen Rohwert auszulesen. Hatte das auch mal gemacht, nur
> nicht gespeichert. Könnte nur mit Rohwerten der Kalibrationswerte von
> einem meiner Sensoren liefern.
>
> Grüße

Ich wäre wirklich für jeden Vergleichswert dankbar.  Hauptsache das 
spielt sich nicht in irgendwelchen ungewöhnlichen Umgebungen ab. Gerade 
was Temperatur angeht (;

von Wolfgang (Gast)


Lesenswert?

Damian schrieb:
> Was mir jedoch komisch vorkommt, ist das der "UT"  Wert sehr stark ins
> negative geht...

Der Wert geht nicht ins Negative, sondern du interpretierst die Bits die 
aus dem Wandler kommen, als negative Zahl. Das sind zwei völlig 
verschiedene Dinge.

von Wolfgang (Gast)


Lesenswert?

Damian schrieb:
> Ich wäre wirklich für jeden Vergleichswert dankbar.

UT=27898 gehört zu einer Temperatur von 15°C

von Damian (Gast)


Lesenswert?

Wolfgang schrieb:
> Damian schrieb:
> Ich wäre wirklich für jeden Vergleichswert dankbar.
>
> UT=27898 gehört zu einer Temperatur von 15°C

Darum kann ein negativer Wert bei Raumtemperatur auch unmöglich sein.

von Damian (Gast)


Lesenswert?

Wolfgang schrieb:
> Damian schrieb:
>> Was mir jedoch komisch vorkommt, ist das der "UT"  Wert sehr stark ins
>> negative geht...
>
> Der Wert geht nicht ins Negative, sondern du interpretierst die Bits die
> aus dem Wandler kommen, als negative Zahl. Das sind zwei völlig
> verschiedene Dinge.

Mir kommen die Kalibrationswerte aber auch schon richtig komisch vor. 
Hast du sie dir mal angeschaut? Kann das sein, dass die so grob vom 
Datenblatt abweichen?

von H. D. (lactobacillus)


Lesenswert?

Damian schrieb:
> Darum kann ein negativer Wert bei Raumtemperatur auch unmöglich sein.

Ich denke negative Temperaturen sind messbar.

von Harper B. (harper)


Lesenswert?

Habe in mein Projekt geguckt. Der Wert aus dem Register 0x2E ist 
unsigned 16 Bit. Bevor der weiterverarbeitet wurde, musste ich 
allerdings noch die Endianess umdrehen, also die beiden Bytes 
vertauschen. Danach wurde der Wert einer Variable vom Typ long 
zugewiesen, damit in der weiteren Berechnung keine Integerpromotion zu 
unerwarteten Ergebnissen führen kann.

von Damian (Gast)


Lesenswert?

Harper Blues schrieb:
> Habe in mein Projekt geguckt. Der Wert aus dem Register 0x2E ist
> unsigned 16 Bit. Bevor der weiterverarbeitet wurde, musste ich
> allerdings noch die Endianess umdrehen, also die beiden Bytes
> vertauschen. Danach wurde der Wert einer Variable vom Typ long
> zugewiesen, damit in der weiteren Berechnung keine Integerpromotion zu
> unerwarteten Ergebnissen führen kann.

Könntest du mir deinen Teil mal zeigen?
Würde mich freuen.

von Björn S. (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal mein Programm um die Werte aus dem BMP180 auszulesen.

von Damian (Gast)


Angehängte Dateien:

Lesenswert?

Björn S. schrieb:
> Hier mal mein Programm um die Werte aus dem BMP180 auszulesen.

Die Routinen sind ja deutlich anders als meine.
Anbei mal meine...

Kann sich das mal bitte jemand anschauen, gerade was "BMP180_read" 
angeht ?
Vill. mache ich irgendwas komplett falsches...

von Alex L. (a_l)


Lesenswert?

Hi,

falls es dir weiter hilft hab hier mal die Kalibrationswerte von einem 
von meinen Sensoren:
1
Calibration coefficients of BMP180
2
----------------------------------
3
4
Read 21.11.2014 
5
6
Syntax:  <0xff> <2 Byte Coef> <0xff>
7
Order:  AC1, AC2, ... AC6, B1, B2, MB, MC, MD
8
9
ff 1b c7 ff 
10
ff fc 18 ff 
11
ff c7 6e ff 
12
ff 81 84 ff 
13
ff 64 10 ff 
14
ff 3b 66 ff AC6
15
ff 19 73 ff 
16
ff 00 20 ff 
17
ff 80 00 ff
18
ff d1 f6 ff 
19
ff 09 8d ff
den Datenrohwerte hatte ich damals leider nicht mit ausgelesen. die 
beiden mittleren Bytes in einer Zeile sind der wert in Hex.

Grüße

von Damian (Gast)


Lesenswert?

Danke Alex.

Konnte nun erfolgreich die Temperatur auslesen...  Problem war irgendwie 
das ich den Druck und Temperatur gleichzeitig in einer Funktion 
ausgelesen habe...  Also irgendwas mit dem I2C.

Nun kann ich zwar die Temperatur auslesen...  Möchte ich aber beides 
auslesen, klappt das mit der Temperatur auch nicht mehr. Da kommen dann 
nur noch zu hohe Werte raus.

Woran kann das schon wieder liegen?

von Björn S. (Gast)


Lesenswert?

Du musst die Temperaturmessung starten.
Dann 4,5ms warten.
Dann den Temperaturwert aus den Datenregistern abholen.

Dann die Druckmessung starten.
Dann je nach OSS Einstellung n ms warten.
Dann den Druckwert aus den gleichen Datenregistern abholen. (+ XLSB 
evtl.)

Wo hakt es denn bei dir? Das Datenblatt ist nicht soo schlecht.

von Damian (Gast)


Lesenswert?

Ich bekomme ständig einen Druck von ca.  600 mbar. Die Rechnung stimmt. 
Lade ich die kalibrationswerte vom Datenblatt bekomme ich auch das 
Ergebnis vom Datenblatt raus. Nur mit meinen Werten klappt das irgendwie 
nicht.

von Mickymaus (Gast)


Lesenswert?

Moin Gemeine,

ich habe das gleiche Problem wie Demian...
Ich komme auch NUR auf Luftdruck-Werte um die 600 mBar...

Hier programmiere ich in AVR/gcc mit AVR-Studio 6.1 auf einem AtMega328P
Ich benutze die Bibliotheken von Stefan Sicklinger

bmp085_lib_stefan_sicklinger_version_0_8

Mein Mess-Intervall liegt bei ca. 1sec...



Wenn ich den BMP180 mit nem Raspberry über Phyton auslese, bekomme ich 
gültige Druckwerte um die 1004 mBar derzeit...

Die gemessene Temperatur sieht aber sehr gut aus...

Wo kann man hier noch ansetzen, um den Fehler zu finden???

von Damian (Gast)


Lesenswert?

Gib doch mal deine ganzen gemessenen Werte mit an.

UP und die Kalibrationswerte.

von Bernhard S. (b_spitzer)


Lesenswert?

Du liest die Temperatur mit einer Funktion, die 16 Bit liest und machst 
gleich einen Type-Cast auf Long. Wieso muss man für jeden Furz einen 
Funktion machen??
Macht sowas wirklich Sinn?
1
int32_t bmp180_getT() {
2
  return (int32_t) bmp180_read16(BMP180_REG_OUT);
3
}

in bmp180_read16() hast Du das drin
1
return(lbyte + ((uint16_t) hbyte << 8));

Probiere mal so, wie es alle anderen machen:
1
return(lbyte || ((uint16_t) hbyte << 8));
Oder nimm stattdessen die Funktion bmp180_read24(), wenn eh' ein 
Typecast folgen soll.

von drama (Gast)


Lesenswert?

Wieso nutzt ihr eigentlich irgendwelche 3rd party libraries, wenn Bosch 
selbst was zur Verfügung stellt?

https://github.com/BoschSensortec/BMP180_driver

Man schreibt nur die drei Funktionen für I2C und Delays und dann geht's 
ab. Der Code scheint recht sauber zu sein. Kompiliert bei mir ohne 
Warnings o.ä. und funktioniert gut.

von Jan H. (janiiix3)


Lesenswert?

drama schrieb:
> Wieso nutzt ihr eigentlich irgendwelche 3rd party libraries, wenn
> Bosch
> selbst was zur Verfügung stellt?
>
> https://github.com/BoschSensortec/BMP180_driver
>
> Man schreibt nur die drei Funktionen für I2C und Delays und dann geht's
> ab. Der Code scheint recht sauber zu sein. Kompiliert bei mir ohne
> Warnings o.ä. und funktioniert gut.
Wie ich sehe, ist dieser Post schon einige "Tage" her.
Habe jedoch eine Frage dazu.

Wo genau muss ich denn meine I2C Routinen eintragen in die von "Bosch" 
gelieferten Lib?

Danke.

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.