


Hallo,
anbei gibt es eine C-Bibliothek für den Bosch BMP085 Drucksensor für Atmel AVR Atmega Familie.
Die Bibliothek wurde mit dem AVR Studio (4.18 SP2) und mit dem WinAVR-20100110 Compiler erzeugt (Projektdatei enthalten).
Die Treiberroutinen unterstützen folgende Features:
- Oversampling settings 0,1,2 --> max. Genauigkeit (RMS noise typ. 4 Pa) (RMS noise typ. 0.3 m)
- Fehlercoderückgabe für jede TWI (I2C) Aktion.
- Temperaturausgabe
- Druckausgabe
- Höhenberechnung mittels barometrischer Höhenformel (siehe http://en.wikipedia.org/wiki/Atmospheric_pressure)
- UART und TWI Bibliothek werden mitgeliefert
Beispiel:
Dieses kleine Beispiel soll zeigen wie einfach die Bibliothek benutzt werden kann.
#include "atmega_bmp085_lib.h"
#include "uart.h"
//#########################################
//#########################################
//#########################################
// S T A R T M A I N P R O G R A M
int main(void)
{
//-----------------------------------------
// Allocate memory
//-----------------------------------------
int32_t temperature = 0;
int32_t pressure = 0;
int16_t BMP085_calibration_int16_t[8];
int16_t BMP085_calibration_uint16_t[3];
uint8_t error_code=0;
//-----------------------------------------
// Initialize Stuff
//-----------------------------------------
uart_init(); //Initialize UART0
_delay_ms(11);
i2cSetBitrate(1000); //Initialize TWI 1000kHz
BMP085_Calibration(BMP085_calibration_int16_t, BMP085_calibration_uint16_t,&error_code);////Initialize BMP085
//-----------------------------------------
// Do forever
//-----------------------------------------
printf("error code global init: %d \n",error_code);
while(1)
{
printf("------------------------\n");
printf("------------------------\n");
printf("------------------------\n");
bmp085Convert(BMP085_calibration_int16_t, BMP085_calibration_uint16_t,&temperature, &pressure,&error_code); //Read and convert temp. and pressure
printf("Temperature: %ld (in 0.1 deg C)\n", temperature);
printf("Pressure: %ld Pa\n\n", pressure);
printf("Altitude: %ld dm\n", bmp085CalcAltitude(pressure));
printf("error code global: %d \n",error_code);
printf("------------------------\n");
printf("------------------------\n");
_delay_ms(10);
}
return 0;
}
// E N D M A I N P R O G R A M
//#########################################
//#########################################
Die Bibliothek steht unter GNU LGPL v2.1 und kann hier heruntergeladen werden.
Kommentare
hab mir einen atmega 32 besorgt, und nach einigen problemen immerhin jetzt schon einmal die temperatur bekommen, allerdings kommt mir der werd für den druck etwas seltsam for... : 30670
hast du eine ahnung was ich falsch gemacht haben könnte, oder is das irgenteine komische eineheit?
Gruß
Moritz
Hallo Moritz,
es könnte schon sein, dass die 4KB Flash Speicher etwas zu wenig sind. Ich habe die lib leider noch nicht optimiert, daher kann ich mir das schon vorstellen.
Viele Grüße,
Stefan
ich benutze einen bmp 085 und bin gerade am rumprobieren wie ich die daten aus ihm rausbekomm, deine Bibliothek hat mir dabei schon sehr gehofen, allerdings hab ich etwas probleme sie auf meinen atmega48 umzuschreiben. jetzt wo ich dachte ich häte es kommt beim programmieren des controllers die fehlermeldung: "The Contents of the HEX file does not fit in the selected device" soll dass heißen, dass der Flasch speicher des atmega 48 zu klein für das programm is, oder habe ich beim umschreiben einen fehler gemacht? ich bitte dringend um hilfe vielen dank
Moritz
Hallo Alex,
Die Prozedur bmp085ReadShort liest immer MSB und LSB gleichzeitig.
Das heißt
bmp085ReadShort (0xAA,errorcode );//ac1
gibt AC1 = 0xAA 0xAB als 16bit integer zurück.
Ich hoffe ich konnte deine Frage beantworten.
Grüße,
Stefan
danke schonmal für den bereitgestellte n Code. Ich beschäftige mich zur Zeit auch mit dem BMP085 und habe deinen Code etwas durchgeschaut.
Nun würde ich gern wissen, warum du beim auslesen der Temperatur und Druck nur das Register mit MSB (0xF6) und nicht das LSB(0xF7) noch ausliest. Auch beim kalibrieren verwendest du nur die MSB´s z.Bsp bei AC1 nimmst du auch nur 0xAA und nicht noch 0xAB.
So wie ich das Datenblatt verstehe müssten die LSB auch noch ausgelesen werden.
Oder hatte es einen bestimmten Grund warum du es so gemacht hast?
Danke
Gruß Alex
Hallo Klaus,
ich habe die Sensoren als Muster bekommen für ein Projekt.
Leider habe ich auch keinen Weg gefunden sie zu einem vernüpftigen Preis zu kaufen.
Gruß,
Stefan
thnks ;)
ich werde Deinen Code testen sobald ich einen Sensor ergattern konnte. Wo hast Du deine Sensoren her?
Ansonsten Dank für die Mühe.
Gruß
Klaus
Alle Kommentare dieses Beitrages als RSS-Feed.