lib
Diff: H3LIS331.cpp
- Revision:
- 0:ecac7a6076f0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/H3LIS331.cpp Tue Nov 18 18:49:19 2014 +0000 @@ -0,0 +1,197 @@ +/** + * Includes + */ + +#include "H3LIS331.h" + +H3LIS331::H3LIS331(PinName sda, PinName scl) : i2c_(sda, scl) { + // set default scaling factor + scaling_factor = 5140.0; + + //set default range to zero. + //current_range = 0; + + //400kHz, fast mode. + i2c_.frequency(400000); + + + //Power Up Device, Set Output data rate, Enable All 3 Axis + //See datasheet for details. + char tx[2]; + //char tx2[2]; + //char rx[1]; + tx[0] = CTRL_REG_1; + //CTRL_REG_1 [00111111] / [0x3F] to power up, set output rate to 1000Hz, and enable all 3 axis. + //CTRL_REG_1 [00101111] / [0x2F] to power up, set output rate to 100Hz, and enable all 3 axis. + //CTRL_REG_1 [ABCDEFGH] ABC=PowerMode, DE=OutputDataRate, F=Zenable, G=Yenable, H=XEnable + tx[1] = 0x2F; + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2); + + + + //set default scale of 4g's + //scaling_factor = 8192.0; + //current_range = 24; + + tx[0] = CTRL_REG_4; + tx[1] = 0x00; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2); + + + +} + +char H3LIS331::getWhoAmI(void){ + + //WhoAmI Register address. + char tx = WHO_AM_I_REG_H3LIS331; + char rx; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1); + + return rx; + +} + + + + +void H3LIS331::setPowerMode(char power_mode){ +// Currently sets all 3 axis to enabled. Will be set to preserve existing status in future + char tx[2]; + tx[0] = CTRL_REG_1; + tx[1] = power_mode; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2); + +} + +char H3LIS331::getPowerMode(void){ + + char tx = CTRL_REG_1; + char rx; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1); + + + return rx; + +} + + + +char H3LIS331::getInterruptConfiguration(void){ + + char tx = CTRL_REG_3; + char rx; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1); + + return rx; + +} + + +void H3LIS331::setFullScaleRange400g(void){ // Does not preserve rest of CTRL_REG_4! + scaling_factor = 81.92; + current_range = 400; + + char tx[2]; + tx[0] = CTRL_REG_4; + tx[1] = 0x30; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2); + +} + +void H3LIS331::setFullScaleRange200g(void){ // Does not preserve rest of CTRL_REG_4! + scaling_factor = 163.84; + current_range = 200; + + char tx[2]; + tx[0] = CTRL_REG_4; + tx[1] = 0x10; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2); + +} + + +void H3LIS331::setFullScaleRange100g(void){ // Does not preserve rest of CTRL_REG_4! + scaling_factor = 327.68; + current_range = 100; + + char tx[2]; + tx[0] = CTRL_REG_4; + tx[1] = 0x00; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2); + +} + + +char H3LIS331::getAccelStatus(void){ + + char tx = STATUS_REG; + char rx; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1); + + return rx; +} + + + +float H3LIS331::getAccelX(void){ + + char tx = ACCEL_XOUT_H_REG; + char rx[2]; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2); + + int16_t output = ((int) rx[0] << 8) | ((int) rx[1]); + + return output/scaling_factor; + //return output; + +} + +float H3LIS331::getAccelY(void){ + + char tx = ACCEL_YOUT_H_REG; + char rx[2]; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2); + + int16_t output = ((int) rx[0] << 8) | ((int) rx[1]); + + return output/scaling_factor; + +} + +float H3LIS331::getAccelZ(void){ + + char tx = ACCEL_ZOUT_H_REG; + char rx[2]; + + i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1); + + i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2); + + int16_t output = ((int) rx[0] << 8) | ((int) rx[1]); + + return output/scaling_factor; +} \ No newline at end of file