BMA180 adr. 0x41 from BlazeX

Dependents:   Sensor_test

Committer:
caroe
Date:
Wed May 30 10:43:42 2012 +0000
Revision:
0:6904212fb1d1

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caroe 0:6904212fb1d1 1 #include "mbed.h"
caroe 0:6904212fb1d1 2 #include "BMA180.h"
caroe 0:6904212fb1d1 3
caroe 0:6904212fb1d1 4 #define I2CADR_W(ADR) (ADR<<1&0xFE)
caroe 0:6904212fb1d1 5 #define I2CADR_R(ADR) (ADR<<1|0x01)
caroe 0:6904212fb1d1 6
caroe 0:6904212fb1d1 7 //Initialisieren
caroe 0:6904212fb1d1 8 BMA180::BMA180(I2C & I2CBus_, Timer & GlobalTime_)
caroe 0:6904212fb1d1 9 : I2CBus(I2CBus_),
caroe 0:6904212fb1d1 10 GlobalTime(GlobalTime_)
caroe 0:6904212fb1d1 11 {}
caroe 0:6904212fb1d1 12
caroe 0:6904212fb1d1 13 void BMA180::Init()
caroe 0:6904212fb1d1 14 {
caroe 0:6904212fb1d1 15 //Nullsetzen
caroe 0:6904212fb1d1 16 for(int i= 0; i < 3; i++)
caroe 0:6904212fb1d1 17 {
caroe 0:6904212fb1d1 18 Offset[i]= 0.0;
caroe 0:6904212fb1d1 19 RawAcc[i]= 0;
caroe 0:6904212fb1d1 20 Acc[i]= 0;
caroe 0:6904212fb1d1 21 }
caroe 0:6904212fb1d1 22
caroe 0:6904212fb1d1 23
caroe 0:6904212fb1d1 24 //BMA180 initialisieren
caroe 0:6904212fb1d1 25 char tx[2];
caroe 0:6904212fb1d1 26 char rx[1];
caroe 0:6904212fb1d1 27
caroe 0:6904212fb1d1 28 //Schreiben aktivieren
caroe 0:6904212fb1d1 29 tx[0]= 0x0D;
caroe 0:6904212fb1d1 30 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
caroe 0:6904212fb1d1 31 I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
caroe 0:6904212fb1d1 32 tx[1]= rx[0] & 0xEF | (0x01<<4);
caroe 0:6904212fb1d1 33 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
caroe 0:6904212fb1d1 34
caroe 0:6904212fb1d1 35 //Mode: Low-Noise
caroe 0:6904212fb1d1 36 tx[0]= 0x30;
caroe 0:6904212fb1d1 37 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
caroe 0:6904212fb1d1 38 I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
caroe 0:6904212fb1d1 39 tx[1]= rx[0] & 0xFC | (0x00<<0);
caroe 0:6904212fb1d1 40 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
caroe 0:6904212fb1d1 41
caroe 0:6904212fb1d1 42 //Range: +-3g
caroe 0:6904212fb1d1 43 tx[0]= 0x35;
caroe 0:6904212fb1d1 44 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
caroe 0:6904212fb1d1 45 I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
caroe 0:6904212fb1d1 46 tx[1]= rx[0] & 0xF1 | (0x03<<1);
caroe 0:6904212fb1d1 47 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
caroe 0:6904212fb1d1 48
caroe 0:6904212fb1d1 49 //Bandbreitenfilter: 10Hz
caroe 0:6904212fb1d1 50 tx[0]= 0x20;
caroe 0:6904212fb1d1 51 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
caroe 0:6904212fb1d1 52 I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 1);
caroe 0:6904212fb1d1 53 tx[1]= rx[0] & 0x0F | (0x00<<4);
caroe 0:6904212fb1d1 54 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 2);
caroe 0:6904212fb1d1 55
caroe 0:6904212fb1d1 56 Update();
caroe 0:6904212fb1d1 57 }
caroe 0:6904212fb1d1 58
caroe 0:6904212fb1d1 59
caroe 0:6904212fb1d1 60 //Rohdaten lesen
caroe 0:6904212fb1d1 61 void BMA180::ReadRawData()
caroe 0:6904212fb1d1 62 {
caroe 0:6904212fb1d1 63 //Beschleunigung für alle 3 Achsen auslesen
caroe 0:6904212fb1d1 64 char tx[1];
caroe 0:6904212fb1d1 65 char rx[6];
caroe 0:6904212fb1d1 66
caroe 0:6904212fb1d1 67 tx[0]= 0x02;
caroe 0:6904212fb1d1 68 I2CBus.write(I2CADR_W(BMA180_ADRESS), tx, 1);
caroe 0:6904212fb1d1 69 I2CBus.read (I2CADR_R(BMA180_ADRESS), rx, 6);
caroe 0:6904212fb1d1 70
caroe 0:6904212fb1d1 71 //Aus den einzelnen Bytes den 16-Bit-Wert zusammenbauen
caroe 0:6904212fb1d1 72 //Die 2 Statusbits muessen "abgeschnitten" werden
caroe 0:6904212fb1d1 73 RawAcc[0]= (rx[1]<<8|rx[0]) & 0xFFFC;
caroe 0:6904212fb1d1 74 RawAcc[1]= (rx[3]<<8|rx[2]) & 0xFFFC;
caroe 0:6904212fb1d1 75 RawAcc[2]= (rx[5]<<8|rx[4]) & 0xFFFC;
caroe 0:6904212fb1d1 76 RawAcc[0]/= 4;
caroe 0:6904212fb1d1 77 RawAcc[1]/= 4;
caroe 0:6904212fb1d1 78 RawAcc[2]/= 4;
caroe 0:6904212fb1d1 79 }
caroe 0:6904212fb1d1 80
caroe 0:6904212fb1d1 81 //Update-Methode
caroe 0:6904212fb1d1 82 void BMA180::Update()
caroe 0:6904212fb1d1 83 {
caroe 0:6904212fb1d1 84 //Beschleunigung für alle 3 Achsen auslesen
caroe 0:6904212fb1d1 85 ReadRawData();
caroe 0:6904212fb1d1 86
caroe 0:6904212fb1d1 87 //Umrechnungen
caroe 0:6904212fb1d1 88 Acc[0]= fConvMPSS * ((float)(RawAcc[0]) + Offset[0]);
caroe 0:6904212fb1d1 89 Acc[1]= fConvMPSS * ((float)(RawAcc[1]) + Offset[1]);
caroe 0:6904212fb1d1 90 Acc[2]= fConvMPSS * ((float)(RawAcc[2]) + Offset[2]);
caroe 0:6904212fb1d1 91 }
caroe 0:6904212fb1d1 92
caroe 0:6904212fb1d1 93 //Kalibrieren
caroe 0:6904212fb1d1 94 void BMA180::Calibrate(int ms, const short * pRaw1g)
caroe 0:6904212fb1d1 95 {
caroe 0:6904212fb1d1 96 float AvgCalibAcc[3]= {0.0, 0.0, 0.0};
caroe 0:6904212fb1d1 97 float AvgCalibSampels= 0.0;
caroe 0:6904212fb1d1 98
caroe 0:6904212fb1d1 99 //Ende der Kalibrierung in ms Millisekunden berechnen
caroe 0:6904212fb1d1 100 int CalibEnd= GlobalTime.read_ms() + ms;
caroe 0:6904212fb1d1 101
caroe 0:6904212fb1d1 102 while(GlobalTime.read_ms() < CalibEnd)
caroe 0:6904212fb1d1 103 {
caroe 0:6904212fb1d1 104 //Rohdaten lesen
caroe 0:6904212fb1d1 105 ReadRawData();
caroe 0:6904212fb1d1 106
caroe 0:6904212fb1d1 107 //Durchschnitt bilden
caroe 0:6904212fb1d1 108 AvgCalibAcc[0]+= (float)RawAcc[0];
caroe 0:6904212fb1d1 109 AvgCalibAcc[1]+= (float)RawAcc[1];
caroe 0:6904212fb1d1 110 AvgCalibAcc[2]+= (float)RawAcc[2];
caroe 0:6904212fb1d1 111 AvgCalibSampels+= 1.0;
caroe 0:6904212fb1d1 112
caroe 0:6904212fb1d1 113 wait_ms(2);
caroe 0:6904212fb1d1 114 }
caroe 0:6904212fb1d1 115
caroe 0:6904212fb1d1 116 //Genug Daten gesammelt, jetzt den Durchschnitt bilden
caroe 0:6904212fb1d1 117 Offset[0]= -((float)(pRaw1g[0]) + AvgCalibAcc[0] / AvgCalibSampels);
caroe 0:6904212fb1d1 118 Offset[1]= -((float)(pRaw1g[1]) + AvgCalibAcc[1] / AvgCalibSampels);
caroe 0:6904212fb1d1 119 Offset[2]= -((float)(pRaw1g[2]) + AvgCalibAcc[2] / AvgCalibSampels);
caroe 0:6904212fb1d1 120 }