搜索
热搜: ROHM 模拟 车载
查看: 6264|回复: 21

【传感器试用】代码详解照度接近传感器RPR-0521RS使用

  [复制链接]

该用户从未签到

11

主题

401

帖子

0

精华

金牌会员

最后登录
2022-1-27
发表于 2020-1-19 11:57:48 | 显示全部楼层 |阅读模式
图片1.png

1、主要特性
l IIC接口,支持全速模式
l 非常广的光照度检测范围
l 距离检测范围1-100mm
l 内置电流可配置IrLED驱动器
l 主要用于LCD显示等
l 供电电压2.5-3.6V
l 运行温度-25~85℃(非工业级)

2、引脚描述
图片2.png
INT引脚一般是中断输出引脚,对mcu来说是外部中断输入引脚。

3、寄存器描述
图片3.png

4、软件驱动
4.1、寄存器定义以及参数设置定义
  1. #define  RPR0521RS_I2C_ADDE   0x38  //7bit  

  2. #define  SYSTEM_CONTROL      0x40
  3.            //SW reset[7]
  4.          #define  RESET_NOT_START         0x00
  5.          #define  RESET_START              0x80
  6.            //INT reset[6]
  7.          #define  INT_NOT_INIT             0x00
  8.          #define  INT_INACTIVE             0x40
  9.            //Part ID[5:0]  ,only read ,value 0x0A

  10. #define  MODE_CONTROL        0x41
  11.            //ALS_EN[7]
  12.          #define   ALS_STANDBY             0x00
  13.          #define   ALS_ENABLE              0x80
  14.            //PS_EN[6]
  15.          #define   PS_STANDBY              0x00
  16.          #define   PS_ENABLE               0x40
  17.            //PS_PULSE[5]
  18.          #define   PULSE_WIDTH_200         0x00
  19.          #define   PULSE_WIDTH_330         0x20
  20.            //PS Operating mode[4]
  21.          #define   NORMAL_MODE           0x00
  22.          #define   TWICE_MODE              0x10
  23.            //Measurement time[3:0]
  24.          #define   STANDBY_STANDBY         0x00
  25.          #define   STANDBY_10MS            0x01
  26.          #define   STANDBY_40MS            0x02
  27.          #define   STANDBY_100MS           0x03
  28.          #define   STANDBY_400MS           0x04
  29.          #define   _100MS_50MS             0x05
  30.          #define   _100MS_100MS            0x06
  31.          #define   _100MS_400MS            0x07
  32.          #define   _400MS_50MS             0x08
  33.          #define   _400MS_100MS            0x09
  34.          #define   _400MS_STANDBY          0x0A
  35.          #define   _400MS_400MS            0x0B
  36.          #define   _50MS_50MS              0x0C
  37.           //0x0D 0x0E 0x0F forbidden

  38. #define  ALS_PS_CONTROL      0x42
  39.           //Reserved[7:6]
  40.           //ALS DATA0 GAIN[5:4]
  41.          #define  ALS_DATA0_GAIN_1         0x00
  42.          #define  ALS_DATA0_GAIN_2         0x10
  43.          #define  ALS_DATA0_GAIN_64        0x20
  44.          #define  ALS_DATA0_GAIN_128       0x30
  45.           //ALS DATA1 GAIN[3:2]
  46.          #define  ALS_DATA1_GAIN_1         0x00
  47.          #define  ALS_DATA1_GAIN_2         0x04
  48.          #define  ALS_DATA1_GAIN_64        0x08
  49.          #define  ALS_DATA1_GAIN_128       0x0A
  50.           //LED CURRENT[1:0]
  51.          #define  CURRENT_25MA            0x00
  52.          #define  CURRENT_50MA            0x01
  53.          #define  CURRENT_100MA           0x02
  54.          #define  CURRENT_200MA           0x03

  55. #define  PS_CONTROL          0x43
  56.           //Ambient_Ir_Flag[7:6]
  57.          #define  LEVLE_LOW                0x00
  58.          #define  LEVLE_HIGH                0x40
  59.          #define  LEVLE_TOO_HIGH           0xA0
  60.           //PS_GAIN[5:4]
  61.          #define  PS_GAIN_1                0x00
  62.          #define  PS_GAIN_2                0x10
  63.          #define  PS_GAIN_4                0x20
  64.          //0x30 forbidden
  65.          //PS interrupt persistence setting
  66.          #define  ACTIVE_EACH_MEASUREMENT  0x00
  67.          #define  UPDATE_EACH_MEASUREMENT  0x01
  68.          #define  UPDATE_TWO_CON_TH        0x02
  69.          #define  ACTIVE_SET_CON_TH          0x03

  70. #define  PS_DATA_LSB         0x44
  71. #define  PS_DATA_MSB        0x45
  72. #define  ALS_DATA0_LSB       0x46
  73. #define  ALS_DATA0_MSB      0x47
  74. #define  ALS_DATA1_LSB       0x48
  75. #define  ALS_DATA1_MSB      0x49
  76. #define  INTERRUPT           0x4A
  77.          //PS INT STAUTS[7]
  78.          #define  PS_SIGNAL_INACTIVE      0x00
  79.          #define  PS_SIGNAL_ACTIVE        0x80
  80.          //ALS INT STATUS[6]
  81.          #define  ALS_SIGNAL_INACTIVE     0x00
  82.          #define  ALS_SIGNAL_ACTIVE       0x40
  83.          //INT MODE[5:4]
  84.          #define  PS_TH_H_EFFECTIVE              0x00
  85.          #define  PS_TH_H_PS_TH_L_EFFECTIVE_H    0x10
  86.          #define  PS_TH_H_PS_TH_L_EFFECTIVE_D    0x20
  87.          //INT ASSERT[3]
  88.          #define  OUTPUT_L_SATBLE                0x00
  89.          #define  OUTPUT_L_ASSERT                0x08
  90.          //INT LATCH[2]
  91.          #define INT_PIN_LATCH           0x00
  92.          #define INT_PIN_UPDATE          0x04

  93.          //INT TRIG[1:0]
  94.          #define INT_PIN_INACTIVE         0x00
  95.          #define TRIG_ONLY_PS            0x01
  96.          #define TRIG_ONLY_ALS           0x02
  97.          #define TRIG_PS_ALS             0x03

  98. #define  PS_TH_LSB            0x4B
  99. #define  PS_TH_MSB           0x4C
  100. #define  PS_TL_LSB            0x4D
  101. #define  PS_TL_MSB            0x4E
  102. #define  ALS_DATA0_TH_LSB     0x4F
  103. #define  ALS_DATA0_TH_MSB    0x50
  104. #define  ALS_DATA0_TL_LSB      0x51
  105. #define  ALS_DATA0_TL_MSB    0x52
  106. #define  PS_OFFSET_LSB       0x53
  107. #define  PS_OFFSET_MSB       0x54
  108.          //Resereved[7:2]

  109. #define  MANUFACT_ID         0x92   
  110.          //only read ,value 0xE0
复制代码

4.2、读取设备ID
设备ID一般都是一个固定值,芯片出厂的时候已经固化在芯片里面了,只读,可用于检测I2C通信是否正常、检测芯片是否存在。
图片4.png
  1. bool RPR0521RSCheck(void)
  2. {
  3.   uint8 chip_id=0;
  4.   
  5.   chip_id=RPR0521RS_ReadRegU8(MANUFACT_ID);
  6.    
  7.   if(chip_id==0xE0)
  8.   {
  9.     return true;
  10.   }
  11.   else
  12.   {
  13.     return false;
  14.   }
  15. }
复制代码

4.3、芯片初始化以及参数设定
图片5.png
图片6.png
图片7.png
图片8.png
  1. void RPR0521RSInit(void)
  2. {
  3.    RPR0521RS_WriteRegU8(SYSTEM_CONTROL,RESET_START);  //复位初始化
  4. RPR0521RS_WriteRegU8(ALS_PS_CONTROL,ALS_DATA0_GAIN_1|ALS_DATA1_GAIN_1|
  5. CURRENT_100MA);  //ALS DATA0和DATA1的增益均配置为1、LED电流配置为100ma
  6.    
  7.    RPR0521RS_WriteRegU8(PS_CONTROL,PS_GAIN_1);   //PS增益设置为1
  8.    RPR0521RS_WriteRegU8(MODE_CONTROL,ALS_ENABLE|PS_ENABLE|_100MS_100MS);  
  9. //模式设置:ALS和PS都使能、测量时间ALS和PS均为100ms。
  10. }
复制代码

4.4、读取数据
图片9.png
可以看出,PS的值是12位的,ALS DATA0DATA116位的。距离值直接从寄存器里面读出来,是数字量;照度值从寄存器里面读出来后,需要做转换,与设置的增益和转换时间有关系。
图片10.png
图片11.png
  1. uint8 als_gain_table[] = {1, 2, 64, 128};//根据手册中的增益
  2. uint16 als_meas_time_table[] = {0,0,0,0,0,100,100,100,100,100,400,400,50,0,0,0};//als的测量时间定义

  3. float RPR0521RSConvertLx(uint16 *als_count) //als数字量,转化为实际值
  4. {
  5.   uint8  als_data0_gain,als_data1_gain;
  6.   uint16 als_measure_time;
  7.   uint8 mode_control_value,als_ps_control_value;
  8.   
  9.   mode_control_value=RPR0521RS_ReadRegU8(MODE_CONTROL);
  10.   als_ps_control_value=RPR0521RS_ReadRegU8(ALS_PS_CONTROL);
  11.   
  12.   als_measure_time=als_meas_time_table[mode_control_value&0x0F];  //取低四位的值
  13.   
  14.   als_data0_gain=als_gain_table[(als_ps_control_value>>4)&0x03]; //取第五第六位的值
  15.   als_data1_gain=als_gain_table[(als_ps_control_value>>2)&0x03];
  16.   
  17.   if(als_data0_gain==0)
  18.   {
  19.     return -1;
  20.   }
  21.   if(als_data1_gain==0)
  22.   {
  23.     return -1;
  24.   }
  25.   if(als_measure_time==0)
  26.   {
  27.     return -1;
  28.   }
  29.   else
  30.   {
  31.     if(als_measure_time==50)
  32.     {
  33.       if((als_count[0]&0x8000)==0x8000)
  34.       {
  35.         als_count[0] = 0x7FFF;
  36.       }
  37.       
  38.       if((als_count[1]&0x8000)==0x8000)
  39.       {
  40.         als_count[1] = 0x7FFF;
  41.       }
  42.     }
  43.   }
  44.   
  45.   float lx;
  46.   float d0, d1, d1_d0;
  47.   
  48.   d0 = (float)als_count[0] * (100 / als_measure_time) / als_data0_gain;
  49.   d1 = (float)als_count[1] * (100 / als_measure_time) / als_data0_gain;
  50.   
  51.   if (d0 == 0)
  52.   {
  53.     lx = 0;
  54.     return (lx);
  55.   }

  56.   d1_d0 = d1 / d0;
  57.   
  58.   if (d1_d0 < 0.595)
  59.   {
  60.     lx = (1.682 * d0 - 1.877 * d1);
  61.   }
  62.   else
  63.   {
  64.     if (d1_d0 < 1.015)
  65.     {
  66.       lx = (0.644 * d0 - 0.132 * d1);
  67.     }
  68.     else
  69.     {
  70.       if (d1_d0 < 1.352)
  71.       {
  72.         lx = (0.756 * d0 - 0.243 * d1);
  73.       }
  74.       else
  75.       {
  76.         if (d1_d0 < 3.053)
  77.         {
  78.           lx = (0.766 * d0 - 0.25 * d1);
  79.         }
  80.         else
  81.         {
  82.           lx = 0;
  83.         }
  84.       }
  85.     }
  86.   }
  87.   return (lx);
  88. }

  89. void RPR0521RSRead(void)
  90. {
  91.   uint16 ps_count;
  92.   uint16 als_count[2];
  93.    
  94.   float ps ,lx;
  95.   
  96.   ps_count=RPR0521RS_ReadRegU16(PS_DATA_LSB);
  97.   als_count[0]=RPR0521RS_ReadRegU16(ALS_DATA0_LSB);
  98.   als_count[1]=RPR0521RS_ReadRegU16(ALS_DATA1_LSB);
  99.   
  100.   ps=ps_count;
  101.   lx=RPR0521RSConvertLx(als_count);
  102.   
  103.   printf(“ps_count:%d\r\n”,ps_count);
  104.   printf(“als_count0:%d\r\n”,als_count[0]);
  105. printf(“als_count1:%d\r\n”,als_count[1]);

  106. printf(“proximity sensor:%f\r\n”,ps);
  107. printf(“ambient light:%0.3f\r\n”,lx);

  108. }
复制代码
图片12.png
1-5依次是手靠近传感器的变化,可以看出,proximity sensor的值逐渐增大,Ambient light的值逐渐减小。

简单绘一个图:
图片13.png
上面转化的过程是参考的官方的Arduinodemo程序,至于为什么要那样转化,手册里面也没有说明。










回复

使用道具 举报

该用户从未签到

2248

主题

1万

帖子

1

精华

论坛元老

最后登录
2024-4-26
发表于 2020-1-19 20:29:41 | 显示全部楼层
不错的套件
回复 支持 反对

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:47:11 | 显示全部楼层
看看
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:47:37 | 显示全部楼层
不错
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:48:16 | 显示全部楼层
加油
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:48:38 | 显示全部楼层
哈哈
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:49:00 | 显示全部楼层
呵呵
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:49:17 | 显示全部楼层
呵呵
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:49:53 | 显示全部楼层
吼吼吼
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2020-1-19 21:50:12 | 显示全部楼层
哦哦
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 13:30 , Processed in 0.114917 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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