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:
Tue Oct 02 17:53:40 2012 +0000
Revision:
2:93f703d2c4d7
Parent:
1:5a64632b1eb9
Child:
10:953afcbcebfc
erstes experiment mit funktionierendem filter (nur eine Achse und noch nicht optimal)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maetugr 2:93f703d2c4d7 1 #include "ADXL345.h"
maetugr 2:93f703d2c4d7 2 #include "mbed.h"
maetugr 2:93f703d2c4d7 3
maetugr 2:93f703d2c4d7 4 ADXL345::ADXL345(PinName sda, PinName scl) : i2c(sda, scl) {
maetugr 2:93f703d2c4d7 5
maetugr 2:93f703d2c4d7 6 //400kHz, allowing us to use the fastest data rates.
maetugr 2:93f703d2c4d7 7 //there are other chips on board, sorry
maetugr 2:93f703d2c4d7 8 i2c.frequency(400000);
maetugr 2:93f703d2c4d7 9 // initialize the BW data rate
maetugr 2:93f703d2c4d7 10 char tx[2];
maetugr 2:93f703d2c4d7 11 tx[0] = ADXL345_BW_RATE_REG;
maetugr 2:93f703d2c4d7 12 tx[1] = ADXL345_1600HZ; //value greater than or equal to 0x0A is written into the rate bits (Bit D3 through Bit D0) in the BW_RATE register
maetugr 2:93f703d2c4d7 13 i2c.write( ADXL345_WRITE , tx, 2);
maetugr 2:93f703d2c4d7 14
maetugr 2:93f703d2c4d7 15 //Data format (for +-16g) - This is done by setting Bit D3 of the DATA_FORMAT register (Address 0x31) and writing a value of 0x03 to the range bits (Bit D1 and Bit D0) of the DATA_FORMAT register (Address 0x31).
maetugr 2:93f703d2c4d7 16
maetugr 2:93f703d2c4d7 17 char rx[2];
maetugr 2:93f703d2c4d7 18 rx[0] = ADXL345_DATA_FORMAT_REG;
maetugr 2:93f703d2c4d7 19 rx[1] = 0x0B;
maetugr 2:93f703d2c4d7 20 // full res and +_16g
maetugr 2:93f703d2c4d7 21 i2c.write( ADXL345_WRITE , rx, 2);
maetugr 2:93f703d2c4d7 22
maetugr 2:93f703d2c4d7 23 // Set Offset - programmed into the OFSX, OFSY, and OFXZ registers, respectively, as 0xFD, 0x03 and 0xFE.
maetugr 2:93f703d2c4d7 24 char x[2];
maetugr 2:93f703d2c4d7 25 x[0] = ADXL345_OFSX_REG ;
maetugr 2:93f703d2c4d7 26 //x[1] = 0xFD;
maetugr 2:93f703d2c4d7 27 x[1] = 0x00;
maetugr 2:93f703d2c4d7 28 i2c.write( ADXL345_WRITE , x, 2);
maetugr 2:93f703d2c4d7 29 char y[2];
maetugr 2:93f703d2c4d7 30 y[0] = ADXL345_OFSY_REG ;
maetugr 2:93f703d2c4d7 31 //y[1] = 0x03;
maetugr 2:93f703d2c4d7 32 y[1] = 0x00;
maetugr 2:93f703d2c4d7 33 i2c.write( ADXL345_WRITE , y, 2);
maetugr 2:93f703d2c4d7 34 char z[2];
maetugr 2:93f703d2c4d7 35 z[0] = ADXL345_OFSZ_REG ;
maetugr 2:93f703d2c4d7 36 //z[1] = 0xFE;
maetugr 2:93f703d2c4d7 37 z[1] = 0x00;
maetugr 2:93f703d2c4d7 38 i2c.write( ADXL345_WRITE , z, 2);
maetugr 2:93f703d2c4d7 39
maetugr 2:93f703d2c4d7 40 // MY INITIALISATION -------------------------------------------------------
maetugr 2:93f703d2c4d7 41
maetugr 2:93f703d2c4d7 42 writeReg(ADXL345_POWER_CTL_REG, 0x00); // set power control
maetugr 2:93f703d2c4d7 43 writeReg(ADXL345_DATA_FORMAT_REG, 0x0B); // set data format
maetugr 2:93f703d2c4d7 44 setDataRate(ADXL345_3200HZ); // set data rate
maetugr 2:93f703d2c4d7 45 writeReg(ADXL345_POWER_CTL_REG, 0x08); // set mode
maetugr 2:93f703d2c4d7 46 }
maetugr 2:93f703d2c4d7 47
maetugr 2:93f703d2c4d7 48 void ADXL345::read(int a[3]){
maetugr 2:93f703d2c4d7 49 char buffer[6];
maetugr 2:93f703d2c4d7 50 readMultiReg(ADXL345_DATAX0_REG, buffer, 6);
maetugr 2:93f703d2c4d7 51
maetugr 2:93f703d2c4d7 52 a[0] = (short) ((int)buffer[1] << 8 | (int)buffer[0]);
maetugr 2:93f703d2c4d7 53 a[1] = (short) ((int)buffer[3] << 8 | (int)buffer[2]);
maetugr 2:93f703d2c4d7 54 a[2] = (short) ((int)buffer[5] << 8 | (int)buffer[4]);
maetugr 2:93f703d2c4d7 55 }
maetugr 2:93f703d2c4d7 56
maetugr 2:93f703d2c4d7 57 int ADXL345::writeReg(char address, char data){
maetugr 2:93f703d2c4d7 58 int ack = 0;
maetugr 2:93f703d2c4d7 59 char tx[2];
maetugr 2:93f703d2c4d7 60 tx[0] = address;
maetugr 2:93f703d2c4d7 61 tx[1] = data;
maetugr 2:93f703d2c4d7 62 return ack | i2c.write(ADXL345_WRITE, tx, 2);
maetugr 2:93f703d2c4d7 63 }
maetugr 2:93f703d2c4d7 64
maetugr 2:93f703d2c4d7 65 char ADXL345::readReg(char address){
maetugr 2:93f703d2c4d7 66 char tx = address;
maetugr 2:93f703d2c4d7 67 char output;
maetugr 2:93f703d2c4d7 68 i2c.write( ADXL345_WRITE , &tx, 1); //tell it what you want to read
maetugr 2:93f703d2c4d7 69 i2c.read( ADXL345_READ , &output, 1); //tell it where to store the data
maetugr 2:93f703d2c4d7 70 return output;
maetugr 2:93f703d2c4d7 71 }
maetugr 2:93f703d2c4d7 72
maetugr 2:93f703d2c4d7 73 void ADXL345::readMultiReg(char address, char* output, int size) {
maetugr 2:93f703d2c4d7 74 i2c.write(ADXL345_WRITE, &address, 1); //tell it where to read from
maetugr 2:93f703d2c4d7 75 i2c.read(ADXL345_READ , output, size); //tell it where to store the data read
maetugr 2:93f703d2c4d7 76 }
maetugr 2:93f703d2c4d7 77
maetugr 2:93f703d2c4d7 78 int ADXL345::setDataRate(char rate) {
maetugr 2:93f703d2c4d7 79 //Get the current register contents, so we don't clobber the power bit.
maetugr 2:93f703d2c4d7 80 char registerContents = readReg(ADXL345_BW_RATE_REG);
maetugr 2:93f703d2c4d7 81
maetugr 2:93f703d2c4d7 82 registerContents &= 0x10;
maetugr 2:93f703d2c4d7 83 registerContents |= rate;
maetugr 2:93f703d2c4d7 84
maetugr 2:93f703d2c4d7 85 return writeReg(ADXL345_BW_RATE_REG, registerContents);
maetugr 2:93f703d2c4d7 86 }