上个月(Jul 2019)在公司做一个 Hackathon 项目,想的是给 PC 的屏幕加上重力感应旋转,就和手机平板一样,选择了低功耗蓝牙(BLE)获取加速度信息(可推出重力方向)。在 Windows 上写了后台程序https://github.com/hcwg/ScreenFerris,跑的很成功。演示给整个公司的同事看反响也可以。但是有一个严重的问题,就是一节 CR2032 纽扣电池只能支撑5天左右。续航严重不足。
我用的传感器是淘宝购买的,NRF51822 主控 + MPU6050 加速度计和陀螺仪,还有我用不到的环境光传感器和温度传感器。生产商是讯联电子(infor-link),产品名是 NRF51 Sensor Tag,此为硬件背景。
我显然知道现在低功耗蓝牙有多厉害,大部分设备都能用一节 CR2032 电池续航一年,显然是厂商附带的程序和我的需求不契合,导致续航不够长。于是我决定自己写一下代码,反正 ARM 的程序也不是第一次写,能有多难?在苏州用掉了两周的晚上大概搞出来了,现在续航还在测试,不过看起来电压都不怎么下降的样子。
硬件圈子分享的气氛不太浓,我就大概写下自己的心得,希望能帮助到别人。
1.减少无线电发送
我的需求很简单,就是把 Sensor 贴在显示器上,然后当显示器旋转的时候 传感器 能告诉 PC 加速度信息就行。原厂的程序没给源码,能干的事情就是由 PC 监听(Enable Notify) 传感器某个 Service 的某个 Characteristic, 每隔一秒由传感器通知 PC 当前的加速度信息。
对与这类低功耗MCU,平常运行电流都是 1-40μA 级别,但是电磁波辐射必然携带能量,所以发射信号的时候电流可达2-5mA左右,而且发射耗能是不可能避免的。所以减少发射次数显得至关重要。的讯联电子的出厂固件倒是提供了一个修改频率的接口,但是这个固定频率并不是最优的,我们演示的时候用的是 1s 间隔,如果提高间隔则响应速度会变慢,降低间隔则功耗不可接受。
我选择的方案是在片上对加速度信息做处理,计算相对上次发射的旋转角度,如果大于5°才发射,并且之后以 200ms 的间隔连续发射5次以应对连续旋转或者其他需要精度和稳定性的需求,此外每隔 10s 或者更长也发送一次以确保能保持活跃。
2.启用 NRF51822 上的片上 DCDC 模块
电池电压对于我们需要的无线电发射有点高,启用 DCDC 可以降低天线放大器的电压,降低功耗,出厂固件虽然没有源码,但是我通过调试接口确认了 DCDC 相关寄存器的设置,确定原厂固件没有启用 DCDC。
待续
3. 启用 MPU6050 的低功耗模式
MPU6050 上有加速度传感器,陀螺仪(角加速度传感器),和温度传感器。全部开启的电流约为 3.2mA。MPU6050 很贴心的提供了低功耗模式,如果只需要加速度,可以屏蔽其他功能并由 MPU6050 自行周期性睡眠,不需要 MCU 干预。在 1.25 Hz 的唤醒频率下电流为 10μ安,我采用了 5Hz的频率,电流仅为 20 μA。是原始模式的百分之一。
待续
总结
其实 MPU6050 的低功耗模式是最重要的,前两个方法加上之后都没什么明显的功耗降低。MPU6050 低功耗模式开启后效果立竿见影。
原创文章,转载请注明: 转载自Comzyh的博客
本文链接地址: NRF51822+MPU6050 蓝牙加速度传感器的功耗控制
这个能干嘛?
这个可以拿来做什么?
感谢分享,希望有更多的详细内容!