本帖最后由 fkylin 于 2016-11-23 16:04 编辑
下面的代码是LIS3DH的初始化流程,基本上所有的acc和gyro都可以按照下面的流程初始化:读WHOAMI-->设置ODR-->设置POWER MODE-->设置Full Scale-->使能三轴输出
HAL_I2C_Init();
LIS3DH_GetWHO_AM_I(&dump);
DEBUGOUT("LIS3DH ID:%x\n", dump);
/* Set ODR (turn ON device) */
response = LIS3DH_SetODR(LIS3DH_ODR_400Hz);
if (response == 1) {
DEBUGOUT("SET_ODR_OK\r\n");
}
/* Set PowerMode */
response = LIS3DH_SetMode(LIS3DH_NORMAL);
if (response == 1) {
DEBUGOUT("SET_MODE_OK\r\n");
}
/* Set Fullscale */
response = LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);
if (response == 1) {
DEBUGOU("SET_FULLSCALE_OK\r\n");
}
/* Set axis Enable */
response = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);
if (response == 1)
{
DEBUGOUT("SET_AXIS_OK\r\n");}
复制代码下面是将寄存器值转为重力加速度的一个方法,例子是基于LIS3DH编写的,由于LIS3DH是12bit左对齐的方式存储数据,因此需要将高位和地位拼接之后再右移。注意:组合后的最高位为符号位,以补码方式存储。
/* Data bytes from hardware xL, xH, yL, yH, zL, zH */
u8 acc_data[6];
s16 hw_d[3] = { 0 };
err = acc_i2c_read_data(stat, acc_data, 6);
if (err < 0)
return err;
//LIS3DH是一个12bit,左对齐的输出,如果16bit精度的话,数据不需要移位
hw_d[0] = ( (s16) ( ( (acc_data[1] >4;
hw_d[1] = ( (s16) ( ( (acc_data[3] >4;
hw_d[2] = ( (s16) ( ( (acc_data[5] >4;
hw_d[0] = hw_d[0] * sensitivity;
hw_d[1] = hw_d[1] * sensitivity;
hw_d[2] = hw_d[2] * sensitivity;
复制代码