注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lugl4313820的个人空间 http://home.eeworld.com.cn/space-uid-1269709.html [收藏] [复制] [分享] [RSS]
日志

【国民技术N32G430】6、STK33B62光传感器检测

已有 489 次阅读2022-9-22 07:36

最近做了一个光传感测检测的工程,在这里跟大家分享一下。

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);
  
}

 [localvideo]b94e8e95154ac1666eaa2bcc4005cb8b[/localvideo]
 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章