I2C interface for LG1300L IMU
Dependents: LG1300L_Hello_World LG1300L_Hello_World_LCD
LG1300L.cpp
- Committer:
- mjenkins11
- Date:
- 2013-03-05
- Revision:
- 0:896f1d7a0503
File content as of revision 0:896f1d7a0503:
#include "mbed.h" #include "LG1300L.h" LG1300L::LG1300L(I2C& i2c, int ACC_SETTING) : ACC_RANGE(ACC_SETTING), IMU(i2c), IMU_ADDR(0x02){ ANGLE_LSB_REG[0] = 0x42; ANGLE_MSB_REG[0] = 0x43; ROT_LSB_REG[0] = 0x44; ROT_MSB_REG[0] = 0x45; X_ACC_LSB_REG[0] = 0x46; X_ACC_MSB_REG[0] = 0x47; Y_ACC_LSB_REG[0] = 0x48; Y_ACC_MSB_REG[0] = 0x49; Z_ACC_LSB_REG[1] = 0x4A; Z_ACC_MSB_REG[1] = 0x4B; RESET_REG[0] = 0x60; SELECT_2G_REG[0] = 0x61; SELECT_4G_REG[0] = 0x62; SELECT_8G_REG[0] = 0x63; init(); } void LG1300L::init(){ IMU.frequency(9600); IMU.write(IMU_ADDR, RESET_REG, 1); switch(ACC_RANGE){ case 2: IMU.write(IMU_ADDR, SELECT_2G_REG, 1); break; case 4: IMU.write(IMU_ADDR, SELECT_4G_REG, 1); break; case 8: IMU.write(IMU_ADDR, SELECT_8G_REG, 1); break; default: break; } } float LG1300L::GetAngle(){ IMU.write(IMU_ADDR, ANGLE_LSB_REG , 1); IMU.read(IMU_ADDR, data, 2); wait(.1); ANGLE_MSB = data[1]; ANGLE_LSB = data[0]; ANGLE_MSB = ((ANGLE_MSB << 8)+ANGLE_LSB); CALC_ANG = ((float)ANGLE_MSB)/ 100.0f; return CALC_ANG; } float LG1300L::GetROT(){ IMU.write(IMU_ADDR, ROT_LSB_REG , 1); IMU.read(IMU_ADDR, data, 2); ROT_MSB = data[1]; ROT_LSB = data[0]; ROT_MSB = (ROT_MSB<<8)+ROT_LSB; CALC_ROT = ((float)ROT_MSB)/100.0f; return CALC_ROT; } float LG1300L::GetACC_X(){ IMU.write(IMU_ADDR, X_ACC_LSB_REG , 1); IMU.read(IMU_ADDR, data, 2); ACC_X_MSB = data[1]; ACC_X_LSB = data[0]; ACC_X_MSB = (ACC_X_MSB<<8)+ ACC_X_LSB; CALC_X = ((float)ACC_X_MSB/1000.0f)*(float)ACC_RANGE/2.0f; return CALC_X; } float LG1300L::GetACC_Y(){ IMU.write(IMU_ADDR, Y_ACC_LSB_REG , 1); IMU.read(IMU_ADDR, data, 2); ACC_Y_MSB = data[1]; ACC_Y_LSB = data[0]; ACC_Y_MSB = (ACC_Y_MSB<<8)+ ACC_Y_LSB; CALC_Y = ((float)ACC_Y_MSB/1000.0f)*(float)ACC_RANGE/2.0f; return CALC_Y; } float LG1300L::GetACC_Z(){ IMU.write(IMU_ADDR, Z_ACC_LSB_REG , 1); IMU.read(IMU_ADDR, data, 2); ACC_Z_MSB = data[1]; ACC_Z_LSB = data[0]; ACC_Z_MSB = (ACC_Z_MSB<<8)+ ACC_Z_LSB; CALC_Z = ((float)ACC_Z_MSB/1000.0f)*(float)ACC_RANGE/2.0f; return CALC_Z; }