AP3216C三合一环境传感器使用指南

描述

博主最近在调试 AP3216C 三合一环境传感器,由敦南科技推出的一款传感器,支持环境光强度(ALS)、接近距离(PS)和红外线强度(IR)这三个环境参数检测。

1、前言

该芯片可以通过 I2C 接口与主控制相连,并且支持中断。

2、传感器特性

  1. I2C 接口,快速模式下波特率可以到 400Kbit/S
  2. 多种工作模式选择:ALS, PS+IR, ALS+PS+IR, PD 等等
  3. 内建温度补偿电路。
  4. 宽工作温度范围(-30°C ~ +80°C)。
  5. 超小封装,4.1mm x 2.4mm x 1.35mm
  6. 环境光传感器具有 16 位分辨率(0~65535)。
  7. 接近传感器和红外传感器具有 10 位分辨率(0~1023)。
  8. 4 个用户可选动态范围
  9. Anti-flicker rejection (reject 50/60Hz)(防闪烁抑制)
  10. 高灵敏度@darkened glass
  11. 4 个可编程红外 LED 电流输出
  12. 高环境光抑制
  13. 串扰补偿
  14. 符合 RoHS 安全标准

典型应用

AP3216C 常被用于手机、平板、导航设备等,其内置的接近传感器可以用于检测是否有物体接近,比如手机上用来检测耳朵是否接触听筒,如果检测到的话就表示正在打电话,手机就会关闭手机屏幕以省电。 也可以使用环境光传感器检测光照强度,可以实现自动背光亮度调节。

目标设备

  1. 手机、平板电脑
  2. 个人导航系统
  3. 笔记本电脑/超级本
  4. LCD/PDP电视背光系统
  5. 数码相框
  6. 电容式触摸面板的应用

功能框图

接口

典型应用电路

接口

接口

接口

接口

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 需要先判断数据是否有效,若有效再输出,如注释。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分