通过mpu60x0了解运动传感器

运动传感器现在几乎成了电子设备不可或缺的一部分了,手机、平板、手环、手表、vr、ar、导航、相机、游戏机甚至螺丝刀都有 。

通过mpu60x0了解运动传感器

文章插图
这种传感器有多种型号,本文通过mpu60x0为例了解这些运动传感器的使用 。
这些传感器都是MEMS微机电系统,不要看它尺寸小,里边可包含着一个加速度计和陀螺仪,而它们都是通过微小的机械结构实现的,再通过一定的手段转换为电信号,进而转换为数字信号供我们使用 。
【通过mpu60x0了解运动传感器】mpu60x0基本参数:
3轴acc:16bit,±2g, ±4g, ±8g, ±16g;
3轴gyro:16bit,±250, ±500, ±1000, ±2000°/sec (dps),支持外部同步信号;
温度:数字温度输出;
接口:i2c (400k)或 spi(1M,最高读取速度可达20M);
FIFO:1024字节;
封装:4x4x0.9mm (QFN);
供电:2.375V-3.46V,一般就选3.3V;
其他:10000g扛冲击,可编程的低通滤波器,DMP,AUX I2C;
不同品牌和系列的传感器具体参数有所差别,通过这些参数基本上就能了解到这个传感器的基本性能和适用环境 。
现在的运动传感器基本上都是以sensor hub的形式推出,除了上面的加速度和陀螺仪,hub还会集成一个处理器,通过这个处理器的加持,可以额外输出更多信息,比如数据融合后的四元素、欧拉角、手势识别、计步等等 。同时这种形式也提供了对系统更友好的性能和功耗管理,很多数据不再需要主cpu参与,这样主cpu可以处理其他事情或者进入低功耗状态 。
加速度计和陀螺仪由于工作原理不同,它们的功耗也是不同的,通常加速度计的工作电流在500uA以下,而陀螺仪的工作电流可以达到3.6mA,二者完全不在一个等级 。所以对功耗要求苛刻的应用要慎重使用陀螺仪,非必要不打开 。
数据的读取可以通过数据寄存器直接获的,也可以先放到FIFO中,过一段时间一下全读上来,如果实时性要求很高,毫无疑问得直接读,而如果对时间要求不高,对功耗又有要求,放在FIFO则是最佳选择 。
传感器一般都有一个中断输出,比如新数据产生、FIFO满、识别到运动或手势等等,使用中断能够最有效率的获取传感器的数据,而使用轮询如果频率高点,可能会获取到上一次一样的数据,频率低点则可能会丢失最新的数据 。
具体到使用,基本上就是根据我们的需要配置好寄存器,然后等待中断读取数据 。初始化阶段我们一般会先读取传感器的ID,大部分传感器都有一个自己的ID寄存器(WHO_AM_I),如果与手册上写的值一致,说明通信正常,可以进行后续操作,否则表示通信有问题,我们需要排查i2c或者spi是否正常甚至检查硬件电路是否正常 。
读取到ID以后,就可以发命令先reset传感器,让传感器处在复位状态,如果传感器复位后默认是sleep状态(mpu60x0),那就先关闭睡眠,唤醒传感器到工作状态 。到此时传感器已经可以读到加速度和陀螺仪的值了,这些值都是按照默认配置工作的(配置寄存器都是0) 。如果不符合你的需求,就需要进一步设置,比如中断、采样率、滤波器、传感器量程等等 。有些传感器有特殊的工作方式,可以自动以一定的频率在工作和睡眠之间切换,达到低功耗的目的,如果正好符合你的需求,就可以设置为这种模式,一般手册上都有详细的设置步骤 。这个地方是我写的mpu6050最简单的初始化以及进入cycle模式的代码esp-ws2812-cube/src/mpu6050.cpp · Guo Yaoxin/ws2812-cube - Gitee.com 。


采样率:mpu60x0的采样率基于陀螺仪的输出率计算得来,最高8k(只有陀螺仪可以达到),加速度最高1k,如果设置为8k,加速度会有多个重复的值 。
低通滤波:这里根据采样频率、带宽和延时来选择,一般带宽为采样频率的一半,带宽也不能太小,因为小于260的带宽都有延时,延时过大会影响下一次的采样,所以根据这三个参数就能选择一个最合适的配置 。(中间可能会有无法都满足的范围,那就避开这些频率或者酌情选择吧)
量程:量程要根据实际能达到的最大值选取,并不是越大越好,因为ADC只有16bit,采样的数字范围就是(-32768~32767),量程越大分辨率越低,测量的精度就会降低 。