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 Bo Carøe

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?

UserRevisionLine numberNew 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 }