I2C interface for LG1300L IMU

Dependents:   LG1300L_Hello_World LG1300L_Hello_World_LCD

LG1300L.cpp

Committer:
mjenkins11
Date:
2013-03-05
Revision:
2:9bac32f6c9a0
Parent:
0:896f1d7a0503

File content as of revision 2:9bac32f6c9a0:

#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;
}