传感器APDS9930为具有两种传感功能的芯片,一方面能够反映周围环境的亮度,另一方面能根据红外测距的原理能够感应物体的靠近。其广泛应用于手机,帮助手机做到根据环境光照强度调节屏幕背光亮度以及接听电话自动锁屏等功能。
APDS9930封装有8个脚,电和地各一个脚,I2C通信一个数据脚一个时钟脚,还有一个中断脚,可以根据用户设置的光照强度或者接近阈值来触发中断,还有脚LEDA和LEDK分别为芯片内部红外发光二极管的阳极和阴极,阴极一般直接连接芯片的最后一个脚:LDR。这个脚会根据用户的设置来产生不同频率的驱动信号来驱动发光二极管。
使用这个芯片获取环境光照强度手册说的比较清楚了,我们就简单说一下接近传感这一部分,芯片使用I2C与MCU通信,我这边的实现考虑移植性以及功能需求,决定采用IO口模拟的方式来实现与传感器通信。NXP 半导体(原 Philips半导体)于 30 多年前发明了一种简单的双向二线制串行通信总线,这个总线被称为现在被称为I2C 总线。关于I2C总线的详细介绍详见https://www.nxp.com/docs/en/user-guide/UM10204.pdf?fsrch=1&sr=1&pageNum=1。
I2C通信举个配置 APDS9930的例子简单说明。首先控制SLC和SDA发送I2C开始标志,然后发送从机地址(0x39)以及写入标志,然后等待一个数据位的ACK。然后发送8位数据COMMAND.这8位数据表明写入的寄存器地址以及操作方式(自增地址模式等),等待ack。然后发送要写入的8位数据以及等待ack,最后发送结束标志。
我们需要用I2C总线,去配置寄存器Enable Register,使能接近传感功能,Proximity Time Control Register寄存器以及Wait Time Register,配置积分转换时间以及状态机轮转等待时间,以及Proximity Pulse Count Register和Control Register寄存器,配置红外二极管的驱动脉冲数及电流等。下面列出跟接近传感功能相关的参数的意义。
PTIME:接近传感器ADC的积分转化时间,以2.73为一个单位时间。他决定了AD输出的最大Count值,虽然固定积分时间越高,在有效量程的基础上分辨率会有所提高,但是鉴于其会提升累计误差的副作用,建议还是将这个参数设置为最低的时间2.73ms,对应的AD输出MAX_Count为1023。它并不能使有效量程改变。
PGAIN: 传感器ADC的积分转化比例。他决定了AD输出与距离之间的比例,转化比例越大,距离的变化对AD输出的Count值影响会越明显红外的有效量程的起点和终端都会增大,对起点与终点在别的参数为手册推荐的时候,增大的比较明显。有效的量程会有些许增大。但是受干扰的可能性也会变大。
PDRIVE:接近红外LED驱动电流大小,分为100mA到12.5mA四个档位,推荐参数为100mA,当调整为此参数更小的时候,有效量程的起点和重点都会明显的缩短,并且量程会减小。在区分离传感器极近距离的mm级别距离变化的时候用到电流值较小。
PPULSE: 在Prox Accum状态时,驱动接近红外传感的脉冲数,其对起点与终点有明显的更改,有效的量程会有些许增大。但是受干扰的可能性也会变大。手册做的调整这个参数的实验数据截图如下:
由上图可以看出,传感器会根据所射向物体的不同灰度有不同的表现。
我们的接近功能的实现就利用AD输出满量程的这段距离。举个例子,如上图的8P的配置,灰度在18%~90%之间,其AD从满量程往下衰减的距离为4cm~8cm,及当物品在4cm~8cm之间的距离时,将会从寄存器Proximity DATA Register读出的AD值为满量程,用来区分物体是否接近。