问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32传感器模块编程实践:VL53L0X激光红外测距传感器详解与驱动源码

创作时间:
作者:
@小白创作中心

STM32传感器模块编程实践:VL53L0X激光红外测距传感器详解与驱动源码

引用
CSDN
1.
https://blog.csdn.net/zy2232652/article/details/142956447

VL53L0X是一款由ST(意法半导体)生产的红外传感器,采用飞行时间(Time-of-Flight,TOF)测量原理,可以实现精确、快速的非接触式测量。本文将详细介绍VL53L0X的测距原理、主要特性、硬件设计以及在STM32单片机上的应用实践。

一.概要

VL53L0X是一款由ST(意法半导体)生产的红外传感器,通常用于测量物体与传感器之间的距离。
VL53L0X是ST推出的第二代FlightSense技术的飞行时间传感器,与传统的测距传感器不同,它使用时飞行时间(Time-of-Flight,TOF)测量原理,可以实现精确、快速的非接触式测量。无论目标颜色和反射率如何,都可以进行距离测量,抗干扰能力更强。

二.VL53L0X测距原理

VL53L0X激光测距模块的原理是利用激光脉冲的飞行时间来测量距离。该模块通过发射一束激光脉冲,并测量该激光脉冲从发射到被接收的时间来计算出物体与传感器之间的距离。
VL53L0X传感器的测距视场角(FOV)为25°,这个视场角决定了传感器在测距时所能覆盖的区域大小。

三.VL53L0X主要特性

尺寸:VL53L0的尺寸非常小,具体为4.4 x 2.4 x 1.0mm,这使得它成为市场上最小的飞行时间(ToF)测距传感器之一。
测距范围:该传感器的测距范围为30mm到2000mm,具体参数为30 ~ 2000mm。
最大测距:VL53L0的最大测距为2米(2000mm)。
工作电压:工作电压范围为2.6V到3.5V,通常使用3.3V或5V供电。
通信方式:采用I2C通信协议,设备地址为0x52,支持读写操作。
激光波长:使用940nm的VCSEL(垂直腔面发射激光器),这种激光器完全不可见且对人眼安全。
工作环境:工作温度范围为-20°C到70°C,适合各种环境使用。
测距精度:在高速模式下精度为±5%,高精度模式下为±3%(室内1.2米以内的白色物体)。
测距时间:高速模式下测距时间为20ms,高精度模式下为200ms。

测量距离(客观因素:室内/室外/被测物体偏白/北侧物体偏灰)
由下表可以看出传感器能够测量的最大距离和在室内环境或在户外强光环境有关系,也和被测物体是偏白还是偏灰有关系。可以看出最佳的测量环境是在室内测量白色障碍物的距离。

测量精度(客观因素:测量的距离远近/被测物体偏白/北侧物体偏灰)
33ms列为"Default"模式,"HighAccuracy"模式为200ms,在室内默认模式下测量1.2米之内白色的物体精度为4%,测量灰色物体精度为7%。
为啥测量灰色或者黑色的物体测量的最大距离会减少以及测量精度会降低,因为黑色或者灰色的物体能吸收大量的光子能量,导致反射回传感器的光子比较少,从而影响测量距离以及精度。

四.VL53L0X硬件参考设计

芯片引脚定义,从芯片底部角度观看:

参考原理图设计

五.模块接线说明

模块引脚说明:
5根杜邦线可以实现模块与开发板相连:
板子3.3----模块VIN
板子A11----模块SCL
板子A12----模块SDA
板子B7-----模块XSHUT
板子G------模块GND

六.模块通讯协议介绍

IIC数据写

IIC数据读

VL53L0X芯片的寄存器手册厂家是没提供的,提供了API函数,直接调用就可以实现数据读取。
操作流程:
模块上电,VL53L0X会进入Hw Standby状态,这是待机状态,功耗很低。然后拉高XSHUT引脚,让VL53L0X进入初始化启动状态,开始准备测距。
然后根据配置进入测距模式,有三种测距模式:
单次模式:收到测距开始命令后,开始进行测量,测量完成后自动退出,进入待机。
连续模式:收到测距开始命令后,就一直进行测量,直到收到测距停止命令。收到测距停止命令时,进入待机。
连续间隔模式:收到测距开始命令后,开始进行测量,完成一次测量后,等待一段时间再进行下次测量,直到收到测距停止命令,测量等待间隔时间可调。

七.光学盖玻片介绍

VL53L0X一般会和光学盖玻片一起结合使用。盖玻片有两个作用:提供物理保护,防止灰尘;对光进行滤波,如果只是个人实验评估使用,一般不需要加盖片。盖片如下图所示,刚好盖住整个传感器。

八.STM32单片机与VL53L0模块实现距离测量实验

1.硬件准备

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口。
用5根杜邦线把模块与开发板相连:
板子3.3----模块VIN
板子A11----模块SCL
板子A12----模块SDA
板子B7-----模块XSHUT
板子G------模块GND

2.软件工程

打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚,IIC采用GPIO模拟,所以IIC外设没有配置
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程

用Keil5打开工程
添加代码
添加VL53L0驱动文件,以及OLED显示驱动文件
VL53L0复位引脚配置
VL53L0模拟IIC引脚配置
添加应用相关代码

3.软件主要代码

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,72M主频
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
        OLED_Init();//OLED初始化  
        OLED_Clear();//清屏
     while(vl53l0x_init(&vl53l0x_dev))//vl53l0x初始化
     {	 
        HAL_Delay(500);
     }
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
            vl53l0x_general_test(&vl53l0x_dev,Default_Mode);//默认模式测试
  }
  /* USER CODE END 3 */
}
//初始化vl53l0x
//dev:设备I2C参数结构体
VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev)
{
    GPIO_InitTypeDef GPIO_Initure;
    VL53L0X_Error Status = VL53L0X_ERROR_NONE;
    VL53L0X_Dev_t *pMyDevice = dev;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
    
    pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上电默认0x52)
    pMyDevice->comms_type = 1;           //I2C通信模式
    pMyDevice->comms_speed_khz = 400;    //I2C通信速率
    
    VL53L0X_i2c_init();//初始化IIC总线
    
  HAL_GPIO_WritePin(VL53L0X_XshutPort, VL53L0X_XshutPin, GPIO_PIN_RESET);//失能VL53L0X
    delay_ms(30);
    HAL_GPIO_WritePin(VL53L0X_XshutPort, VL53L0X_XshutPin, GPIO_PIN_SET);//使能VL53L0X,让传感器处于工作
    delay_ms(30);
    
    vl53l0x_Addr_set(pMyDevice,0x54);//设置VL53L0X传感器I2C地址
    if(Status!=VL53L0X_ERROR_NONE) goto error;
    Status = VL53L0X_DataInit(pMyDevice);//设备初始化
    if(Status!=VL53L0X_ERROR_NONE) goto error;
    delay_ms(2);
    Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//获取设备ID信息
    if(Status!=VL53L0X_ERROR_NONE) goto error;
    
if(Vl53l0x_data.adjustok==0xAA)//已校准
      AjustOK=1;	
    else //没校准	
      AjustOK=0;
    
    error:
    if(Status!=VL53L0X_ERROR_NONE)
    {
        print_pal_error(Status);//打印错误信息
        return Status;
    }
      
    return Status;
}
//启动普通测量
//dev:设备I2C参数结构体
//mode模式配置 0:默认;1:高精度;2:长距离;3:高速
void vl53l0x_general_start(VL53L0X_Dev_t *dev,u8 mode)
{
    static char buf[VL53L0X_MAX_STRING_LENGTH];//测试模式字符串字符缓冲区
    VL53L0X_Error Status=VL53L0X_ERROR_NONE;//工作状态
    OLED_Init();			       //初始化OLED  
    OLED_Clear();            //清屏
    OLED_ShowCHinese(18,0,0);//光
    OLED_ShowCHinese(36,0,1);//子
    OLED_ShowCHinese(54,0,2);//物
    OLED_ShowCHinese(72,0,3);//联
    OLED_ShowCHinese(90,0,4);//网
    OLED_ShowString(6,3,"VL53L0X Test");
    OLED_ShowString(80,6,"mm");  
    vl53l0x_set_mode(dev,mode);//配置测量模式
    while(1)
    {
         if(Status==VL53L0X_ERROR_NONE)
         {
                Status = vl53l0x_start_single_test(dev,&vl53l0x_data,buf);//执行一次测量
                  if(vl53l0x_data.RangeMilliMeter<=2000)
                        {
                OLED_ShowNum(30,6,vl53l0x_data.RangeMilliMeter,4,16);//显示距离值
                        }						
         }
          delay_ms(200);//等待200ms	
    }		
}
  

4.实验效果

九.小结

VL53L0X在激光自动对焦,测距和接近检测,深度映射和AR/VR中有广泛的应用,学会VL53L0X可以在这些应用场景可以发挥作用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号