最近弄了2个APDS9930模块,本来想精准的测试一下距离,但是最终经过测试,发现测出来的距离其实不是很准。
一、硬件以及连接方式
其中,出了INT可以不连,其他的必须连。
注:VL连3.3V,我最开始没有连,导致读不到距离,浪费了一段时间。 想想自己也挺二的,APDS9930毕竟是个模-数转换设备,肯定要有个参考电压呀。
二、程序
用STC的单片机写了个51程序。
http://download.csdn.net/download/j524265813/9931749
用openwrt也写了一份
http://download.csdn.net/download/j524265813/9931758
结果会写到rst1.csv里,注意每次运行前清理之前的rst1.csv
三、尝试模拟出计算距离的公式
但是距离都测不准。文档中也没有给出具体公式,就简单画了个图:
我自己亲自测试了下,曲线是比较类似:(ATIME=PTIME=0XF7,PPLUSE=0X8):
测试过程比较简单粗暴,就是把APDS9930固定到一个位置后,移动前面的遮挡物(速度靠感觉)
C1和C1.1是第一个APDS9930的连续两次测试。
C2是另外一个APDS9930的一次测试。
那么我想有可能两次手速不一样,导致测的结果存在较大差异吧,因此我把两个APDS9930固定到了一起,然后把程序改成控制2个I2C设备(由于地址都是0x39,无法用1个I2C接口来驱动),得到的结果是这样的:
我又试了很多次,也交换了两个APDS9930的位置,得到的结果永远是Prox_data先衰减,因此我觉得,可以确认不同的设备,具体距离曲线是有差异的。(我是在两个淘宝店买的)
两者分别进行拟合,得到的函数也看不到什么关联:
Prox_data:
Pro_data1:
从测试情况来看,APDS9930是没有一个准确公式来计算出距离的。哪位有什么好的办法,还请赐教。
四、一点总结
ATIME,PTIME:设置越小,意味着采样时间越长,得到的计数值越大。
比如设置为0xff时,实际是一个采样周期(256-0xff=1),那么采样时间为2.73ms。
另外还发现一点:设置成0xff时,测量到的范围很小,但是精度很高;设置成0x00时,测量范围很大,但是精度会降低。拿距离来举例,设置成.0xff时,可能量程只有5cm,设置成0x00时,量程能到15cm+。