搜索

7

主题

15

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 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;


回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表