搜索
热搜: ROHM 模拟 车载
查看: 2347|回复: 1

【罗姆传感器】9.照度接近传感器测量分析

[复制链接]

该用户从未签到

89

主题

513

帖子

0

精华

金牌会员

最后登录
2022-3-30
发表于 2018-11-21 20:07:00 | 显示全部楼层 |阅读模式
照度接近传感器主要是用来测量关照强度和物体接近距离变化的传感器。

模块引脚及pcb


1.jpg

同样模块插在扩展板的J5上,电源接1.8V或3.3v

初始化需要配置一些寄存器
  1. reg = RPR0521RS_ALS_PS_CONTROL_VAL;
  2.   rc = write(RPR0521RS_ALS_PS_CONTROL, ®, sizeof(reg));
  3.   if (rc != 0) {
  4.     Serial.println(F("Can't write RPR0521RS ALS_PS_CONTROL register"));
  5.     return (rc);
  6.   }

  7.   rc = read(RPR0521RS_PS_CONTROL, ®, sizeof(reg));
  8.   if (rc != 0) {
  9.     Serial.println(F("Can't read RPR0521RS PS_CONTROL register"));
  10.     return (rc);
  11.   }

  12.   reg |= RPR0521RS_PS_CONTROL_VAL;
  13.   rc = write(RPR0521RS_PS_CONTROL, ®, sizeof(reg));
  14.   if (rc != 0) {
  15.     Serial.println(F("Can't write RPR0521RS PS_CONTROL register"));
  16.   }

  17.   reg = RPR0521RS_MODE_CONTROL_VAL;
  18.   rc = write(RPR0521RS_MODE_CONTROL, ®, sizeof(reg));
复制代码

  1.   reg = RPR0521RS_ALS_PS_CONTROL_VAL;
  2.   index = (reg >> 4) & 0x03;
  3.   _als_data0_gain = als_gain_table[index];
  4.   index = (reg >> 2) & 0x03;
  5.   _als_data1_gain = als_gain_table[index];

  6.   index = RPR0521RS_MODE_CONTROL_VAL & 0x0F;
  7.   _als_measure_time = als_meas_time_table[index];
复制代码


读取6个字节的数据
  1. rc = read(RPR0521RS_PS_DATA_LSB, data, 6);
复制代码


前两个字节是接近数据,后四个字节是光照强度数据
  1.   rawps     = ((unsigned short)val[1] << 8) | val[0];
  2.   rawals[0] = ((unsigned short)val[3] << 8) | val[2];
  3.   rawals[1] = ((unsigned short)val[5] << 8) | val[4];

  4.   *ps  = rawps;
  5.   *als = convert_lx(rawals);
复制代码


光照强度数据转换算法
  1. float RPR0521RS::convert_lx(unsigned short *data)
  2. {
  3.   float lx;
  4.   float d0, d1, d1_d0;

  5.   if (_als_data0_gain == 0) {
  6.     return (RPR0521RS_ERROR);
  7.   }

  8.   if (_als_data1_gain == 0) {
  9.     return (RPR0521RS_ERROR);
  10.   }

  11.   if (_als_measure_time == 0) {
  12.     return (RPR0521RS_ERROR);
  13.   } else if (_als_measure_time == 50) {
  14.     if ((data[0] & 0x8000) == 0x8000) {
  15.       data[0] = 0x7FFF;
  16.     }
  17.     if ((data[1] & 0x8000) == 0x8000) {
  18.       data[1] = 0x7FFF;
  19.     }
  20.   }

  21.   d0 = (float)data[0] * (100 / _als_measure_time) / _als_data0_gain;
  22.   d1 = (float)data[1] * (100 / _als_measure_time) / _als_data1_gain;

  23.   if (d0 == 0) {
  24.     lx = 0;
  25.     return (lx);
  26.   }

  27.   d1_d0 = d1 / d0;

  28.   if (d1_d0 < 0.595) {
  29.     lx = (1.682 * d0 - 1.877 * d1);
  30.   } else if (d1_d0 < 1.015) {
  31.     lx = (0.644 * d0 - 0.132 * d1);
  32.   } else if (d1_d0 < 1.352) {
  33.     lx = (0.756 * d0 - 0.243 * d1);
  34.   } else if (d1_d0 < 3.053) {
  35.     lx = (0.766 * d0 - 0.25 * d1);
  36.   } else {
  37.     lx = 0;
  38.   }

  39.   return (lx);
  40. }
复制代码


例程中设置距离判断阈值RPR0521RS_NEAR_THRESH为1000,大于这个值认为far,小于为near

然后来分析下结果吧
正常光照(节能灯),无物体接近传感器情况下:
2.jpg
接近数据为0,状态far;
光照强度为60左右。

先用高强度手电照射:
3.jpg

光强数据达到7000左右。

然后测试接近,用手指接近传感器:
4.jpg
可以看到手指按住传感器是,接近数据2000,同事光线被遮挡住,光强数据变成了0.

也就是光强和接近数据是成反比的。

下面修改代码,用曲线说明这个问题:
手电照射:
5.jpg
光强骤升,波动比较大,应该是手电led闪频造成的。

手指接近覆盖传感器:

6.jpg
接近数据曲线骤升,高点相对来说比较平稳,手指覆盖和拿开瞬间,数据变化还是挺灵敏的。也可以看到,完全覆盖是,光强为0.


回复

使用道具 举报

该用户从未签到

1153

主题

5959

帖子

0

精华

论坛元老

最后登录
2021-2-19
发表于 2018-11-25 19:12:27 | 显示全部楼层
看看了
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-4-20 03:51 , Processed in 0.093952 second(s), 14 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表