基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(4)----测量环境光

news2024/11/25 15:53:03

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X----4.测量环境光

  • 概述
  • 样品申请
  • VL6180X传感器的测量流程
  • ALS动态范围
  • ALS动态范围
  • 测量流程
  • 光强计算公式
  • 配置vl6180x
  • 测试结果

概述

在本章中,我们将介绍如何配置VL6180X传感器以测量环境光,并获取环境光的强度值。VL6180X是一种多功能、高性能的接近和环境光传感器,其环境光测量功能可以用于检测周围环境的亮度水平。
在这里插入图片描述
查看VL6180X手册可得知,VL6180X模块是内置了环境光感应(Ambient Light Sensing,ALS)功能的。ALS功能使得VL6180X不仅能够测量物体与传感器之间的距离,还能够检测周围环境的光照强度。
在这里插入图片描述

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

VL6180X传感器的测量流程

下图给出了vl6180x测量距离和环境光的驱动流程图,可以得知他们的测量方式是大同小异的。
需要注意的是,虽然距离测量和环境光测量的流程图在基本原理和操作步骤上是相似的,但在具体的配置和参数设置上可能存在差异。因此,在使用VL6180X进行距离测量和环境光测量时,需要根据具体的需求和应用场景,相应地配置和调整传感器的设置。
在这里插入图片描述

ALS动态范围

ALS动态范围是指VL6180X传感器在不同增益设置下可以测量的光线范围。在VL6180X手册的表中,展示了在有和无玻璃情况下的各个增益下可测量的光线范围。
选择适当的增益设置对于获得准确的环境光测量结果至关重要。在大多数应用中,可以使用单个增益设置来进行操作,而无需在不同的增益之间切换。这样可以简化配置和使用过程,提高系统的稳定性和可靠性。
根据实际应用的需求,可以根据表中的数据选择最合适的增益设置。根据是否使用玻璃覆盖物,以及环境光的强度范围,可以确定在哪个增益下获得最佳的测量精度和范围。
在这里插入图片描述

ALS动态范围

ALS动态范围是指VL6180X传感器在不同增益设置下可以测量的光线范围。在VL6180X手册的表中,展示了在有和无玻璃情况下的各个增益下可测量的光线范围。
选择适当的增益设置对于获得准确的环境光测量结果至关重要。在大多数应用中,可以使用单个增益设置来进行操作,而无需在不同的增益之间切换。这样可以简化配置和使用过程,提高系统的稳定性和可靠性。
根据实际应用的需求,可以根据表中的数据选择最合适的增益设置。根据是否使用玻璃覆盖物,以及环境光的强度范围,可以确定在哪个增益下获得最佳的测量精度和范围。
在这里插入图片描述

可以通过设置SYSALS__ANALOGUE_GAIN(0x03F)来配置模拟增益。根据实际需求和环境条件,选择适当的增益值非常重要。建议在调整增益时进行实际测试,以找到最佳的平衡点,以获得所需的性能和图像质量。记住,过高的增益可能会引入噪声,对测量产生不利影响。
在这里插入图片描述

测量流程

具体流程如下所示:

  1. 开始单次环境光测量:应用调谐设置后,将值0b100写入寄存器的位[5:3](寄存器0x0014),以启动单次环境光测量。
  2. 等待测量完成:等待测量完成。您可以根据实际需求决定等待的时间。
  3. 从寄存器0x0040读取数据,并清除位[0],然后将值0x31写入寄存器0x0041。
  4. 将值0b1(二进制)写入寄存器0x0038的位[0]。
  5. 从寄存器0x004F的位[5:3]中读取数值,并且该数值为0b100跳出循环,否则等待。
  6. 从寄存器0x0050读取2个字节的数值,这个数值代表环境光强度的测量结果。
  7. 将值0b111(二进制)写入寄存器0x0015的位[2:0]。
    以上是获取光强的简要概述,根据您的实际需求,可能需要更详细的代码和配置。请参考VL6180X传感器的相关文档和手册,以获取更多详细的信息和编程指南。
    在这里插入图片描述

光强计算公式

“ALS count to lux conversion” 指的是将环境光传感器的输出值(一个16位计数值)转换为光照强度(单位为勒克斯)的过程,由上一步的流程进行获取。
工厂校准的ALS光照分辨率是0.32(lux/count),适用于模拟增益为1且积分时间为100毫秒的情况(在无玻璃覆盖的条件下进行校准)。计算公式如下所示。
在这里插入图片描述
读取lux代码参考如下所示。

float VL6180X_Read_Lux(uint8_t add,uint8_t Gain)
{
	float lux;
	static uint8_t reg;
	reg = VL6180X_ReadByte(add,VL6180X_REG_SYSTEM_INTERRUPT_CONFIG);
	reg &= ~0x38;		//[5:3]清0
	reg |= (0x4<<3);	//开启转换New sample ready	开启转换
	
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_INTEGRATION_PERIOD_HI,0);
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_INTEGRATION_PERIOD_LO,100);	//101ms
	if (Gain > VL6180X_ALS_GAIN_40)
	{
		Gain = VL6180X_ALS_GAIN_40;
	}
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_ANALOGUE_GAIN, 0x40 | Gain);
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_START, 0x1);	//连续模式
	// New Sample Ready threshold event 新样本就绪
	while (4 != ((VL6180X_ReadByte(add,VL6180X_REG_RESULT_INTERRUPT_STATUS_GPIO) >> 3) & 0x7));
	
	lux = VL6180X_Read_HalfWold(add,VL6180X_REG_RESULT_ALS_VAL);
	VL6180X_WriteByte(add,VL6180X_REG_SYSTEM_INTERRUPT_CLEAR,0x07);	//0111b 清除了三种中断标志
	//矫正增益算法
	lux *= 0.32f; // calibrated count/lux
	switch(Gain) { 
	case VL6180X_ALS_GAIN_1: 
	break;
	case VL6180X_ALS_GAIN_1_25: 
	lux /= 1.25f;
	break;
	case VL6180X_ALS_GAIN_1_67: 
	lux /= 1.67f;
	break;
	case VL6180X_ALS_GAIN_2_5: 
	lux /= 2.5f;
	break;
	case VL6180X_ALS_GAIN_5: 
	lux /= 5;
	break;
	case VL6180X_ALS_GAIN_10: 
	lux /= 10;
	break;
	case VL6180X_ALS_GAIN_20: 
	lux /= 20;
	break;
	case VL6180X_ALS_GAIN_40: 
	lux /= 40;
	break;
	}
	lux *= 100;
	lux /= 100; // integration time in ms
	return lux;
}

配置vl6180x

在对应的demo板子中,使用U6进行光强读取。
在这里插入图片描述

初始化配置如下所示。

  /* USER CODE BEGIN 2 */

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);	

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);	

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);	
	
	
//VL6180_4
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
uint8_t ii;
uint8_t id;
	HAL_Delay(1);

/************修改VL6180_4地址为VL6180X_DEFAULT_I2C_ADDR4(0x2C)*********************/
	VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
	VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR4);
//	HAL_Delay(100);
	ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR4,0x0212);	
	printf("VL6180_4地址为=0x%X\n",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR4,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR4);
	printf("VL6180_4 id=%d\n",id);	

/************修改VL6180_3地址为VL6180X_DEFAULT_I2C_ADDR3(0x2B)*********************/
//VL6180_3
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
	HAL_Delay(1);
	VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
	VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR3);
	ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR3,0x0212);	
	printf("VL6180_3地址为=0x%X\n",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR3,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR3);
	printf("VL6180_3 id=%d\n",id);

  /* USER CODE END 2 */

循环读取代码如下所示。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		VL6180_L4=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR4);
		printf("VL6180_L4=%dmm\n",VL6180_L4*3);
			
		lux_L3=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR3,VL6180X_ALS_GAIN_40);
		printf("lux=%lf\n",lux_L3);				
		VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR3);
		printf("VL6180_L3=%dmm\n",VL6180_L3*3);			
		
		HAL_Delay(1000);			

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

测试结果

测试距离和光强结果如下所示。
在这里插入图片描述

设置VL6180X_ALS_GAIN_40读取,给强光情况下读数如下所示。
在这里插入图片描述

是符合手册给出的范围的。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

I.MX8MM系统构建 -- 2.linux内核编译烧录

准备源码 源码位置&#xff1a;/source/myir-imx-linux.tar.gz解压源码 tar zxf myir-imx-linux.tar.gz 编译 进入源码目录后&#xff0c;依次执行下列指令 myirmyir-server1:$ make distclean myirmyir-server1:$ make myd_imx8mm_defconfig myirmyir-server1:$ LDFLAG…

代码随想录刷题第53天|Leetcode1143最长公共子序列

1、Leetcode1143最长公共子序列 题目链接&#xff1a;1143最长公共子序列 本题不要求连续&#xff0c;求最长公共子序列。 1、确定dp数组及下标的含义 dp[i][j]&#xff1a;长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。 2、…

volatile原理剖析和实例讲解

一、是什么 volatile是Java的一个关键字&#xff0c;是Java提供的一种轻量级的同步机制&#xff0c; 二、能做什么 保证了不同线程对这个变量进行操作时的可见性&#xff0c;有序性。 三、可见性 可见性主要是指一个线程修改了共享变量的值&#xff0c;另一个线程可以看见…

PreparedStatement 相比于 Statement的优点

PreparedStatement 相比于 Statement&#xff0c;有以下几个优点&#xff1a; 1. 预编译&#xff1a;PreparedStatement 对象在执行 SQL 语句之前会进行预编译&#xff0c;这意味着数据库管理系统可以提前解析和编译 SQL 语句&#xff0c;以优化执行计划&#xff0c;从而提高查…

【C语言初阶(15)】操作符1

文章目录 Ⅰ操作符的分类Ⅱ 算术操作符Ⅲ 移位操作符⒈左移操作符⒉右移操作符 Ⅳ 位操作符⒈按位取⒉按位与⒊按位异或⒋按位或⒌位操作符练习题 Ⅴ赋值操作符Ⅵ 单目操作符 Ⅰ操作符的分类 算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符…

【ElasticSearch】ES集群搭建、监控、故障转移

文章目录 1、ES集群介绍2、搭建ES集群3、集群状态监控4、集群职责及脑裂5、分布式新增和查询流程6、ES故障转移 1、ES集群介绍 单机的ES做数据存储与搜索&#xff0c;必然面临两个问题&#xff1a; 海量数据存储问题单点故障问题 因此&#xff0c;考虑使用ES集群&#xff1a…

AIGC浪潮席卷,亚马逊云科技携手海尔设计、Nolibox加速工业设计转型

从机器学习算法到深度学习再到强化学习&#xff0c;AI创新浪潮奔流不息。而AIGC&#xff08;AI-generated Content&#xff0c;人工智能生成内容&#xff09;的到来&#xff0c;更是让AI成为众多企业的得力助手&#xff0c;开拓了文本、图像、音视频等领域的天花板。 在洞悉到…

x86架构ubuntu18下运行mgba模拟器

0. 环境 i7 ubuntu18 1. 准备源码 到https://github.com/mgba-emu/mgba/releases下载源码 mgba-0.10.2.tar.gz tar -zvxf mgba-0.10.2.tar.gz cd mgba0.10.2 2. 编译 mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX/home/xxjianvm/work/mgba-0.10.2/install .. make -j…

PROFINET转TCP/IP网关TCP/IP协议的含义是

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;远创智控YC-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…

【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图

文章目录 一、加载宾馆分布数据二、绘制热度图三、加载范围数据四、加载底图数据 一、加载宾馆分布数据 加载专栏配套的案例数据data004.rar中的长沙市宾馆酒店.shp&#xff0c;如下图&#xff0c;选择Shapefile格式&#xff1a; 选择长沙市宾馆酒店&#xff0c;加载如下&…

完全平方数(力扣)动态规划 JAVA

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 示…

【指针进阶】(题目练习)

这篇文章的思维导图在这里&#xff1a;思维导图 一维数组&#xff1a; int a[] {1,2,3,4}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a0)); printf("%d\n",sizeof(*a)); printf("%d\n",sizeof(a1)); printf("%d\n"…

Vit 实战营 Class2:图像与Transformer基础

文章目录 数组图像&#xff1a;图像与像素图像分类&#xff1a;机器如何学习&#xff1f;NMT&#xff1a;Neuron Machine TranslationTransformerVision Transformer代码实战 数组图像&#xff1a;图像与像素 什么是数字图像&#xff1f;在计算机图像的图像格式。每一个点叫pix…

全国节能宣传周丨物通博联智慧能源解决方案助力节能降碳

今年7月10日至16日&#xff0c;为全国第33个节能宣传周。今年全国节能宣传周活动主题是“节能降碳&#xff0c;你我同行”。 全国节能宣传周活动是在1990年国务院第六次节能办公会议上确定的活动周&#xff0c;开展该活动是实施全面节约战略、开展节能降碳宣传教育、推动形成绿…

ros系统生成kinova双臂机器人moveit配置包方法,详细过程,亲测有效!

环境&#xff1a;ubuntu18.04 ros&#xff1a;melodic 此博客前提你已经安装了moveit&#xff0c;如果未安装&#xff0c;可参考链接 一、启动MoveIt Setup Assistant roslaunch moveit_setup_assistant setup_assistant.launch点击&#xff1a;Create New MoveIt Configurat…

听产品大佬谈大语言模型的商业化价值

今年 3 月以来&#xff0c;全球各大厂商陆续发布大语言模型&#xff0c;无数人欢欣鼓舞&#xff0c;庆祝沉寂了几年的 AI 领域重新焕发生机。 然而热闹过后&#xff0c;一个现实的问题摆在面前&#xff1a;大语言模型的商业化价值该如何挖掘&#xff1f; 来自美洽的资深产品经…

CVE-2021-41773

CVE-2021-41773 Apache Httpd Server 路径穿越漏洞 Httpd&#xff08;即 HTTP Daemon &#xff0c;超文本传输协议守护程序的简称&#xff09;是一款运行于网页服务器后台&#xff0c;等待传入服务器请求的软件。HTTP 守护程序能自动回应服务器请求&#xff0c;并使用 HTTP 协…

fastadmin调试前端js

当键盘按键抬起后打印id #username&#xff0c;点击箭头的除缓存 隐藏前端昵称 设置为 style"sidplay:none" 添加管理员组别的时候把此处的 NULL改为 1 就可以默认选择第一组别

springboot生鲜交易系统

生鲜交易管理方面的任务繁琐,以至于交易市场每年都在生鲜交易管理这方面投入较多的精力却效果甚微,生鲜交易系统的目标就是为了能够缓解生鲜交易管理工作方面面临的压力,让生鲜交易管理方面的工作变得更加高效准确。 本项目在开发和设计过程中涉及到原理和技术有: B/S、java技…

css 绘制直角梯形 和 平行四边形

<div:class"{isFirst: index 0,tab_item: index ! 0,}":style"{width: item?.label?.length > 4 ? 206px : 137px,}"><div>{{ item.label }}</div></div> isFirst是直角梯形 tab_item是平行四边形 直角梯形 .isFirstcur…