ST加速计使用基础篇【ST工程师干货文章分享】
[复制链接]
随着手机,运动,游戏,亦即物联网的深入发展, MEMS sensor已经无处不在, 所以 有越来越多的工程师开始接触到运动传感器。 ST 拥有全球最全面的 MEMS 产品线, 加速度,陀螺仪,磁力计 已广泛应用到各个领域。 今天我给初次接触ST 加速度计的伙伴们介绍一些最基本的使用技巧。此次以lis3dh为例。
(一)sensor 设置 Lis3dh 是一颗数字的加速度计,有别于古老的模拟加速计输出模拟信号(通常是电压)来反应加速度的大小,它可以直接输出加速度数值, 原因是它内部已经将模拟信号通过ADC采样转换成了数字。既然是由ADC 采样而来的数据,这里就有两个最最要的概念.
1 FULLSCALE 就是你想要测量的范围,以LIS3DH为例,有 +- 2, +-4, +-8 ,+-16 G, 对应如下寄存器FS0-FS1 两个bit .
2 ODR ( Output data rate) 如下寄存器 ODR0-ODR3. 这四个bit定义了 power down ,1 hz 一直到5khz 的数值的输出频率。Power down 是sensor的关机模式。
到此要使的此sensor 工作,根据你的应用选着合适的FULLSCALE 和 ODR , 只要设置以上两个寄存器就可以了。是不是很简单
(二) 读取sensor 数据 Sensor 设置完了接下来又要如何得到真实的加速度数据呢? 数据输出寄存器:
六个寄存器分别以2的补码形式存储了X, Y , Z 三个轴的数据。
Step1: 读取输出寄存器,转换成对应每个轴的逻辑数(LSB ). Example: 注意以下数据类型
u8 acc_data[6]; s16 hw_d[3] = { 0 }; // 每个轴对应的逻辑数(LSB) acc_data[0] = (OUT_X_L); err = lis3dh_acc_i2c_read(stat, acc_data, 6); //读取输出六个寄存器 hw_d[0] = (((s16) ((acc_data[1] << 8) | acc_data[0])) >> 4); //X hw_d[1] = (((s16) ((acc_data[3] << 8) | acc_data[2])) >> 4); //Y hw_d[2] = (((s16) ((acc_data[5] << 8) | acc_data[4])) >> 4); //Z
这里为什么要右移4位 ,是因为lis3dh 是12 位的加速计。如果用ST 精度更高的加速计,要调整适当的右移位数。如果是16bit , 就没有必要右移了。
Step2 : 得到轴对应的LSB后, 再根据sensor 的精度值(sensitivity)计算出最终的加速 度值。 在器件的特性表里可以找到对应的精度值,四个精度值对应了四个不同的FULLSCAL. Note: 这里有很多同学习惯用sensor的fullscale 和 器件的位数反推出精度来,我想更正的是,此方法不适用于 ST的所有MEMS器件。 必须严格参考特性表里的sensitivity值。
hw_d[0] = hw_d[0] * sensitivity; // hw_d[0] 代表了最终的加速度值。 hw_d[1] = hw_d[1] * sensitivity; hw_d[2] = hw_d[2] * sensitivity;
Tips : 读取数据的方式有中断和polling的方式,这取决于应用对加速的响应速度。 在要求省电的环境时,可以使用用sensor 的fifo模式. 另外sensor还能实现一些简单的姿态 识别, 如 单击,双击, free fall, wake up 等等,请伙伴们参考此sensor的应用手册 或在以后文档中再作介绍 。 (www.st.com 有所有器件的相关文档)。
(三)加速度应用之倾角器 加速度计是测量加速度的, 根据公式F=ma ,(m是质量, a 是加速度), 因为这里质量是不变的,所以最终加速度对应的就是sensor所受的外力, 当sensor 只受到重力作用时, 它的加速度的输出就是1个g, 。 这里我们可以做个试验,分别把sensor 的x ,y ,z 轴中的一个轴垂直于地球水平面,而另外两个轴平行水平面, 你会发现垂直水平面的轴输出是1g, 而平行于水平面的轴输出是0g. 然后继续试验,把sensor 任意放在空间中,读取三个轴的数据,看看 是否x*x+y*y+z*z=1g*1g.
如下图,我们常常定义pitch 和 Roll, 分别表示 x 和 y 轴与水平面的夹角。
用三轴的加速计可以很轻易的算出pitch和Roll 两个角度。 Ax1 , Ay1 , Az1分别是三个轴的输出加速度。
Tips : 在实际应用中,由于加速计有offset, 线性等误差,会影响输出的精度,为提高计算的精度,在计算前要做必要的校准。还有一点,以上在做角度计算时前提是sensor只受到重力的作用, 如果有其他外力的影响时,可能还需要结合陀螺仪等做实时的滤波等融合算法。
|