相关介绍
原理图
参数
超小体积:4.4 x 2.4 x 1.0mm
最大测距:4m发射的激光对眼镜安全,且完全不可见。
工作电压:2.6 to 3.5 V
通信方式:IIC,400KHz,设备地址0x52,最低位是读写标志位。0表示写,1表示读。因此进行写的时候,此8位数据为:0101 0010,即0x52。进行读的时候,此8位数据为:0101 0011,即0x53。
引脚介绍
1脚:AVDDVCSEL:VCSEL电源正
2脚:AVSSVCSEL:VCSEL电源地
3脚、4脚、6脚、12脚GND/地
5脚:XSHUT:电源模式控制,如果不需要休眠功能,此脚可以直接接到AVDD上。
7脚:GPIO1:中断输出。开漏输出,因此必须要外部上拉。
8脚:DNC:悬空
9脚和10脚:IIC通信端口11脚AVDD:电源正。
XSHUT相当于是供电引脚。GPIO1是中断输出引脚,当一次测距完成可以输出个信号通知MCU去读取数据
最后根据原理图,和引脚修改相应的GPIO口。主要是SCL、SDA、GPIO1、XSHUT引脚。
库介绍
测距流程
根据原理图中,下图的橙色部分,为必须执行的步骤。其他的为可以添加的选项。
强制测距(参考手册第8页)
以下部分显示在开始测量之前执行系统初始化所需的API函数。
-
2.4.1 数据初始化 VL53L1_DataInit()函数被调用一次。 它执行设备初始化。 它在器件退出复位后 被调用一次且仅调用一次。
-
2.4.2 静态初始化 VL53L1_StaticInit()函数允许加载特定用例的设备设置。
-
2.4.3 开始测量 必须调用VL53L1_StartMeasurement()函数才能开始测量。
-
2.4.4 等待结果:轮询或中断
有三种方法可以知道测距数据可用: 1. 主机可以调用轮询功能,等待测距数据可用, 函数VL53L1_WaitMeasurementDataReady()查询设备中断状态,直到测距数据就绪。 只要功能未完成,该功能就会阻止主机上的所有其他操作,因为执行了内部轮询。 2. 主机可以轮询功能以询问测距数据是否可用, 主机可以轮询功能VL53L1_GetMeasurementDataReady()以了解新的测距数据是否准备就 绪。 该功能不会阻止其他操作。 如果传感器在轮询模式下使用,则是首选和推荐的方法。 3. 主机可以等待物理中断 获得测距状态的另一种首选方法是使用物理中断输出:默认情况下,当新的测距数据准备就 绪时,GPIO1被拉低。 该引脚只是输出引脚,该器件没有输入中断引脚。
-
2.4.5 获取测量 Vl53L1_GetRangingMeasurementData()可用于获取测距数据。 当调用该函数获取设备 测距结果时,会调用一个结构 返回VL53L1_RangingMeasurementData_t。 这个结构描述在
第2.6节:RangingMeasurementData结构. -
2.4.6 清楚中断的来源 中断必须通过调用驱动程序功能来清除: 读取测距数据后的VL53L1_ClearInterruptAndStartMeasurement()
为了获得一致的结果,在进行测距测量后必须调用该函数。 如果此功能未被调用,则下一个测距将开始并且结果将被更新。 但是,数据就绪状态标志
不会被更新,物理中断引脚也不会被清除。 -
2.4.7 停止测量 主持人可以决定通过拨打电话来停止测量 VL53L1_StopMeasurement()函数。 如果在量程测量期间发生停止请求,则立即中止测量。
可选的驱动功能(参考手册第九页)
RefSPAD校准(具体参考手册)
库移植
将库文件夹放入工程文件夹。
添加模块、文件路径,三个子文件夹core、demo、platform全部包含,因为使用的是轮询模式,所以其中的demo文件夹中只添加第一个文件 vl53l1x,
函数讲解(轮询模式测量距离)
根据其上面的执行流程,主要封装于三个函数 (vl53l1x.c文件)
VL53L1_Error VL53L1_init(VL53L1_Dev_t *pDev)
VL53L1_Error VL53L1_set_mode(VL53L1_Dev_t *dev, uint8_t mode)
VL53L1_Error VL53L1_single_test(VL53L1_Dev_t *dev,VL53L1_RangingMeasurementData_t *pdata)
其中分别包含了(强制测距、可选功能、校准、开始测距、获取数值)等。
main.c文件调用
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
#include "string.h"
#include "uart.h"
#include "usart2.h"
#include "dht11.h"
#include "tim3_ch4.h"
#include "pin.h"
#include "mq_2.h"
#include "bc25.h"
#include "oled.h"
#include "stdlib.h"
#include "bmp.h"
#include "vl53l1x.h"
/* Private functions ---------------------------------------------------------*/
VL53L1_Dev_t VL53;
VL53L1_RangingMeasurementData_t pdata;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIN中断管理分组
//----------------
delay_init(); //滴答定时器初始化(延时)
uart_init(); //串口1初始化
uart2_init();
tim3_ch4_init(); //定时器初始化,实现时间片
//----------------
DHT11_Init(); //DHT11温湿度传感器
led_Init();
mq_2_init();
// bc25_init();
VL53L1_init(&VL53); //调用
VL53L1_set_mode(&VL53,2); //调用
//----------------
OLED_Init();
OLED_Clear();
OLED_ShowString(2,0,(u8 *)"welcome",16);
while (1)
{
VL53L1_single_test(&VL53,&pdata); //调用
OLED_ShowFloatNumber(32,2,Distance,16); //显示屏显示
printf("%d\n",Distance); //串口显示
delay_ms(1000);
delay_ms(1000);
}
}