ARM技术william hill官网
直播中

朱工

8年用户 147经验值
擅长:可编程逻辑 模拟技术 嵌入式技术 处理器/DSP
私信 关注
[经验]

【VEML6075紫外线检测试用体验】+ 读取VEML6075寄存器并计算

1 VEML6075应用流程分析1.1 紫外线及其检测介绍
紫外线主要包括365nm波长(320-400nm,3dB带宽为350--375nm)的UVA区域和330nm波长(280--4430nm,3dB带宽为315--340nm)的UVB区域,
25 紫外UVA与UVB频谱分布
UVB波长较短伤害较大,不过仅占太阳能的0.1%,而UVA虽然波长长单个光子伤害低,但是能量丰富,占了太阳能的4.5%。
由于CMOS制造工艺下的紫外光传感器很容易受到不同的可见光以及红外光噪声背景影响,因此对紫外检测需要进行校正计算。VEML提供了UVA、UVB、可见光UVcomp1和红外光UVcomp2的四个原始传感监测数据,需要利用以下公式对真实的UV紫外光照指数进行校正计算。
25 紫外光照指数校正计算公式
其中系数a/b/c/d分别对应UVA受到可见光噪声影响系数、UVA受到红外光噪声影响系数、UVB受到可见光影响系数、UVB受到红外光影响系数。默认是:
a = uva_a_coef = 2.22,
b = uva_b_coef = 1.33,
c = uvb_c_coef = 2.95,
d = uvb_d_coef = 1.74,
为了测试不同的覆盖在传感器上的保护罩或者保护膜所对应的a/b/c/d,需要采用白光LED+白炽灯,分别调节不同的亮度进行测试确定。本模块是裸露的传感芯片,因此可以采用默认的校正系数。
1.2 紫外光照指数校正计算
修改代码,读取VEML6075的所有寄存器,并且计算UVAcalc和UVBcalc,并通过串口显示。
需要注意的是,VEML6075的I2C寄存器读取需要延时一段时间,否则如果连续读取I2C的话,所有的寄存器读取值都是同一个数值,因此每次进行I2C读取都插入delay(100)函数。
  1. float a = 2.22, b = 1.33, c = 2.95, d = 1.74;

  2.         while(1) {
  3.                 uint16_t UVA_data, UVB_data, UVcomp1_data, UVcomp2_data, UV_id;
  4.                 float UVAcalc, UVBcalc;
  5.                  
  6.                  
  7.                 // 发送0x07命令,读取UVA_data寄存器的数值
  8.                 txData[0]=0x07;
  9.                 SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  10.                 UVA_data = (rxData[1] << 8) + rxData[0];
  11.                 delay(100);
  12.                
  13.                 // 发送0x09命令,读取UVB_data寄存器的数值
  14.                 txData[0]=0x09;
  15.                 SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  16.                 UVB_data = (rxData[1] << 8) + rxData[0];
  17.                 delay(100);
  18.                
  19.                 // 发送0x0A命令,读取UVcomp1_data寄存器的数值
  20.                 txData[0]=0x0A;
  21.                 SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  22.                 UVcomp1_data = (rxData[1] << 8) + rxData[0];
  23.                 delay(100);
  24.                
  25.                 // 发送0x0B命令,读取UVcomp2_data寄存器的数值
  26.                 txData[0]=0x0B;
  27.                 SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  28.                 UVcomp2_data = (rxData[1] << 8) + rxData[0];
  29.                 delay(100);
  30.                
  31.                 // 发送0x0C命令,读取UV_id寄存器的数值
  32.                 txData[0]=0x0C;
  33.                 SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  34.                 UV_id = (rxData[1] << 8) + rxData[0];
  35.                 delay(100);
  36.                
  37.                 printf("UVA_data = %d, UVB_data = %d, UVcomp1_data = %d, UVcomp2_data = %d, UV_id = %xn",
  38.                         UVA_data, UVB_data, UVcomp1_data, UVcomp2_data, UV_id);
  39.                        
  40.                 UVAcalc =  (float)UVA_data -  a*(float)UVcomp1_data - b*(float)UVcomp2_data;
  41.                 UVBcalc =  (float)UVB_data -  c*(float)UVcomp1_data - d*(float)UVcomp2_data;
  42.                 printf("UVAcalc = %f, UVBcalc = %fnn", UVAcalc, UVBcalc);
  43.                
  44.                 delay_Long(20000);
  45.         }

最终显示的串口如下图:

25 紫外传感器所有寄存器读取值与计算的UV值
进一步的UVI未能给出K公式,目前来说直接采用UVA和UVB的原始值比较合适。

更多回帖

发帖
×
20
完善资料,
赚取积分