你好,我在自行购置了OPT3101芯片并参考《具有抗日光功能的宽范围(120° FOV,1.6 米)接近传感参考设计》①后,自行绘制了PCB板并完成焊接工作之后,使用树莓派作为I2C的主机,OPT3101作为从机接受配置。采用树莓派的3.3V电源作为OPT3101芯片的供电。
以下是PCB板的电路原理图和PCB图
微云:share.weiyun.com/QsA25cXF
根据文档《如何设置并校准基于 OPT3101 的系统以进行接近感应》②中第二节“首次启动”完成开发板的验证:
- 上电之后,在使用内部LDO的情况下,AVDD和VDD电源上的OPT3101生成的电压均为1.8V
- INP和INM引脚电压相对于地的电压均为1V
- I2C从属线路SDA_S和SCL_S的电压为3.3V
- 模拟地和数字地通过磁珠隔离,相互之间电压为0V
验证之后,可以通过树莓派4B自带的I2C接口使用i2ctransfer命令与OPT3101进行通讯,确认可以在指定寄存器上进行读写操作,每次读取和写入都是按照24bit进行,先读写[7:0]然后读写[15:8],最后读写[23:16]
接下来按照文档②中第2.4节和文档《OPT3101 Distance Sensor System Calibration》③第二节和第四节所述进行校正,然后发现校正之后使用非HDR模式下,给TX0哪怕是最高驱动电流,PD对应的AMP输出(0x09寄存器)的输出大概只有500左右,几乎可以视作没有接收到任何信号。
起初,我们怀疑是IR和PD的选型问题,因为IR选择了一款FoV比较大的产品SFH4250S,PD选择的也是一款比较大的产品SFH 203 PFA,其中大致参数如下:
IR的前向电流典型值为100mA,Radiant intensity大概在25-50 mW/sr
PD的灵敏度为0.62 A / W
可能是IR的功率较小导致PD不能够接收到足够的红外光信号(当然不排除这种可能)使得AMP输出较小,但是进一步排查却发现TX0的管脚没有驱动电流。
具体的验证方式:
将IR拆下,两端接上一个20欧姆的电阻,如果TX0有驱动电流的话,电阻两端应该是有电压的,但是测得的电压为0,并且使用霍尔电流传感器在OPT3101的供电电源处测试的电流大小也非常小(整个OPT3101的功耗小于其正常工作时候的功率,甚至小于IR正常工作的功率)
我按照文档②的说明启动OPT3101,具体步骤如下:
- 设置采样率 写NUM_SUB_FRAMES寄存器(0x9F) 0x07 0xf0 0x7f -> 0x9F NUM_SUB_FRAMES = 127
NUM_AVG_SUB_FRAMES = 127 - 选择环境消除DAC电阻器值(消除环境光电流) IAMB_MAX_SEL寄存器(0x72[7:4]) 这里设置环境电流200mA,因此0x72[7:4]设置14
复位初始值:0x00 0x00 0xc0 = 0000 0000 0000 0000 1100 0000
写 0x00 0x00 0xe0 -> 0x72 = 0000 0000 0000 0000 1110 0000 - 通过设置TG_EN = 1寄存器(0x80)来启用时序发生器
复位初始值:0x00 0x4e 0x1e = 0000 0000 1000 1110 0001 1110
写 0x00 0x4e 0x1f -> 0x80 = 0000 0000 1000 1110 0001 1111 - 内部串扰校正:通过先后设置INT_XTALK_CALIB = 1和INT_XTALK_CALIB = 0寄存器(0x2E)来执行内部串扰校正
XTALK_FILT_TIME_CONST = 3 (0011)
复位初始值:0x80 0x01 0xa0 = 1000 0000 0000 0001 1010 0000
写 0x30 0x01 0xb0 -> 0x2E = 0011 0000 0000 0001 1011 0000
延时一段时间后,写 0x30 0x01 0xb0 -> 0x2E = 0011 0000 0000 0001 1010 0000 可以查看校正结果IPHASE_XTALK(3Bh)、QPHASE_XTALK(3Ch) - 照明串扰校正:先遮住PD,然后校正 寄存器(0x2E)
完成内部串扰校正后寄存器0x2E的值为0x30 0x01 0xb0
因为之后要读取照明串扰结果,所以将IQ_READ_DATA_SEL(0x2E[11:9])设置成 1(001)
照明串扰选择内部校准值USE_XTALK_REG_ILLUM(0x2E[8])设置成0
写 0x30 0x12 0xb0 -> 0x2E = 0011 0000 0001 0010 1010 0000
延时一段时间后,写 0x30 0x02 0xb0 -> 0x2E = 0011 0000 0000 0010 1010 0000
可以查看校正结果IPHASE_XTALK(3Bh)、QPHASE_XTALK(3Ch) - 禁用HDR并且在TX0通道上使用大电流 EN_ADAPTIVE_HDR寄存器(0x2A[15])和SEL_HDR_MODE寄存器(0x2A[16])
复位初始值:0x78 0x49 0x20 = 0111 1000 0100 1001 0010 0000
写 0x79 0xc9 0x20 -> 0x2A = 0111 1001 0100 1001 0010 0000 - 写入照明 DAC 电流 ILLUM_DAC_L_TX0 和 ILLUM_DAC_H_TX0寄存器(0x29[9:0])
复位初始值:0xc3 0x0f 0x3f = 0011 1111 0000 1111 1100 0011
要写入值:18(10010)*5.6 = 100 6(00110)*1.4 = 8.4
写 0x3f 0x0e 0x46 -> 0x29 = 0011 1111 0000 1110 0100 0110 - 编程自适应HDR阈值:HDR_THR_LOW寄存器(0x2C)和HDR_THR_HIGH寄存器(0x2B)以及照明电流DAC阶跃
2BH 复位初始值:0x00 0x60 0x00 = 0000 0000 0110 0000 0000 0000
要写入值:SCALE_H: 0(5.6mA) SCALE_L:3 (1.4mA)
HDR_HIGH:27000
写 0x03 0x69 0x78 -> 0x2B = 0000 0011 0110 1001 0111 1000
2CH 复位初始值:0x00 0x08 0x00 = 0000 0000 0000 0100 0000 0000
要写入值:HDR_LOW: 1800
写 0x00 0x07 0x08 -> 0x2C = 0000 0000 0000 0111 0000 1000 - 开启片上温度传感器 EN_TEMP_CONV(0x6E[19])
复位初始值:0x02 0x1e 0xe2 = 0000 0010 0001 1110 1110 0010
写入 0x0a 0x1e 0xe2 -> 0x6e = 0000 1010 0001 1110 1110 0010
不知道是不是寄存器配置存在问题还是不能这样测试OPT3101的TX0引脚的驱动电流。另外发现OPT3101复位后,部分寄存器的值与文档所述的默认值并不一致
Amy Luo:
您好,感谢您对TI产品的关注!首先需要向您确认的是,寄存器写入后,是否可以正确读出,即寄存器读写是否正常; 您说的—OPT3101复位后,部分寄存器的值与文档所述的默认值并不一致—-具体是指哪些寄存器呢
图片需要点击对话框右下角使用高级编辑器上传图片才能显示
colin1501:
回复 Amy Luo:
感谢您的回复:
首先,针对寄存器写入是否成功的问题,如果我向寄存器写入A值,随后读取寄存器的值也确实是A值,是否可以认为我的写入操作是OK的?(我是按照[7:0] [15:8] [23:16]的顺序一次性写入寄存器的)第二个问题,我只测试了初始化相关的几个寄存器,我发现初始化后读取0x6E寄存器的值为0x021EE2,而按照文档说明这里应该是0x020000
其他更多的寄存器我没有继续验证能否请教一下一个比较准确的初始化芯片的流程吗?按照我的理解开启TG时钟后(非触发模式下)TX0的驱动电流就应该是开启了的
(补充说明一下:我在测试的时候并没有接入GP1,GP2两个引脚)
colin1501:
回复 Amy Luo:
能否咨询一下如果需要开启TX0的电流驱动需要配置哪些寄存器
Amy Luo:
回复 colin1501:
抱歉回复迟了,0x6E寄存器的值为0x021EE2没关系,因为后面的位都是RESERVED
产品页面上的OPT3101 configurator tool可用于生成配置文件,配置文件可以添加到SDK中,然后在PC或MCU上用于配置OPT3101。SDK是用来执行配置过程的,而不需要手动写入所有寄存器。
TI提供的开发资源和配置工具可以在这里找到:
e2e.ti.com/…/815766