LPC824_VEML6075紫外检测模块学习笔记(ch3)

1 VEML6075应用流程分析

1.1 紫外线及其检测介绍

紫外线主要包括365nm波长(320-400nm,3dB带宽为350--375nm)的UVA区域和330nm波长(280--4430nm,3dB带宽为315--340nm)的UVB区域,

wpsE64F.tmp

wpsE660.tmp

25 紫外UVA与UVB频谱分布

UVB波长较短伤害较大,不过仅占太阳能的0.1%,而UVA虽然波长长单个光子伤害低,但是能量丰富,占了太阳能的4.5%。

由于CMOS制造工艺下的紫外光传感器很容易受到不同的可见光以及红外光噪声背景影响,因此对紫外检测需要进行校正计算。VEML提供了UVA、UVB、可见光UVcomp1和红外光UVcomp2的四个原始传感监测数据,需要利用以下公式对真实的UV紫外光照指数进行校正计算。

wpsE661.tmp

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)函数。

float a = 2.22, b = 1.33, c = 2.95, d = 1.74;

while(1) {

uint16_t UVA_data, UVB_data, UVcomp1_data, UVcomp2_data, UV_id;

float UVAcalc, UVBcalc;

// 发送0x07命令,读取UVA_data寄存器的数值

txData[0]=0x07;

SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);

UVA_data = (rxData[1] << 8) + rxData[0];

delay(100);

// 发送0x09命令,读取UVB_data寄存器的数值

txData[0]=0x09;

SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);

UVB_data = (rxData[1] << 8) + rxData[0];

delay(100);

// 发送0x0A命令,读取UVcomp1_data寄存器的数值

txData[0]=0x0A;

SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);

UVcomp1_data = (rxData[1] << 8) + rxData[0];

delay(100);

// 发送0x0B命令,读取UVcomp2_data寄存器的数值

txData[0]=0x0B;

SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);

UVcomp2_data = (rxData[1] << 8) + rxData[0];

delay(100);

// 发送0x0C命令,读取UV_id寄存器的数值

txData[0]=0x0C;

SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);

UV_id = (rxData[1] << 8) + rxData[0];

delay(100);

printf("UVA_data = %d, UVB_data = %d, UVcomp1_data = %d, UVcomp2_data = %d, UV_id = %x\n",

UVA_data, UVB_data, UVcomp1_data, UVcomp2_data, UV_id);

UVAcalc = (float)UVA_data -  a*(float)UVcomp1_data - b*(float)UVcomp2_data;

UVBcalc = (float)UVB_data -  c*(float)UVcomp1_data - d*(float)UVcomp2_data;

printf("UVAcalc = %f, UVBcalc = %f\n\n", UVAcalc, UVBcalc);

delay_Long(20000);

}

最终显示的串口如下图:

wpsE671.tmp

25 紫外传感器所有寄存器读取值与计算的UV值

进一步的UVI未能给出K公式,目前来说直接采用UVA和UVB的原始值比较合适。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值