YEah

Dependents:   I2C_Temp_sensor IR_Helicopter_Controller

Fork of AccelSensor by David Gronlund

Committer:
Alegrowin
Date:
Tue Jan 15 21:58:11 2013 +0000
Revision:
1:9e97f68b2654
Parent:
0:7dd118f48b1b
Accel is working; Angle is displayed by Serial on 7seg display

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dagronlund 0:7dd118f48b1b 1 #include "mbed.h"
dagronlund 0:7dd118f48b1b 2 #include "AccelSensor.h"
Alegrowin 1:9e97f68b2654 3 Serial pc1(USBTX, USBRX); // tx, rx
dagronlund 0:7dd118f48b1b 4
dagronlund 0:7dd118f48b1b 5 AccelSensor::AccelSensor(PinName sda, PinName scl) : _i2c(sda, scl) {
dagronlund 0:7dd118f48b1b 6 //No need to initialise anything else.
dagronlund 0:7dd118f48b1b 7 }
dagronlund 0:7dd118f48b1b 8
dagronlund 0:7dd118f48b1b 9 void AccelSensor::init() {
dagronlund 0:7dd118f48b1b 10 char c = readRegister(WHO_AM_I); // Read WHO_AM_I register
dagronlund 0:7dd118f48b1b 11 standby(); // Must be in standby to change registers
dagronlund 0:7dd118f48b1b 12 char scale = GSCALE; // Set up the full scale range to 2, 4, or 8g.
dagronlund 0:7dd118f48b1b 13 if (scale > 8) scale = 8; //Easy error check
dagronlund 0:7dd118f48b1b 14 scale >>= 2; // Neat trick, see page 22. 00 = 2G, 01 = 4G, 10 = 8G
dagronlund 0:7dd118f48b1b 15 writeRegister(XYZ_DATA_CFG, scale);
dagronlund 0:7dd118f48b1b 16 active(); // Set to active to start reading
dagronlund 0:7dd118f48b1b 17 }
dagronlund 0:7dd118f48b1b 18
dagronlund 0:7dd118f48b1b 19 void AccelSensor::standby() {
dagronlund 0:7dd118f48b1b 20 char c = readRegister(CTRL_REG1);
dagronlund 0:7dd118f48b1b 21 writeRegister(CTRL_REG1, c & ~(0x01)); //Clear the active bit to go into standby
dagronlund 0:7dd118f48b1b 22 }
dagronlund 0:7dd118f48b1b 23
dagronlund 0:7dd118f48b1b 24 void AccelSensor::active() {
dagronlund 0:7dd118f48b1b 25 char c = readRegister(CTRL_REG1);
dagronlund 0:7dd118f48b1b 26 writeRegister(CTRL_REG1, c | 0x01); //Set the active bit to begin detection
dagronlund 0:7dd118f48b1b 27 }
dagronlund 0:7dd118f48b1b 28
dagronlund 0:7dd118f48b1b 29 void AccelSensor::readData(int *destination) {
dagronlund 0:7dd118f48b1b 30 char rawData[6]; // x/y/z accel register data stored here
Alegrowin 1:9e97f68b2654 31
Alegrowin 1:9e97f68b2654 32
dagronlund 0:7dd118f48b1b 33 readRegisters(OUT_X_MSB, 6, rawData); // Read the six raw data registers into data array
dagronlund 0:7dd118f48b1b 34 // Loop to calculate 12-bit ADC and g value for each axis
dagronlund 0:7dd118f48b1b 35 for(int i = 0; i < 3 ; i++) {
dagronlund 0:7dd118f48b1b 36 int value = (rawData[i*2] << 8) | rawData[(i*2)+1]; //Combine the two 8 bit registers into one 12-bit number
dagronlund 0:7dd118f48b1b 37 value >>= 4; //The registers are left align, here we right align the 12-bit integer
dagronlund 0:7dd118f48b1b 38 // If the number is negative, we have to make it so manually (no 12-bit data type)
dagronlund 0:7dd118f48b1b 39 if (rawData[i*2] > 0x7F) {
dagronlund 0:7dd118f48b1b 40 value |= 0xFFFFF << 12;
dagronlund 0:7dd118f48b1b 41 }
dagronlund 0:7dd118f48b1b 42 destination[i] = value;
dagronlund 0:7dd118f48b1b 43 }
Alegrowin 1:9e97f68b2654 44 pc1.printf("Raw: %d %d %d %d %d %d\r\n" , rawData[0],rawData[1],rawData[2],rawData[3],rawData[4],rawData[5]);
dagronlund 0:7dd118f48b1b 45 }
dagronlund 0:7dd118f48b1b 46
dagronlund 0:7dd118f48b1b 47 void AccelSensor::readRegisters(char reg, int range, char* dest) {
dagronlund 0:7dd118f48b1b 48 int ack = 0;
dagronlund 0:7dd118f48b1b 49 _i2c.start();
dagronlund 0:7dd118f48b1b 50 ack = _i2c.write((ADDRESS << 1));
dagronlund 0:7dd118f48b1b 51 ack = _i2c.write(reg);
dagronlund 0:7dd118f48b1b 52 _i2c.start();
dagronlund 0:7dd118f48b1b 53 ack = _i2c.write((ADDRESS << 1) | 0x01);
dagronlund 0:7dd118f48b1b 54 for (int i = 0; i < range - 1; i++) dest[i] = _i2c.read(1);
dagronlund 0:7dd118f48b1b 55 dest[range - 1] = _i2c.read(0);
dagronlund 0:7dd118f48b1b 56 _i2c.stop();
dagronlund 0:7dd118f48b1b 57 }
dagronlund 0:7dd118f48b1b 58
dagronlund 0:7dd118f48b1b 59 char AccelSensor::readRegister(char reg) {
dagronlund 0:7dd118f48b1b 60 int ack = 0;
dagronlund 0:7dd118f48b1b 61 _i2c.start();
dagronlund 0:7dd118f48b1b 62 ack = _i2c.write((ADDRESS << 1));
dagronlund 0:7dd118f48b1b 63 ack = _i2c.write(reg);
dagronlund 0:7dd118f48b1b 64 _i2c.start();
dagronlund 0:7dd118f48b1b 65 ack = _i2c.write((ADDRESS << 1) | 0x01);
dagronlund 0:7dd118f48b1b 66 char result = _i2c.read(0);
dagronlund 0:7dd118f48b1b 67 _i2c.stop();
dagronlund 0:7dd118f48b1b 68 return result;
dagronlund 0:7dd118f48b1b 69 }
dagronlund 0:7dd118f48b1b 70
dagronlund 0:7dd118f48b1b 71 void AccelSensor::writeRegister(char reg, char data) {
dagronlund 0:7dd118f48b1b 72 int ack = 0;
dagronlund 0:7dd118f48b1b 73 _i2c.start();
dagronlund 0:7dd118f48b1b 74 ack = _i2c.write((ADDRESS << 1));
dagronlund 0:7dd118f48b1b 75 ack = _i2c.write(reg);
dagronlund 0:7dd118f48b1b 76 ack = _i2c.write(data);
dagronlund 0:7dd118f48b1b 77 _i2c.stop();
dagronlund 0:7dd118f48b1b 78 }