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.
Sensors/Acc/ADXL345.cpp@2:93f703d2c4d7, 2012-10-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |