BMA180 library with multiple configurable ranges. Based on the Sensor_test by Bo Carøe.
Dependents: Sensor_test_2_0 KalmanFilter
Fork of BMA180 by
BMA180.cpp@2:c7eb9f15e026, 2012-08-15 (annotated)
- Committer:
- cdonate
- Date:
- Wed Aug 15 22:17:27 2012 +0000
- Revision:
- 2:c7eb9f15e026
- Parent:
- 1:cd2316c8a187
No change
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cdonate | 2:c7eb9f15e026 | 1 | #include "mbed.h" |
cdonate | 2:c7eb9f15e026 | 2 | #include "BMA180.h" |
cdonate | 2:c7eb9f15e026 | 3 | |
cdonate | 2:c7eb9f15e026 | 4 | #define I2CADR_W(ADR) (ADR<<1&0xFE) |
cdonate | 2:c7eb9f15e026 | 5 | #define I2CADR_R(ADR) (ADR<<1|0x01) |
cdonate | 2:c7eb9f15e026 | 6 | |
cdonate | 2:c7eb9f15e026 | 7 | //Initialization |
cdonate | 2:c7eb9f15e026 | 8 | BMA180::BMA180(I2C & I2CBus_, Timer & GlobalTime_) |
cdonate | 2:c7eb9f15e026 | 9 | : I2CBus(I2CBus_), |
cdonate | 2:c7eb9f15e026 | 10 | GlobalTime(GlobalTime_) |
cdonate | 2:c7eb9f15e026 | 11 | {} |
cdonate | 2:c7eb9f15e026 | 12 | |
cdonate | 2:c7eb9f15e026 | 13 | void BMA180::Init() |
cdonate | 2:c7eb9f15e026 | 14 | { |
cdonate | 2:c7eb9f15e026 | 15 | //Zeroing |
cdonate | 2:c7eb9f15e026 | 16 | for(int i= 0; i < 3; i++) |
cdonate | 2:c7eb9f15e026 | 17 | { |
cdonate | 2:c7eb9f15e026 | 18 | Offset[i]= 0.0; |
cdonate | 2:c7eb9f15e026 | 19 | RawAcc[i]= 0; |
cdonate | 2:c7eb9f15e026 | 20 | Acc[i]= 0; |
cdonate | 2:c7eb9f15e026 | 21 | } |
cdonate | 2:c7eb9f15e026 | 22 | |
cdonate | 2:c7eb9f15e026 | 23 | |
cdonate | 2:c7eb9f15e026 | 24 | //BMA180 initialization |
cdonate | 2:c7eb9f15e026 | 25 | char tx[2]; |
cdonate | 2:c7eb9f15e026 | 26 | char rx[1]; |
cdonate | 2:c7eb9f15e026 | 27 | |
cdonate | 2:c7eb9f15e026 | 28 | //Write on EEPROM enable |
cdonate | 2:c7eb9f15e026 | 29 | tx[0]= 0x0D; |
cdonate | 2:c7eb9f15e026 | 30 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1); |
cdonate | 2:c7eb9f15e026 | 31 | I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1); |
cdonate | 2:c7eb9f15e026 | 32 | tx[1]= rx[0] & 0xEF | (0x01<<4); |
cdonate | 2:c7eb9f15e026 | 33 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2); |
cdonate | 2:c7eb9f15e026 | 34 | |
cdonate | 2:c7eb9f15e026 | 35 | //Mode: Low-Noise |
cdonate | 2:c7eb9f15e026 | 36 | tx[0]= 0x30; |
cdonate | 2:c7eb9f15e026 | 37 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1); |
cdonate | 2:c7eb9f15e026 | 38 | I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1); |
cdonate | 2:c7eb9f15e026 | 39 | tx[1]= rx[0] & 0xFC | (0x00<<0); |
cdonate | 2:c7eb9f15e026 | 40 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2); |
cdonate | 2:c7eb9f15e026 | 41 | |
cdonate | 2:c7eb9f15e026 | 42 | //Range: +-1.5g |
cdonate | 2:c7eb9f15e026 | 43 | // +-1g:0x00 | +-1.5g:0x01 | +-2g:0x02 | +-3g:0x03 | +-4g:0x04 | +-8g:0x05 | +-16g:0x06 | |
cdonate | 2:c7eb9f15e026 | 44 | tx[0]= 0x35; |
cdonate | 2:c7eb9f15e026 | 45 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1); |
cdonate | 2:c7eb9f15e026 | 46 | I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1); |
cdonate | 2:c7eb9f15e026 | 47 | tx[1]= rx[0] & 0xF1 | (0x01<<1); |
cdonate | 2:c7eb9f15e026 | 48 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2); |
cdonate | 2:c7eb9f15e026 | 49 | |
cdonate | 2:c7eb9f15e026 | 50 | //Bandwidth filters: 10Hz |
cdonate | 2:c7eb9f15e026 | 51 | tx[0]= 0x20; |
cdonate | 2:c7eb9f15e026 | 52 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1); |
cdonate | 2:c7eb9f15e026 | 53 | I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1); |
cdonate | 2:c7eb9f15e026 | 54 | tx[1]= rx[0] & 0x0F | (0x00<<4); |
cdonate | 2:c7eb9f15e026 | 55 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2); |
cdonate | 2:c7eb9f15e026 | 56 | |
cdonate | 2:c7eb9f15e026 | 57 | Update(); |
cdonate | 2:c7eb9f15e026 | 58 | } |
cdonate | 2:c7eb9f15e026 | 59 | |
cdonate | 2:c7eb9f15e026 | 60 | |
cdonate | 2:c7eb9f15e026 | 61 | //Read raw data |
cdonate | 2:c7eb9f15e026 | 62 | void BMA180::ReadRawData() |
cdonate | 2:c7eb9f15e026 | 63 | { |
cdonate | 2:c7eb9f15e026 | 64 | //Read acceleration on all 3 axis |
cdonate | 2:c7eb9f15e026 | 65 | char tx[1]; |
cdonate | 2:c7eb9f15e026 | 66 | char rx[6]; |
cdonate | 2:c7eb9f15e026 | 67 | |
cdonate | 2:c7eb9f15e026 | 68 | tx[0]= 0x02; |
cdonate | 2:c7eb9f15e026 | 69 | I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1); |
cdonate | 2:c7eb9f15e026 | 70 | I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 6); |
cdonate | 2:c7eb9f15e026 | 71 | |
cdonate | 2:c7eb9f15e026 | 72 | //Assemble the individual bytes from the 16-bit value |
cdonate | 2:c7eb9f15e026 | 73 | //The last 2 bits must be "cut off" since the values came in 14-bit form |
cdonate | 2:c7eb9f15e026 | 74 | RawAcc[0]= (rx[1]<<8|rx[0]) & 0xFFFC; |
cdonate | 2:c7eb9f15e026 | 75 | RawAcc[1]= (rx[3]<<8|rx[2]) & 0xFFFC; |
cdonate | 2:c7eb9f15e026 | 76 | RawAcc[2]= (rx[5]<<8|rx[4]) & 0xFFFC; |
cdonate | 2:c7eb9f15e026 | 77 | RawAcc[0]/= 4; |
cdonate | 2:c7eb9f15e026 | 78 | RawAcc[1]/= 4; |
cdonate | 2:c7eb9f15e026 | 79 | RawAcc[2]/= 4; |
cdonate | 2:c7eb9f15e026 | 80 | } |
cdonate | 2:c7eb9f15e026 | 81 | |
cdonate | 2:c7eb9f15e026 | 82 | //Update-Method |
cdonate | 2:c7eb9f15e026 | 83 | void BMA180::Update() |
cdonate | 2:c7eb9f15e026 | 84 | { |
cdonate | 2:c7eb9f15e026 | 85 | //Read acceleration on all 3 axis |
cdonate | 2:c7eb9f15e026 | 86 | ReadRawData(); |
cdonate | 2:c7eb9f15e026 | 87 | |
cdonate | 2:c7eb9f15e026 | 88 | //Conversions |
cdonate | 2:c7eb9f15e026 | 89 | Acc[0]= fConvMPSS * ((float)(RawAcc[0]) + Offset[0]); |
cdonate | 2:c7eb9f15e026 | 90 | Acc[1]= fConvMPSS * ((float)(RawAcc[1]) + Offset[1]); |
cdonate | 2:c7eb9f15e026 | 91 | Acc[2]= fConvMPSS * ((float)(RawAcc[2]) + Offset[2]); |
cdonate | 2:c7eb9f15e026 | 92 | } |
cdonate | 2:c7eb9f15e026 | 93 | |
cdonate | 2:c7eb9f15e026 | 94 | //Calibration |
cdonate | 2:c7eb9f15e026 | 95 | void BMA180::Calibrate(int ms, const short * pRaw1g) |
cdonate | 2:c7eb9f15e026 | 96 | { |
cdonate | 2:c7eb9f15e026 | 97 | float AvgCalibAcc[3]= {0.0, 0.0, 0.0}; |
cdonate | 2:c7eb9f15e026 | 98 | float AvgCalibSampels= 0.0; |
cdonate | 2:c7eb9f15e026 | 99 | |
cdonate | 2:c7eb9f15e026 | 100 | //End of calibration calculated in milliseconds |
cdonate | 2:c7eb9f15e026 | 101 | int CalibEnd= GlobalTime.read_ms() + ms; |
cdonate | 2:c7eb9f15e026 | 102 | |
cdonate | 2:c7eb9f15e026 | 103 | while(GlobalTime.read_ms() < CalibEnd) |
cdonate | 2:c7eb9f15e026 | 104 | { |
cdonate | 2:c7eb9f15e026 | 105 | //Read raw data |
cdonate | 2:c7eb9f15e026 | 106 | ReadRawData(); |
cdonate | 2:c7eb9f15e026 | 107 | |
cdonate | 2:c7eb9f15e026 | 108 | //Averaging |
cdonate | 2:c7eb9f15e026 | 109 | AvgCalibAcc[0]+= (float)RawAcc[0]; |
cdonate | 2:c7eb9f15e026 | 110 | AvgCalibAcc[1]+= (float)RawAcc[1]; |
cdonate | 2:c7eb9f15e026 | 111 | AvgCalibAcc[2]+= (float)RawAcc[2]; |
cdonate | 2:c7eb9f15e026 | 112 | AvgCalibSampels+= 1.0; |
cdonate | 2:c7eb9f15e026 | 113 | |
cdonate | 2:c7eb9f15e026 | 114 | wait_ms(2); |
cdonate | 2:c7eb9f15e026 | 115 | } |
cdonate | 2:c7eb9f15e026 | 116 | |
cdonate | 2:c7eb9f15e026 | 117 | //Collected enough data now form the average |
cdonate | 2:c7eb9f15e026 | 118 | Offset[0]= -((float)(pRaw1g[0]) + AvgCalibAcc[0] / AvgCalibSampels); |
cdonate | 2:c7eb9f15e026 | 119 | Offset[1]= -((float)(pRaw1g[1]) + AvgCalibAcc[1] / AvgCalibSampels); |
cdonate | 2:c7eb9f15e026 | 120 | Offset[2]= -((float)(pRaw1g[2]) + AvgCalibAcc[2] / AvgCalibSampels); |
cdonate | 2:c7eb9f15e026 | 121 | } |
cdonate | 2:c7eb9f15e026 | 122 | void BMA180::userCalibration(short * Raw1g){ |
cdonate | 2:c7eb9f15e026 | 123 | |
cdonate | 2:c7eb9f15e026 | 124 | long media[3] = {0,0,0}; |
cdonate | 2:c7eb9f15e026 | 125 | |
cdonate | 2:c7eb9f15e026 | 126 | int count = 0; |
cdonate | 2:c7eb9f15e026 | 127 | |
cdonate | 2:c7eb9f15e026 | 128 | int endCal = GlobalTime.read_ms() + 500; |
cdonate | 2:c7eb9f15e026 | 129 | |
cdonate | 2:c7eb9f15e026 | 130 | while(GlobalTime.read_ms() < endCal){ |
cdonate | 2:c7eb9f15e026 | 131 | |
cdonate | 2:c7eb9f15e026 | 132 | media[0] = media[0] + (float)RawAcc[0]; |
cdonate | 2:c7eb9f15e026 | 133 | media[1] = media[1] + (float)RawAcc[1]; |
cdonate | 2:c7eb9f15e026 | 134 | media[2] = media[2] + (float)RawAcc[2]; |
cdonate | 2:c7eb9f15e026 | 135 | count++; |
cdonate | 2:c7eb9f15e026 | 136 | } |
cdonate | 2:c7eb9f15e026 | 137 | Raw1g[0] = -(media[0]/count); |
cdonate | 2:c7eb9f15e026 | 138 | Raw1g[1] = -(media[1]/count); |
cdonate | 2:c7eb9f15e026 | 139 | Raw1g[2] = -(media[2]/count); |
cdonate | 2:c7eb9f15e026 | 140 | } |