【国民技术N32G430】6、STK33B62光传感器检测
[复制链接]
最近做了一个光传感测检测的工程,在这里跟大家分享一下。
STK33B62集成了环境和红外内置940nm VCSEL的光数字转换器(垂直腔面发射激光器)二极管和I2C接口。此设备不仅提供环境光线感应,实现强健的背光/显示亮度控制和红外感应具有中断功能的邻近估计。对于环境光感应,STK33B62包括一个光电二极管、定时控制器和ADC炸薯条出色的光谱响应设计用于靠近人眼。STK33B62适用于检测宽范围的光强度环境对于接近感测,STK33B62也集成了光电二极管、定时控制器和ADC在同一芯片中。光谱响应STK33B62针对波长940nm进行了优化红外线。STK33B62提供可编程功能驱动VCSEL并使用噪声的电流设置高度拒绝不需要的取消方案环境红外噪声。STK33B62具有强大的片上刷新率设置没有外部组件。软件关闭提供模式控制以节省电力应用STK33B62工作电压范围为1.7伏至2.0伏。
驱动程序:
#include "stk33b62.h"
#include "i2c.h"
#include "stdio.h"
#include "oled.h"
u8 stk33b62_init(void)
{
u8 res = 1;
res = stk33b62_write_reg(SOFT_RESET,0x00);
if(res == 0)
{
printf("init STK33B62 OK!");
}
else
return 1;
res = ap3216c_read_one_reg(PDT_ID);
if(res == 1)
{
printf("read PID ERROR!\n");
return 1;
}
else
{
printf("ID: %x\n",res);
}
//写入可测量参数
res = stk33b62_write_reg(STK_STATE,EN_ALSK | EN_WAIT | EN_ALS | EN_PS);
if(res ==1)
{
printf("EN STK ERROR!\n");
return 1;
}
//写入PSS累计时间采样 384Us b100, 次数 b001 2 0x41
res = stk33b62_write_reg(PSCTRL,0x41);
//写入ALS累计时间采样 100ms b101, 次数 b001 1 0x50 默认值,可以不写
return 0;
}
//往reg寄存器中写入dat数据
u8 stk33b62_write_reg(u8 reg,u8 dat)
{
I2C_Start();
I2C_Send_Byte(STK33B62_ADDR|OLED_CMD);
if(I2C_WaitAck())
{
printf("waitack err1");
return 1;
}
I2C_Send_Byte(reg);
if(I2C_WaitAck())
{
printf("waitack err2");
return 2;
}
I2C_Send_Byte(dat);
if(I2C_WaitAck())
{
printf("waitack err3");
return 3;
}
I2C_Stop();
return 0;//代表成功
}
//返回值:读到的数据
u8 ap3216c_read_one_reg(u8 reg)
{
u8 dat;
I2C_Start();
I2C_Send_Byte(STK33B62_ADDR|OLED_CMD);
if(I2C_WaitAck())
return 1;
I2C_Send_Byte(reg);
if(I2C_WaitAck())
return 2;
I2C_Stop();
I2C_Start();
I2C_Send_Byte(STK33B62_ADDR|OLED_DATA);
if(I2C_WaitAck())
return 3;
dat = I2C_Read_Byte(0);
I2C_Stop();
return dat;
}
u16 ap3216c_read_two_reg(u8 reg)
{
u16 data;
I2C_Start();
I2C_Send_Byte(STK33B62_ADDR|OLED_CMD);
if(I2C_WaitAck())
return 1;
I2C_Send_Byte(reg);
if(I2C_WaitAck())
return 2;
I2C_Stop();
I2C_Start();
I2C_Send_Byte(STK33B62_ADDR|OLED_DATA);
if(I2C_WaitAck())
return 3;
data = (u16) I2C_Read_Byte(1);
data = (u16)((data<<8) | I2C_Read_Byte(0));
I2C_Stop();
return data;
}
// 读取ALS值
#define START_X 30
#define END_X 80
void READ_ALS(void)
{
u16 als, ps;
u8 string_als[4];
u8 string_ps[4];
u8 n,midde;
als = ap3216c_read_two_reg(DATA1_ALS);
sprintf(string_als,"%4d",als);
if(als <1)
{
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,7+n,END_X,7+n,0);
}
}
else if(als<10)
{
midde=START_X + 10;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,7+n,midde,7+n,1);
OLED_DrawLine(midde,7+n,END_X,7+n,0);
}
}
else if(als<100)
{
midde=START_X + 20;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,7+n,midde,7+n,1);
OLED_DrawLine(midde,7+n,END_X,7+n,0);
}
}
else if(als<1000)
{
midde=START_X + 40;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,7+n,midde,7+n,1);
OLED_DrawLine(midde,7+n,END_X,7+n,0);
}
}
else{
midde=START_X + 50;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,7+n,midde,7+n,1);
OLED_DrawLine(midde,7+n,END_X,7+n,0);
}
}
OLED_ShowString(90,0,string_als,16,1);
ps = ap3216c_read_two_reg(DATA1_PS);
sprintf(string_ps,"%4d",ps);
if(ps <1)
{
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,22+n,END_X,22+n,0);
}
}
else if(ps<10)
{
midde=START_X + 10;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,22+n,midde,22+n,1);
OLED_DrawLine(midde,22+n,END_X,22+n,0);
}
}
else if(ps<100)
{
midde=START_X + 30;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,22+n,midde,22+n,1);
OLED_DrawLine(midde,22+n,END_X,22+n,0);
}
}
else if(ps<1000)
{
midde=START_X + 40;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,22+n,midde,22+n,1);
OLED_DrawLine(midde,22+n,END_X,22+n,0);
}
}
else{
midde=START_X + 50;
for(n=0;n<6;n++)
{
OLED_DrawLine(START_X,22+n,midde,22+n,1);
OLED_DrawLine(midde,22+n,END_X,22+n,0);
}
}
OLED_ShowString(90,16,string_ps,16,1);
}
光传感
|