在线时间28 小时
UID1650185
ROHM金币0
注册时间2018-5-3
该用户从未签到
金牌会员
- 最后登录
- 2022-3-30
|
照度接近传感器主要是用来测量关照强度和物体接近距离变化的传感器。
模块引脚及pcb
同样模块插在扩展板的J5上,电源接1.8V或3.3v
初始化需要配置一些寄存器
- reg = RPR0521RS_ALS_PS_CONTROL_VAL;
- rc = write(RPR0521RS_ALS_PS_CONTROL, ®, sizeof(reg));
- if (rc != 0) {
- Serial.println(F("Can't write RPR0521RS ALS_PS_CONTROL register"));
- return (rc);
- }
- rc = read(RPR0521RS_PS_CONTROL, ®, sizeof(reg));
- if (rc != 0) {
- Serial.println(F("Can't read RPR0521RS PS_CONTROL register"));
- return (rc);
- }
- reg |= RPR0521RS_PS_CONTROL_VAL;
- rc = write(RPR0521RS_PS_CONTROL, ®, sizeof(reg));
- if (rc != 0) {
- Serial.println(F("Can't write RPR0521RS PS_CONTROL register"));
- }
- reg = RPR0521RS_MODE_CONTROL_VAL;
- rc = write(RPR0521RS_MODE_CONTROL, ®, sizeof(reg));
复制代码
- reg = RPR0521RS_ALS_PS_CONTROL_VAL;
- index = (reg >> 4) & 0x03;
- _als_data0_gain = als_gain_table[index];
- index = (reg >> 2) & 0x03;
- _als_data1_gain = als_gain_table[index];
- index = RPR0521RS_MODE_CONTROL_VAL & 0x0F;
- _als_measure_time = als_meas_time_table[index];
复制代码
读取6个字节的数据
- rc = read(RPR0521RS_PS_DATA_LSB, data, 6);
复制代码
前两个字节是接近数据,后四个字节是光照强度数据
- rawps = ((unsigned short)val[1] << 8) | val[0];
- rawals[0] = ((unsigned short)val[3] << 8) | val[2];
- rawals[1] = ((unsigned short)val[5] << 8) | val[4];
- *ps = rawps;
- *als = convert_lx(rawals);
复制代码
光照强度数据转换算法
- float RPR0521RS::convert_lx(unsigned short *data)
- {
- float lx;
- float d0, d1, d1_d0;
- if (_als_data0_gain == 0) {
- return (RPR0521RS_ERROR);
- }
- if (_als_data1_gain == 0) {
- return (RPR0521RS_ERROR);
- }
- if (_als_measure_time == 0) {
- return (RPR0521RS_ERROR);
- } else if (_als_measure_time == 50) {
- if ((data[0] & 0x8000) == 0x8000) {
- data[0] = 0x7FFF;
- }
- if ((data[1] & 0x8000) == 0x8000) {
- data[1] = 0x7FFF;
- }
- }
- d0 = (float)data[0] * (100 / _als_measure_time) / _als_data0_gain;
- d1 = (float)data[1] * (100 / _als_measure_time) / _als_data1_gain;
- if (d0 == 0) {
- lx = 0;
- return (lx);
- }
- d1_d0 = d1 / d0;
- if (d1_d0 < 0.595) {
- lx = (1.682 * d0 - 1.877 * d1);
- } else if (d1_d0 < 1.015) {
- lx = (0.644 * d0 - 0.132 * d1);
- } else if (d1_d0 < 1.352) {
- lx = (0.756 * d0 - 0.243 * d1);
- } else if (d1_d0 < 3.053) {
- lx = (0.766 * d0 - 0.25 * d1);
- } else {
- lx = 0;
- }
- return (lx);
- }
复制代码
例程中设置距离判断阈值RPR0521RS_NEAR_THRESH为1000,大于这个值认为far,小于为near
然后来分析下结果吧
正常光照(节能灯),无物体接近传感器情况下:
接近数据为0,状态far;
光照强度为60左右。
先用高强度手电照射:
光强数据达到7000左右。
然后测试接近,用手指接近传感器:
可以看到手指按住传感器是,接近数据2000,同事光线被遮挡住,光强数据变成了0.
也就是光强和接近数据是成反比的。
下面修改代码,用曲线说明这个问题:
手电照射:
光强骤升,波动比较大,应该是手电led闪频造成的。
手指接近覆盖传感器:
接近数据曲线骤升,高点相对来说比较平稳,手指覆盖和拿开瞬间,数据变化还是挺灵敏的。也可以看到,完全覆盖是,光强为0.
|
|