I2C interface for LG1300L IMU

Dependents:   LG1300L_Hello_World LG1300L_Hello_World_LCD

Committer:
mjenkins11
Date:
Tue Mar 05 04:56:36 2013 +0000
Revision:
2:9bac32f6c9a0
Parent:
0:896f1d7a0503
revision 0.5;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mjenkins11 0:896f1d7a0503 1 #include "mbed.h"
mjenkins11 0:896f1d7a0503 2
mjenkins11 0:896f1d7a0503 3 #include "LG1300L.h"
mjenkins11 0:896f1d7a0503 4
mjenkins11 0:896f1d7a0503 5
mjenkins11 0:896f1d7a0503 6 LG1300L::LG1300L(I2C& i2c, int ACC_SETTING)
mjenkins11 0:896f1d7a0503 7 : ACC_RANGE(ACC_SETTING), IMU(i2c), IMU_ADDR(0x02){
mjenkins11 0:896f1d7a0503 8
mjenkins11 0:896f1d7a0503 9 ANGLE_LSB_REG[0] = 0x42;
mjenkins11 0:896f1d7a0503 10 ANGLE_MSB_REG[0] = 0x43;
mjenkins11 0:896f1d7a0503 11 ROT_LSB_REG[0] = 0x44;
mjenkins11 0:896f1d7a0503 12 ROT_MSB_REG[0] = 0x45;
mjenkins11 0:896f1d7a0503 13 X_ACC_LSB_REG[0] = 0x46;
mjenkins11 0:896f1d7a0503 14 X_ACC_MSB_REG[0] = 0x47;
mjenkins11 0:896f1d7a0503 15 Y_ACC_LSB_REG[0] = 0x48;
mjenkins11 0:896f1d7a0503 16 Y_ACC_MSB_REG[0] = 0x49;
mjenkins11 0:896f1d7a0503 17 Z_ACC_LSB_REG[1] = 0x4A;
mjenkins11 0:896f1d7a0503 18 Z_ACC_MSB_REG[1] = 0x4B;
mjenkins11 0:896f1d7a0503 19
mjenkins11 0:896f1d7a0503 20 RESET_REG[0] = 0x60;
mjenkins11 0:896f1d7a0503 21 SELECT_2G_REG[0] = 0x61;
mjenkins11 0:896f1d7a0503 22 SELECT_4G_REG[0] = 0x62;
mjenkins11 0:896f1d7a0503 23 SELECT_8G_REG[0] = 0x63;
mjenkins11 0:896f1d7a0503 24
mjenkins11 0:896f1d7a0503 25 init();
mjenkins11 0:896f1d7a0503 26 }
mjenkins11 0:896f1d7a0503 27
mjenkins11 0:896f1d7a0503 28
mjenkins11 0:896f1d7a0503 29 void LG1300L::init(){
mjenkins11 0:896f1d7a0503 30
mjenkins11 0:896f1d7a0503 31 IMU.frequency(9600);
mjenkins11 0:896f1d7a0503 32 IMU.write(IMU_ADDR, RESET_REG, 1);
mjenkins11 0:896f1d7a0503 33 switch(ACC_RANGE){
mjenkins11 0:896f1d7a0503 34 case 2: IMU.write(IMU_ADDR, SELECT_2G_REG, 1);
mjenkins11 0:896f1d7a0503 35 break;
mjenkins11 0:896f1d7a0503 36 case 4: IMU.write(IMU_ADDR, SELECT_4G_REG, 1);
mjenkins11 0:896f1d7a0503 37 break;
mjenkins11 0:896f1d7a0503 38 case 8: IMU.write(IMU_ADDR, SELECT_8G_REG, 1);
mjenkins11 0:896f1d7a0503 39 break;
mjenkins11 0:896f1d7a0503 40 default: break;
mjenkins11 0:896f1d7a0503 41 }
mjenkins11 0:896f1d7a0503 42 }
mjenkins11 0:896f1d7a0503 43
mjenkins11 0:896f1d7a0503 44 float LG1300L::GetAngle(){
mjenkins11 0:896f1d7a0503 45
mjenkins11 0:896f1d7a0503 46 IMU.write(IMU_ADDR, ANGLE_LSB_REG , 1);
mjenkins11 0:896f1d7a0503 47 IMU.read(IMU_ADDR, data, 2);
mjenkins11 0:896f1d7a0503 48 wait(.1);
mjenkins11 0:896f1d7a0503 49 ANGLE_MSB = data[1];
mjenkins11 0:896f1d7a0503 50 ANGLE_LSB = data[0];
mjenkins11 0:896f1d7a0503 51 ANGLE_MSB = ((ANGLE_MSB << 8)+ANGLE_LSB);
mjenkins11 0:896f1d7a0503 52 CALC_ANG = ((float)ANGLE_MSB)/ 100.0f;
mjenkins11 0:896f1d7a0503 53 return CALC_ANG;
mjenkins11 0:896f1d7a0503 54 }
mjenkins11 0:896f1d7a0503 55
mjenkins11 0:896f1d7a0503 56 float LG1300L::GetROT(){
mjenkins11 0:896f1d7a0503 57
mjenkins11 0:896f1d7a0503 58 IMU.write(IMU_ADDR, ROT_LSB_REG , 1);
mjenkins11 0:896f1d7a0503 59 IMU.read(IMU_ADDR, data, 2);
mjenkins11 0:896f1d7a0503 60 ROT_MSB = data[1];
mjenkins11 0:896f1d7a0503 61 ROT_LSB = data[0];
mjenkins11 0:896f1d7a0503 62 ROT_MSB = (ROT_MSB<<8)+ROT_LSB;
mjenkins11 0:896f1d7a0503 63 CALC_ROT = ((float)ROT_MSB)/100.0f;
mjenkins11 0:896f1d7a0503 64 return CALC_ROT;
mjenkins11 0:896f1d7a0503 65 }
mjenkins11 0:896f1d7a0503 66
mjenkins11 0:896f1d7a0503 67 float LG1300L::GetACC_X(){
mjenkins11 0:896f1d7a0503 68 IMU.write(IMU_ADDR, X_ACC_LSB_REG , 1);
mjenkins11 0:896f1d7a0503 69 IMU.read(IMU_ADDR, data, 2);
mjenkins11 0:896f1d7a0503 70 ACC_X_MSB = data[1];
mjenkins11 0:896f1d7a0503 71 ACC_X_LSB = data[0];
mjenkins11 0:896f1d7a0503 72 ACC_X_MSB = (ACC_X_MSB<<8)+ ACC_X_LSB;
mjenkins11 0:896f1d7a0503 73 CALC_X = ((float)ACC_X_MSB/1000.0f)*(float)ACC_RANGE/2.0f;
mjenkins11 0:896f1d7a0503 74 return CALC_X;
mjenkins11 0:896f1d7a0503 75 }
mjenkins11 0:896f1d7a0503 76
mjenkins11 0:896f1d7a0503 77 float LG1300L::GetACC_Y(){
mjenkins11 0:896f1d7a0503 78
mjenkins11 0:896f1d7a0503 79 IMU.write(IMU_ADDR, Y_ACC_LSB_REG , 1);
mjenkins11 0:896f1d7a0503 80 IMU.read(IMU_ADDR, data, 2);
mjenkins11 0:896f1d7a0503 81 ACC_Y_MSB = data[1];
mjenkins11 0:896f1d7a0503 82 ACC_Y_LSB = data[0];
mjenkins11 0:896f1d7a0503 83 ACC_Y_MSB = (ACC_Y_MSB<<8)+ ACC_Y_LSB;
mjenkins11 0:896f1d7a0503 84 CALC_Y = ((float)ACC_Y_MSB/1000.0f)*(float)ACC_RANGE/2.0f;
mjenkins11 0:896f1d7a0503 85 return CALC_Y;
mjenkins11 0:896f1d7a0503 86 }
mjenkins11 0:896f1d7a0503 87
mjenkins11 0:896f1d7a0503 88 float LG1300L::GetACC_Z(){
mjenkins11 0:896f1d7a0503 89
mjenkins11 0:896f1d7a0503 90 IMU.write(IMU_ADDR, Z_ACC_LSB_REG , 1);
mjenkins11 0:896f1d7a0503 91 IMU.read(IMU_ADDR, data, 2);
mjenkins11 0:896f1d7a0503 92 ACC_Z_MSB = data[1];
mjenkins11 0:896f1d7a0503 93 ACC_Z_LSB = data[0];
mjenkins11 0:896f1d7a0503 94 ACC_Z_MSB = (ACC_Z_MSB<<8)+ ACC_Z_LSB;
mjenkins11 0:896f1d7a0503 95 CALC_Z = ((float)ACC_Z_MSB/1000.0f)*(float)ACC_RANGE/2.0f;
mjenkins11 0:896f1d7a0503 96 return CALC_Z;
mjenkins11 0:896f1d7a0503 97 }