加速度计和陀螺仪的测量范围、测量精度及单位换算方法

电子说

1.3w人已加入

描述

01  说在前面的话 

1. 有不少朋友在做项目的时候经常涉及到加速度计和陀螺仪的原始数据转换为其他的单位的问题,这篇文章梳理和推导一下。

      1)加速度计的原始数据 在应用时常见的转换单位有: g、m/s^2 、角度

      2)陀螺仪的原始数据 在应用时常见的转换单位有:°/s、red/s、角度
 

2. 是对 《几种常用的加速传感参数比较》 这篇文件更新,在这篇文章中将不同参加的传感器参数对比和精度参数写在一起,本文专讲精度参数和单位换算

02 测量范围和精度 

    在MEMS 传感的数据手册中都给出了加速度计和陀螺仪的测量范围和测量精度。有测量范围是可以推算出测量精度的。

  不论是加速还是陀螺仪,数据寄存器都是16位的,由于最高位是符号位,故而数据寄存器的输出范围是 -7FFF~7FFF (-32767~32767)。

  陀螺仪:

  假如,我们选择陀螺仪的测量范围是 ±2000,在数据手册中  16.4 LSB/(°/s)是 32767/2000 = 16.4 计算出来的

  那么寄存器的数字和测量范围的对应关系:
 

-32767 32767
-2000(°/s) 2000(°/s)

比如,通过寄存器读取陀螺仪的值是1000的,那么我们求角速度 X

  加速度计
  加速度:

  同样假如,我们选择加速度的测量范围是 ±16,在数据手册中  2048 LSB/g 是 32767/16 = 2048 计算出来的

  那么寄存器的数字和测量范围的对应关系:

-32767 32767
-16g 16g

比如,通过寄存器读取陀螺仪的值是1000的,那么我们求重力加速度 X X = 1000 / 2048 = 0.49g  

 03  单位换算 

加速度计

1. 不同量程下精度的计算    

 加速度计量程为:±2g        

 获取到的加速度计数据 除以16384     

加速度计量程为:±4g          

获取到的加速度计数据 除以8192     

加速度计量程为:±8g          

获取到的加速度计数据 除以4096    

加速度计量程为:±16g        

获取到的加速度计数据 除以2048

2.可以转化为带物理单位的数据,单位:g(m/s^2)

加速度计

3. 可以通过三角关系转换为角度

 

float tanalpha = 0,tanbeta = 0,tangamma = 0;


tanalpha = (float)data->rawx / sqrt( ((float)data->rawy * (float)data->rawy + (float)data->rawz * (float)data->rawz) );
data->anglex = (float)atan(tanalpha)*57.3;
tanbeta = (float)data->rawy / sqrt( ((float)data->rawx * (float)data->rawx + (float)data->rawz * (float)data->rawz)  );
data->angley = (float)atan(tanbeta)*57.3;
tangamma = (float)data->rawz / sqrt( ((float)data->rawy * (float)data->rawy + (float)data->rawx * (float)data->rawx) );
data->anglez = (float)atan(tangamma)*57.3;

 

加速度计

1. 不同量程下精度的计算     

陀螺仪量程为:±250 dps    

获取到的陀螺仪数据除以131     

陀螺仪量程为:±500 dps    

获取到的陀螺仪数据除以65.5     

陀螺仪量程为:±1000dps    

获取到的陀螺仪数据除以32.8     

陀螺仪量程为:±2000dps    

获取到的陀螺仪数据除以16.4  

2.可以转化为带物理单位的数据,单位:rad/s

加速度计

 

//原始数据
raw_data[AXIS_X] = (buf[0] << 8) | buf[1];
raw_data[AXIS_Y] = (buf[2] << 8) | buf[3];
raw_data[AXIS_Z] = (buf[4] << 8) | buf[5];
//坐标map转换
remap_data[icm_dev.cvt.axis[AXIS_X]] = icm_dev.cvt.sign[AXIS_X] * raw_data[AXIS_X];
remap_data[icm_dev.cvt.axis[AXIS_Y]] = icm_dev.cvt.sign[AXIS_Y] * raw_data[AXIS_Y];
remap_data[icm_dev.cvt.axis[AXIS_Z]] = icm_dev.cvt.sign[AXIS_Z] * raw_data[AXIS_Z];
//重力加速度计算 unit: m/s2
data->x = (float)remap_data[AXIS_X] * KSCALE_ACC_16G_RANGE;
data->y = (float)remap_data[AXIS_Y] * KSCALE_ACC_16G_RANGE;
data->z = (float)remap_data[AXIS_Z] * KSCALE_ACC_16G_RANGE;
//red/s
data->x = (float)remap_data[AXIS_X] * KSCALE_GYRO_2000_RANGE;
data->y = (float)remap_data[AXIS_Y] * KSCALE_GYRO_2000_RANGE;
data->z = (float)remap_data[AXIS_Z] * KSCALE_GYRO_2000_RANGE;

 

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分