Professional Documents
Culture Documents
LSM303DLH-BB
Version 1.0
2 Board Features
3 magnetic field channel and 3 acceleration channel
On board 1.8V regulator
I2C interface
Embedded self-test
16-bit output
6D orientation detection
2 independent programmable interrupt generator for free fall and motion detection
3 Specifications
Sensitivity range (configurable):
Accelerometer: ±2, ±4, or ±8 gauss
Magnetometer: ±1.3, ±1.9, ±2.5, ±4.0, ±4.7, ±5.6, or ±8.1 gauss
LSM303DHL package: LGA-28
Input voltage: 3.3V
LSM303DLH-BB board can be connected directly using 10 pin connector to the microcontroller. Since the
board has I2C interface, SDA and SCL lines are provided on the connector. I2C is employed to write the data
into the registers whose content can also be read back.
The board also has a 1.8V voltage regulator hence external power regulator is not required. SB1 and SB2 are
solder jumpers to pull the SDA and SCL lines high. JP1 jumper gives two I2C addresses depending upon
whether it is logic high or logic low. If JP1 is logic high (by default) then read and write are 0x33h and 0x32h
and if it logic low then read and write are 0x31h and 0x30h respectively. Figure 2 shows the pin layout for J1
header.
Figure 2 - LSM303DLH-BB pin layout
5 Pseudo Code
1.2 Register Addresses and Configuration Parameters
// LSM303 Accelerometer I2C slave address
LSM_ACC_SLAVE_ADDR = 0x30
// LSM303 Magnetometer I2C slave address
LSM_MAG_SLAVE_ADDR = 0x3C
void lsmInit()
{
// set data output rate and measurement configuration
lsmMagRegWrite(LSM_REG_MAG_CRA, LSM_MAG_CRA_REG_VAL);
// set device gain
lsmMagRegWrite(LSM_REG_MAG_CRA, LSM_MAG_CRB_REG_VAL);
// select operating mode of the device
lsmMagRegWrite(LSM_REG_MAG_MR, LSM_MAG_MR_REG_VAL);
// set output data rate and power mode selection
lsmAccRegWrite(LSM_REG_ACC_CR1, LSM_ACC_CR1_REG_VAL);
// filter settings
lsmAccRegWrite(LSM_REG_ACC_CR2, LSM_ACC_CR2_REG_VAL );
// configure interrupt
lsmAccRegWrite(LSM_REG_ACC_CR3, LSM_ACC_CR3_REG_VAL );
// range selection
lsmAccRegWrite(LSM_REG_ACC_CR4, LSM_ACC_CR4_REG_VAL );
// configure INT1 source
lsmAccRegWrite(LSM_REG_ACC_INT1_CFG, LSM_ACC_INT1_CFG_REG_VAL);
// set threshold value to validate INT1
lsmAccRegWrite(LSM_REG_ACC_INT1_THS, 0x02);
// set duration to validate INT1
lsmAccRegWrite(LSM_REG_ACC_INT1_DUR, 0x20);
// configure INT2 source
lsmAccRegWrite(LSM_REG_ACC_INT2_CFG,LSM_ACC_INT2_CFG_REG_VAL);
// set threshold value to validate INT2
lsmAccRegWrite(LSM_REG_ACC_INT2_THS, 0x02);
// set duration to validate INT2
lsmAccRegWrite(LSM_REG_ACC_INT2_DUR, 0x20);
// select reference for high pass filter
lsmAccRegWrite(LSM_REG_ACC_REF, 0x01);
}
1.4 Reading Accelerometer and Magnetometer Values
int16_t lsmMagGetRawValue(uint8_t axis)
{
uint8_t data[2];
int16_t mag_val;
// wait for data ready bit in status reg to set
do{
data[0] = lsmMagRegRead(LSM_REG_MAG_STATUS)
}while( !(data[0] & 0x01) );
switch(axis)
{
X_AXIS:
data[0] = lsmMagRegRead(LSM_REG_MAG_OUT_X_H);
data[1] = lsmMagRegRead(LSM_REG_MAG_OUT_X_L);
mag_val = (data[0] << 8) | data[1];
break;
Y_AXIS;
data[0] = lsmMagRegRead(LSM_REG_MAG_OUT_Y_H);
data[1] = lsmMagRegRead(LSM_REG_MAG_OUT_Y_L);
mag_val = (data[0] << 8) | data[1];
break;
Z_AXIS:
data[0] = lsmMagRegRead(LSM_REG_MAG_OUT_Z_H);
data[1] = lsmMagRegRead(LSM_REG_MAG_OUT_Z_L);
mag_val = (data[0] << 8) | data[1];
break;
}
return mag_val;
}
int32_t lsmGetHeadingAngle(void)
{
uint16_t comp[2];
int32_t angle;
// read x axis component
comp[0] = lsmMagGetRawValue(X_AXIS);
// read y axis component
comp[1] = lsmMagGetRawValue(Y_AXIS);
return angle;
}
raw_data = lsmMagGetRawValue(axis);
return field_strength;
}
int32_t lsmGetAcceleration(uint8_t axis)
{
uint8_t data[2];
int32_t acc_val;
switch(axis)
{
X_AXIS:
data[0] = lsmAccRegRead(LSM_REG_ACC_OUT_X_H);
data[1] = lsmAccRegRead(LSM_REG_ACC_OUT_X_L);
acc_val = (data[0] << 8) | data[1];
break;
X_AXIS:
data[0] = lsmAccRegRead(LSM_REG_ACC_OUT_X_H);
data[1] = lsmAccRegRead(LSM_REG_ACC_OUT_X_L);
acc_val = (data[0] << 8) | data[1];
break;
X_AXIS:
data[0] = lsmAccRegRead(LSM_REG_ACC_OUT_X_H);
data[1] = lsmAccRegRead(LSM_REG_ACC_OUT_X_L);
acc_val = (data[0] << 8) | data[1];
break;
}
return acc_val;
}
6 References
LSM303DHL datasheet: http://www.st.com/web/en/resource/technical/document/datasheet/CD00260288.pdf