Hallo, ich habe ein "kleines" Problem mit dem BMP180... Kann es sein das die Kalibrationswerte nicht stimmen? Darf "UT" negativ sein ? Bitte um Hilfe...
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); |
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
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.
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.
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
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 (;
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.
Damian schrieb: > Ich wäre wirklich für jeden Vergleichswert dankbar. UT=27898 gehört zu einer Temperatur von 15°C
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.
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?
Damian schrieb: > Darum kann ein negativer Wert bei Raumtemperatur auch unmöglich sein. Ich denke negative Temperaturen sind messbar.
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.
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.
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...
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
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?
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.
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.
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???
Gib doch mal deine ganzen gemessenen Werte mit an. UP und die Kalibrationswerte.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
