|
发表于 2020-8-12 16:28:01
15425 浏览 0 回复
BMI160 G-snesor数据精确度要求达到小数点后六位
bmi160 加速度传感器的精确度修改方法:以XY8735 6.0系统为例:
path:MT8735_alps-mp-m0.mp1_TB\kernel-3.18\drivers\misc\mediatek\hwmon\include\hwmsen_dev.h
-#define GRAVITY_EARTH_1000 9807 /* about (9.80665f)*1000 */
+#define GRAVITY_EARTH_1000 9807000 /* about (9.80665f)*1000 */
path:MT8735_alps-mp-m0.mp1_TB\kernel-3.18\drivers\misc\mediatek\accelerometer\bmi160_acc\bmi160_acc.c
+static struct data_resolution bmi160_acc_offset_resolution = {{0, 6}, 16384};
+err = bmi160_acc_set_data_range(client, BMI160_ACCEL_RANGE_2G);//初始化设置范围为2G
在读取数据的函数bmi160_acc_read_sensor_data中修改数据的范围
static int bmi160_acc_read_sensor_data(
struct i2c_client *client, char *buf, int bufsize)
{
int err = 0;
int acc[BMI160_ACC_AXES_NUM] = { 0 };
+ long int g_sensor_buf[BMI160_ACC_AXES_NUM]={ 0 };
s16 databuf[BMI160_ACC_AXES_NUM] = { 0 };
struct bmi160_acc_i2c_data *obj = obj_i2c_data;
if (sensor_power == false) {
err = bmi160_acc_set_power_mode(client, true);
if (err) {
GSE_ERR("set power on acc failed.\n");
return err;
}
}
err = bmi160_acc_read_data(client, databuf);
if (err) {
GSE_ERR("read acc data failed.\n");
return err;
} else {
databuf[BMI160_ACC_AXIS_X] += obj->cali_sw[BMI160_ACC_AXIS_X];
databuf[BMI160_ACC_AXIS_Y] += obj->cali_sw[BMI160_ACC_AXIS_Y];
databuf[BMI160_ACC_AXIS_Z] += obj->cali_sw[BMI160_ACC_AXIS_Z];
/* remap coordinate */
acc[obj->cvt.map[BMI160_ACC_AXIS_X]] =
obj->cvt.sign[BMI160_ACC_AXIS_X] *
databuf[BMI160_ACC_AXIS_X];
acc[obj->cvt.map[BMI160_ACC_AXIS_Y]] =
obj->cvt.sign[BMI160_ACC_AXIS_Y] *
databuf[BMI160_ACC_AXIS_Y];
acc[obj->cvt.map[BMI160_ACC_AXIS_Z]] =
obj->cvt.sign[BMI160_ACC_AXIS_Z] *
databuf[BMI160_ACC_AXIS_Z];
/* Output the mg */
+ g_sensor_buf[BMI160_ACC_AXIS_X] = (long int)acc[BMI160_ACC_AXIS_X] *
+ GRAVITY_EARTH_1000 / obj->reso->sensitivity;
+ g_sensor_buf[BMI160_ACC_AXIS_Y] = (long int)acc[BMI160_ACC_AXIS_Y] *
+ GRAVITY_EARTH_1000 / obj->reso->sensitivity;
+ g_sensor_buf[BMI160_ACC_AXIS_Z] = (long int)acc[BMI160_ACC_AXIS_Z] *
+ GRAVITY_EARTH_1000 / obj->reso->sensitivity;
+ acc[BMI160_ACC_AXIS_X] = (int)g_sensor_buf[BMI160_ACC_AXIS_X];
+ acc[BMI160_ACC_AXIS_Y] = (int)g_sensor_buf[BMI160_ACC_AXIS_Y];
+ acc[BMI160_ACC_AXIS_Z] = (int)g_sensor_buf[BMI160_ACC_AXIS_Z];
GSE_ERR("acc final xyz data: %d,%d,%d, sens:%d\n",
acc[0], acc[1], acc[2], obj->reso->sensitivity);
snprintf(buf, 96, "%04x %04x %04x",
acc[BMI160_ACC_AXIS_X],
acc[BMI160_ACC_AXIS_Y],
acc[BMI160_ACC_AXIS_Z]);
}
return 0;
}
在bmi160_acc_get_data函数中修改
static int bmi160_acc_get_data(int *x, int *y, int *z, int *status)
{
int err = 0;
char buff[BMI160_BUFSIZE];
err = bmi160_acc_read_sensor_data(
obj_i2c_data->client, buff, BMI160_BUFSIZE);
if (err < 0) {
GSE_ERR("bmi160_acc_get_data failed.\n");
return err;
}
sscanf(buff, "%x %x %x", x, y, z);
+ *status = SENSOR_STATUS_ACCURACY_HIGH;
return 0;
}
在bmi160_acc_i2c_probe函数中修改G_sensor数据厂商除数值(放大倍数)
+data.vender_div = 1000000;
|
|
|
|
|
|
|
登录或注册
|