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.

Dependencies:   mbed MODI2C

Committer:
maetugr
Date:
Fri Feb 14 14:17:32 2014 +0000
Revision:
40:2ca410923691
Parent:
14:cf260677ecde
now with MPU6050 before taking it too FlyBed2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maetugr 5:818c0668fd2d 1
maetugr 5:818c0668fd2d 2 #include "mbed.h"
maetugr 14:cf260677ecde 3 #include "BMP085_old.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 14:cf260677ecde 13 BMP085_old::BMP085_old(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 14:cf260677ecde 24 void BMP085_old::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 14:cf260677ecde 75 float BMP085_old::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 14:cf260677ecde 89 void BMP085_old::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 14:cf260677ecde 106 unsigned short BMP085_old::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 14:cf260677ecde 124 unsigned long BMP085_old::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 14:cf260677ecde 143 void BMP085_old::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 }