博主最近在调试 AP3216C 三合一环境传感器,由敦南科技推出的一款传感器,支持环境光强度(ALS)、接近距离(PS)和红外线强度(IR)这三个环境参数检测。
1、前言
2、传感器特性
- I2C 接口,快速模式下波特率可以到 400Kbit/S
- 多种工作模式选择:ALS, PS+IR, ALS+PS+IR, PD 等等
- 内建温度补偿电路。
- 宽工作温度范围(-30°C ~ +80°C)。
- 超小封装,4.1mm x 2.4mm x 1.35mm
- 环境光传感器具有 16 位分辨率(0~65535)。
- 接近传感器和红外传感器具有 10 位分辨率(0~1023)。
- 4 个用户可选动态范围
- Anti-flicker rejection (reject 50/60Hz)(防闪烁抑制)
- 高灵敏度@darkened glass
- 4 个可编程红外 LED 电流输出
- 高环境光抑制
- 串扰补偿
- 符合 RoHS 安全标准
典型应用
AP3216C 常被用于手机、平板、导航设备等,其内置的接近传感器可以用于检测是否有物体接近,比如手机上用来检测耳朵是否接触听筒,如果检测到的话就表示正在打电话,手机就会关闭手机屏幕以省电。 也可以使用环境光传感器检测光照强度,可以实现自动背光亮度调节。
目标设备
功能框图
典型应用电路
3、参考资料
《AP3216C_Preliminary_Datasheet_Rev0.86.pdf》
4、引脚说明
5、工作模式
ALS,PS+IR,ALS+PS+IR,PD,ALS 一次,SW Reset,PS+IR一次和ALS + PS+IR一次。
6、I2C 读写地址
从地址0x1E
7、寄存器
系统寄存器表
翻译如下
0X00 这个寄存器是模式控制寄存器,用来设置 AP3216C 的工作模式,一般开始先将其设置为 0X04,也就是先软件复位一次 AP3216C。
接下来根据实际使用情况选择合适的工作模式,比如设置为 0X03,也就是开启 ALS+PS+IR。
从 0X0A~0X0F 这 6 个寄存器就是数据寄存器,保存着 ALS、PS 和 IR 这三个传感器获取到的数据值。
如果同时打开 ALS、PS 和 IR ,读取间隔最少要 112.5ms,因为 AP3216C 完成一次转换需要 112.5ms。
8、代码
博主用的是轮询去读数据,大家也可以配置成中断方式。
AP3216C.H
#define AP3216C_ADDR 0X1E
#define AP3216C_SYSTEMCONG 0x00
#define AP3216C_INTSTATUS 0X01
#define AP3216C_INTCLEAR 0X02
#define AP3216C_IRDATALOW 0x0A
#define AP3216C_IRDATAHIGH 0x0B
#define AP3216C_ALSDATALOW 0x0C
#define AP3216C_ALSDATAHIGH 0X0D
#define AP3216C_PSDATALOW 0X0E
#define AP3216C_PSDATAHIGH 0X0F
#define AP3216C_POWER_DOWN 0x00
#define AP3216C_ENABLE_ALL 0x03
#define AP3216C_SW_RESET 0x04
AP3216C 没有 chip id 寄存器,我们先写一个值,然后读出来,如果相等,则表示器件存在。 同时将器件初始化。
u8 AP3216C_Check_And_Init(void)
{
u8 temp;
I2C_WriteOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG,AP3216C_SW_RESET); /* SW reset */
delay_ms(50);
I2C_WriteOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG,AP3216C_ENABLE_ALL); /* enable ALS PS IR */
temp=I2C_ReadOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG);
if(temp == AP3216C_ENABLE_ALL)
return 0;
else
return 1;
}
读取数据
for(i = 0; i < 6; i++)
{
buf[i] = I2C_ReadOneByte(AP3216C_ADDR,AP3216C_IRDATALOW + i);
}
if(buf[0] & 0X80) /* IR_OF 位为 1,则数据无效 */
ir = 0;
else
ir = ((unsigned short)buf[1] << 2) | (buf[0] & 0X03);
als = ((unsigned short)buf[3] << 8) | buf[2];/* 读取 ALS 数据 */
if(buf[4] & 0x40) /* IR_OF 位为 1,则数据无效 */
ps = 0;
else
ps = ((unsigned short)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F);
printf("ALS:%u ,PS:%u ,IR:%u \\r\\n",als,ps,ir);
读取数据过程中,IR 和 ps 需要先判断数据是否有效,若有效再输出,如注释。
-
传感器
+关注
关注
2551文章
51084浏览量
753437 -
接口
+关注
关注
33文章
8593浏览量
151131 -
接近传感器
+关注
关注
5文章
189浏览量
24427 -
I2C
+关注
关注
28文章
1487浏览量
123713 -
环境传感器
+关注
关注
2文章
73浏览量
18507
发布评论请先 登录
相关推荐
评论