YEah
Dependents: I2C_Temp_sensor IR_Helicopter_Controller
Fork of AccelSensor by
AccelSensor.cpp@0:7dd118f48b1b, 2012-12-06 (annotated)
- Committer:
- dagronlund
- Date:
- Thu Dec 06 17:50:14 2012 +0000
- Revision:
- 0:7dd118f48b1b
- Child:
- 1:9e97f68b2654
First revision of mBed library for the Triple Axis Accelerometer Breakout - MMA8452Q from Sparkfun.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dagronlund | 0:7dd118f48b1b | 1 | #include "mbed.h" |
dagronlund | 0:7dd118f48b1b | 2 | #include "AccelSensor.h" |
dagronlund | 0:7dd118f48b1b | 3 | |
dagronlund | 0:7dd118f48b1b | 4 | AccelSensor::AccelSensor(PinName sda, PinName scl) : _i2c(sda, scl) { |
dagronlund | 0:7dd118f48b1b | 5 | //No need to initialise anything else. |
dagronlund | 0:7dd118f48b1b | 6 | } |
dagronlund | 0:7dd118f48b1b | 7 | |
dagronlund | 0:7dd118f48b1b | 8 | void AccelSensor::init() { |
dagronlund | 0:7dd118f48b1b | 9 | char c = readRegister(WHO_AM_I); // Read WHO_AM_I register |
dagronlund | 0:7dd118f48b1b | 10 | standby(); // Must be in standby to change registers |
dagronlund | 0:7dd118f48b1b | 11 | char scale = GSCALE; // Set up the full scale range to 2, 4, or 8g. |
dagronlund | 0:7dd118f48b1b | 12 | if (scale > 8) scale = 8; //Easy error check |
dagronlund | 0:7dd118f48b1b | 13 | scale >>= 2; // Neat trick, see page 22. 00 = 2G, 01 = 4G, 10 = 8G |
dagronlund | 0:7dd118f48b1b | 14 | writeRegister(XYZ_DATA_CFG, scale); |
dagronlund | 0:7dd118f48b1b | 15 | active(); // Set to active to start reading |
dagronlund | 0:7dd118f48b1b | 16 | } |
dagronlund | 0:7dd118f48b1b | 17 | |
dagronlund | 0:7dd118f48b1b | 18 | void AccelSensor::standby() { |
dagronlund | 0:7dd118f48b1b | 19 | char c = readRegister(CTRL_REG1); |
dagronlund | 0:7dd118f48b1b | 20 | writeRegister(CTRL_REG1, c & ~(0x01)); //Clear the active bit to go into standby |
dagronlund | 0:7dd118f48b1b | 21 | } |
dagronlund | 0:7dd118f48b1b | 22 | |
dagronlund | 0:7dd118f48b1b | 23 | void AccelSensor::active() { |
dagronlund | 0:7dd118f48b1b | 24 | char c = readRegister(CTRL_REG1); |
dagronlund | 0:7dd118f48b1b | 25 | writeRegister(CTRL_REG1, c | 0x01); //Set the active bit to begin detection |
dagronlund | 0:7dd118f48b1b | 26 | } |
dagronlund | 0:7dd118f48b1b | 27 | |
dagronlund | 0:7dd118f48b1b | 28 | void AccelSensor::readData(int *destination) { |
dagronlund | 0:7dd118f48b1b | 29 | char rawData[6]; // x/y/z accel register data stored here |
dagronlund | 0:7dd118f48b1b | 30 | readRegisters(OUT_X_MSB, 6, rawData); // Read the six raw data registers into data array |
dagronlund | 0:7dd118f48b1b | 31 | // Loop to calculate 12-bit ADC and g value for each axis |
dagronlund | 0:7dd118f48b1b | 32 | for(int i = 0; i < 3 ; i++) { |
dagronlund | 0:7dd118f48b1b | 33 | int value = (rawData[i*2] << 8) | rawData[(i*2)+1]; //Combine the two 8 bit registers into one 12-bit number |
dagronlund | 0:7dd118f48b1b | 34 | value >>= 4; //The registers are left align, here we right align the 12-bit integer |
dagronlund | 0:7dd118f48b1b | 35 | // If the number is negative, we have to make it so manually (no 12-bit data type) |
dagronlund | 0:7dd118f48b1b | 36 | if (rawData[i*2] > 0x7F) { |
dagronlund | 0:7dd118f48b1b | 37 | value |= 0xFFFFF << 12; |
dagronlund | 0:7dd118f48b1b | 38 | } |
dagronlund | 0:7dd118f48b1b | 39 | destination[i] = value; |
dagronlund | 0:7dd118f48b1b | 40 | } |
dagronlund | 0:7dd118f48b1b | 41 | } |
dagronlund | 0:7dd118f48b1b | 42 | |
dagronlund | 0:7dd118f48b1b | 43 | void AccelSensor::readRegisters(char reg, int range, char* dest) { |
dagronlund | 0:7dd118f48b1b | 44 | int ack = 0; |
dagronlund | 0:7dd118f48b1b | 45 | _i2c.start(); |
dagronlund | 0:7dd118f48b1b | 46 | ack = _i2c.write((ADDRESS << 1)); |
dagronlund | 0:7dd118f48b1b | 47 | ack = _i2c.write(reg); |
dagronlund | 0:7dd118f48b1b | 48 | _i2c.start(); |
dagronlund | 0:7dd118f48b1b | 49 | ack = _i2c.write((ADDRESS << 1) | 0x01); |
dagronlund | 0:7dd118f48b1b | 50 | for (int i = 0; i < range - 1; i++) dest[i] = _i2c.read(1); |
dagronlund | 0:7dd118f48b1b | 51 | dest[range - 1] = _i2c.read(0); |
dagronlund | 0:7dd118f48b1b | 52 | _i2c.stop(); |
dagronlund | 0:7dd118f48b1b | 53 | } |
dagronlund | 0:7dd118f48b1b | 54 | |
dagronlund | 0:7dd118f48b1b | 55 | char AccelSensor::readRegister(char reg) { |
dagronlund | 0:7dd118f48b1b | 56 | int ack = 0; |
dagronlund | 0:7dd118f48b1b | 57 | _i2c.start(); |
dagronlund | 0:7dd118f48b1b | 58 | ack = _i2c.write((ADDRESS << 1)); |
dagronlund | 0:7dd118f48b1b | 59 | ack = _i2c.write(reg); |
dagronlund | 0:7dd118f48b1b | 60 | _i2c.start(); |
dagronlund | 0:7dd118f48b1b | 61 | ack = _i2c.write((ADDRESS << 1) | 0x01); |
dagronlund | 0:7dd118f48b1b | 62 | char result = _i2c.read(0); |
dagronlund | 0:7dd118f48b1b | 63 | _i2c.stop(); |
dagronlund | 0:7dd118f48b1b | 64 | return result; |
dagronlund | 0:7dd118f48b1b | 65 | } |
dagronlund | 0:7dd118f48b1b | 66 | |
dagronlund | 0:7dd118f48b1b | 67 | void AccelSensor::writeRegister(char reg, char data) { |
dagronlund | 0:7dd118f48b1b | 68 | int ack = 0; |
dagronlund | 0:7dd118f48b1b | 69 | _i2c.start(); |
dagronlund | 0:7dd118f48b1b | 70 | ack = _i2c.write((ADDRESS << 1)); |
dagronlund | 0:7dd118f48b1b | 71 | ack = _i2c.write(reg); |
dagronlund | 0:7dd118f48b1b | 72 | ack = _i2c.write(data); |
dagronlund | 0:7dd118f48b1b | 73 | _i2c.stop(); |
dagronlund | 0:7dd118f48b1b | 74 | } |