BMP180 Kalibrationswerte

Gast #4026862
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);
Gast #4027397
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.
Gast #4027441
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.
#4027478
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
Gast #4027490
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 (;
Gast #4027893
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?
#4027917
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.
Gast #4027921
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.
#4029059
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
Gast #4029398
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?
Gast #4030113
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.
Gast #4032090
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.
Gast #4034601
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???
#4035141
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.
#5378929
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren