NOT FINISHED YET!!! My first try to get a self built fully working Quadrocopter based on an mbed, a self built frame and some other more or less cheap parts.
BMP085/BMP085.cpp@9:4e0c3936c756, 2012-10-16 (annotated)
- Committer:
- maetugr
- Date:
- Tue Oct 16 10:21:32 2012 +0000
- Revision:
- 9:4e0c3936c756
- Parent:
- 5:818c0668fd2d
init von baro und compass in konstruktor geschrieben; vor einbetten der sensorwertarrays in die klassen
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maetugr | 5:818c0668fd2d | 1 | |
maetugr | 5:818c0668fd2d | 2 | #include "mbed.h" |
maetugr | 5:818c0668fd2d | 3 | #include "BMP085.h" |
maetugr | 5:818c0668fd2d | 4 | |
maetugr | 5:818c0668fd2d | 5 | //I2C Adresse |
maetugr | 5:818c0668fd2d | 6 | #define BMP085_ADRESS 0xEE |
maetugr | 5:818c0668fd2d | 7 | |
maetugr | 5:818c0668fd2d | 8 | #define xpow(x, y) ((long)1 << y) |
maetugr | 5:818c0668fd2d | 9 | |
maetugr | 5:818c0668fd2d | 10 | |
maetugr | 5:818c0668fd2d | 11 | // Constructor |
maetugr | 5:818c0668fd2d | 12 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 13 | BMP085::BMP085(PinName sda, PinName scl) : i2c_(sda, scl) |
maetugr | 5:818c0668fd2d | 14 | { |
maetugr | 5:818c0668fd2d | 15 | Init(); |
maetugr | 9:4e0c3936c756 | 16 | // MYINIT ------- |
maetugr | 9:4e0c3936c756 | 17 | oss = 0; //Oversampling des Barometers setzen |
maetugr | 9:4e0c3936c756 | 18 | // MYINIT ------- |
maetugr | 5:818c0668fd2d | 19 | } |
maetugr | 5:818c0668fd2d | 20 | |
maetugr | 5:818c0668fd2d | 21 | |
maetugr | 5:818c0668fd2d | 22 | // Temperatur und Druck auslesen und berechnen |
maetugr | 5:818c0668fd2d | 23 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 24 | void BMP085::Update () |
maetugr | 5:818c0668fd2d | 25 | { |
maetugr | 5:818c0668fd2d | 26 | long P, UTemp, UPressure, X1, X2, X3, B3, B5, B6; |
maetugr | 5:818c0668fd2d | 27 | unsigned long B4, B7; |
maetugr | 5:818c0668fd2d | 28 | |
maetugr | 5:818c0668fd2d | 29 | twi_writechar(BMP085_ADRESS, 0xf4, 0x2e); |
maetugr | 5:818c0668fd2d | 30 | // Wait at least 4.5ms |
maetugr | 5:818c0668fd2d | 31 | wait(0.005); |
maetugr | 5:818c0668fd2d | 32 | UTemp = twi_readshort(BMP085_ADRESS, 0xf6); |
maetugr | 5:818c0668fd2d | 33 | |
maetugr | 5:818c0668fd2d | 34 | X1 = ((UTemp - AC6) * AC5) >> 15; |
maetugr | 5:818c0668fd2d | 35 | X2 = (MC << 11) / (X1 + MD); |
maetugr | 5:818c0668fd2d | 36 | B5 = X1 + X2; |
maetugr | 5:818c0668fd2d | 37 | Temperature = (float)((B5 + 8) >> 4)/10.0; |
maetugr | 5:818c0668fd2d | 38 | |
maetugr | 5:818c0668fd2d | 39 | twi_writechar(BMP085_ADRESS, 0xf4, 0x34 + (oss << 6)); |
maetugr | 5:818c0668fd2d | 40 | // Wait at least 4.5ms |
maetugr | 5:818c0668fd2d | 41 | wait(0.005); |
maetugr | 5:818c0668fd2d | 42 | UPressure = twi_readlong(BMP085_ADRESS, 0xf6) >> (8 - oss); |
maetugr | 5:818c0668fd2d | 43 | |
maetugr | 5:818c0668fd2d | 44 | B6 = B5 - 4000; |
maetugr | 5:818c0668fd2d | 45 | X1 = (B2 * (B6 * B6) >> 12) >> 11; |
maetugr | 5:818c0668fd2d | 46 | X2 = (AC2 * B6) >> 11; |
maetugr | 5:818c0668fd2d | 47 | X3 = X1 + X2; |
maetugr | 5:818c0668fd2d | 48 | B3 = ((AC1 * 4 + X3) << oss) >> 2; |
maetugr | 5:818c0668fd2d | 49 | |
maetugr | 5:818c0668fd2d | 50 | X1 = (AC3 * B6) >> 13; |
maetugr | 5:818c0668fd2d | 51 | X2 = (B1 * (B6 * B6) >> 12) >> 16; |
maetugr | 5:818c0668fd2d | 52 | X3 = ((X1 + X2) + 2) >> 2; |
maetugr | 5:818c0668fd2d | 53 | B4 = AC4 * (X3 + 32768) >> 15; |
maetugr | 5:818c0668fd2d | 54 | |
maetugr | 5:818c0668fd2d | 55 | B7 = (unsigned long)(UPressure - B3) * (50000 >> oss); |
maetugr | 5:818c0668fd2d | 56 | |
maetugr | 5:818c0668fd2d | 57 | if (B7 < 0x80000000) |
maetugr | 5:818c0668fd2d | 58 | { |
maetugr | 5:818c0668fd2d | 59 | P = (2 * B7) / B4; |
maetugr | 5:818c0668fd2d | 60 | } |
maetugr | 5:818c0668fd2d | 61 | else |
maetugr | 5:818c0668fd2d | 62 | { |
maetugr | 5:818c0668fd2d | 63 | P = 2* (B7 / B4); |
maetugr | 5:818c0668fd2d | 64 | } |
maetugr | 5:818c0668fd2d | 65 | X1 = (P >> 8) * (P >> 8); |
maetugr | 5:818c0668fd2d | 66 | X1 = (X1 * 3038) >> 16; |
maetugr | 5:818c0668fd2d | 67 | X2 = (-7357 * P) >> 16; |
maetugr | 5:818c0668fd2d | 68 | P = P + ((X1 + X2 + 3791) >> 4); |
maetugr | 5:818c0668fd2d | 69 | Pressure = (float)P / 100.0; |
maetugr | 5:818c0668fd2d | 70 | } |
maetugr | 5:818c0668fd2d | 71 | |
maetugr | 5:818c0668fd2d | 72 | |
maetugr | 5:818c0668fd2d | 73 | // Hoehe u.M. berechnen (Druck in hPa) |
maetugr | 5:818c0668fd2d | 74 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 75 | float BMP085::CalcAltitude(float Press) |
maetugr | 5:818c0668fd2d | 76 | { |
maetugr | 5:818c0668fd2d | 77 | float A = Press/1013.25; |
maetugr | 5:818c0668fd2d | 78 | float B = 1/5.25588; |
maetugr | 5:818c0668fd2d | 79 | float C = pow(A,B); |
maetugr | 5:818c0668fd2d | 80 | |
maetugr | 5:818c0668fd2d | 81 | C = 1 - C; |
maetugr | 5:818c0668fd2d | 82 | C = C / 22.5577e-6; |
maetugr | 5:818c0668fd2d | 83 | return C; |
maetugr | 5:818c0668fd2d | 84 | } |
maetugr | 5:818c0668fd2d | 85 | |
maetugr | 5:818c0668fd2d | 86 | |
maetugr | 5:818c0668fd2d | 87 | // Drucksensor initialisieren |
maetugr | 5:818c0668fd2d | 88 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 89 | void BMP085::Init () |
maetugr | 5:818c0668fd2d | 90 | { |
maetugr | 5:818c0668fd2d | 91 | AC1 = twi_readshort(BMP085_ADRESS, 0xaa); |
maetugr | 5:818c0668fd2d | 92 | AC2 = twi_readshort(BMP085_ADRESS, 0xac); |
maetugr | 5:818c0668fd2d | 93 | AC3 = twi_readshort(BMP085_ADRESS, 0xae); |
maetugr | 5:818c0668fd2d | 94 | AC4 = twi_readshort(BMP085_ADRESS, 0xb0); |
maetugr | 5:818c0668fd2d | 95 | AC5 = twi_readshort(BMP085_ADRESS, 0xb2); |
maetugr | 5:818c0668fd2d | 96 | AC6 = twi_readshort(BMP085_ADRESS, 0xb4); |
maetugr | 5:818c0668fd2d | 97 | B1 = twi_readshort(BMP085_ADRESS, 0xb6); |
maetugr | 5:818c0668fd2d | 98 | B2 = twi_readshort(BMP085_ADRESS, 0xb8); |
maetugr | 5:818c0668fd2d | 99 | MB = twi_readshort(BMP085_ADRESS, 0xba); |
maetugr | 5:818c0668fd2d | 100 | MC = twi_readshort(BMP085_ADRESS, 0xbc); |
maetugr | 5:818c0668fd2d | 101 | MD = twi_readshort(BMP085_ADRESS, 0xbe); |
maetugr | 5:818c0668fd2d | 102 | } |
maetugr | 5:818c0668fd2d | 103 | |
maetugr | 5:818c0668fd2d | 104 | |
maetugr | 5:818c0668fd2d | 105 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 106 | unsigned short BMP085::twi_readshort (int id, int addr) { |
maetugr | 5:818c0668fd2d | 107 | unsigned short i; |
maetugr | 5:818c0668fd2d | 108 | |
maetugr | 5:818c0668fd2d | 109 | i2c_.start(); |
maetugr | 5:818c0668fd2d | 110 | i2c_.write(id); |
maetugr | 5:818c0668fd2d | 111 | i2c_.write(addr); |
maetugr | 5:818c0668fd2d | 112 | |
maetugr | 5:818c0668fd2d | 113 | i2c_.start(); |
maetugr | 5:818c0668fd2d | 114 | i2c_.write(id | 1); |
maetugr | 5:818c0668fd2d | 115 | i = i2c_.read(1) << 8; |
maetugr | 5:818c0668fd2d | 116 | i |= i2c_.read(0); |
maetugr | 5:818c0668fd2d | 117 | i2c_.stop(); |
maetugr | 5:818c0668fd2d | 118 | |
maetugr | 5:818c0668fd2d | 119 | return i; |
maetugr | 5:818c0668fd2d | 120 | } |
maetugr | 5:818c0668fd2d | 121 | |
maetugr | 5:818c0668fd2d | 122 | |
maetugr | 5:818c0668fd2d | 123 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 124 | unsigned long BMP085::twi_readlong (int id, int addr) { |
maetugr | 5:818c0668fd2d | 125 | unsigned long i; |
maetugr | 5:818c0668fd2d | 126 | |
maetugr | 5:818c0668fd2d | 127 | i2c_.start(); |
maetugr | 5:818c0668fd2d | 128 | i2c_.write(id); |
maetugr | 5:818c0668fd2d | 129 | i2c_.write(addr); |
maetugr | 5:818c0668fd2d | 130 | |
maetugr | 5:818c0668fd2d | 131 | i2c_.start(); |
maetugr | 5:818c0668fd2d | 132 | i2c_.write(id | 1); |
maetugr | 5:818c0668fd2d | 133 | i = i2c_.read(1) << 16; |
maetugr | 5:818c0668fd2d | 134 | i |= i2c_.read(1) << 8; |
maetugr | 5:818c0668fd2d | 135 | i |= i2c_.read(0); |
maetugr | 5:818c0668fd2d | 136 | i2c_.stop(); |
maetugr | 5:818c0668fd2d | 137 | |
maetugr | 5:818c0668fd2d | 138 | return i; |
maetugr | 5:818c0668fd2d | 139 | } |
maetugr | 5:818c0668fd2d | 140 | |
maetugr | 5:818c0668fd2d | 141 | |
maetugr | 5:818c0668fd2d | 142 | // ----------------------------------------------- |
maetugr | 5:818c0668fd2d | 143 | void BMP085::twi_writechar (int id, int addr, int dat) { |
maetugr | 5:818c0668fd2d | 144 | |
maetugr | 5:818c0668fd2d | 145 | i2c_.start(); |
maetugr | 5:818c0668fd2d | 146 | i2c_.write(id); |
maetugr | 5:818c0668fd2d | 147 | i2c_.write(addr); |
maetugr | 5:818c0668fd2d | 148 | i2c_.write(dat); |
maetugr | 5:818c0668fd2d | 149 | i2c_.stop(); |
maetugr | 5:818c0668fd2d | 150 | } |