VL53L0x 是ST公司生成的 TOF激光测距传感器,得益于非常小巧的尺寸,很容易放入手机、无人机中,提供更加精准、稳定的测距方式。

本文代码,使用 STM32F4xx的 HAL库。

VL53L0x.c

#include "VL53L0x.h"
#include <math.h>
#include "PersonalMath.h"struct VL53L0xData  VL53L0x_Bottom;      //底部连接在IIC2的VL53L0x的数据void VL53L0x_init(I2C_HandleTypeDef *hi2c)
{   uint8_t VL53L0x_SendData[2] = {0x01};uint8_t VL53L0x_RecData[5] ;/*    //Revision ID:HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_IDENTIFICATION_REVISION_ID, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData, 1, 10);//Device ID:HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_IDENTIFICATION_MODEL_ID, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+1, 1, 10);//PRE_RANGE_CONFIG_VCSEL_PERIOD =HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+2, 1, 10);//FINAL_RANGE_CONFIG_VCSEL_PERIOD=HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+3, 1, 10);*/HAL_I2C_Mem_Write(hi2c, VL53L0x_add, VL53L0X_REG_SYSRANGE_START, I2C_MEMADD_SIZE_8BIT, VL53L0x_SendData, 1, 1);//HAL_Delay(500);VL53L0x_SendData[1] = 100;while(VL53L0x_SendData[1]--){HAL_Delay(1);HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_RESULT_RANGE_STATUS, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+4, 1, 1);if (VL53L0x_RecData[4] & 0x01) break;}
}//检查VL53L0x是否正常
//检查成功返回0
//检查失败返回1
uint8_t VL53L0x_Check(I2C_HandleTypeDef *hi2c)
{   uint8_t VL53L0x_SendData[2] = {0x01};uint8_t VL53L0x_RecData[5] ;//Revision ID:HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_IDENTIFICATION_REVISION_ID, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData, 1, 1);//Device ID:HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_IDENTIFICATION_MODEL_ID, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+1, 1, 1);//PRE_RANGE_CONFIG_VCSEL_PERIOD =HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+2, 1, 1);//FINAL_RANGE_CONFIG_VCSEL_PERIOD=HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+3, 1, 1);HAL_I2C_Mem_Write(hi2c, VL53L0x_add, VL53L0X_REG_SYSRANGE_START, I2C_MEMADD_SIZE_8BIT, VL53L0x_SendData, 1, 1);HAL_Delay(500);VL53L0x_SendData[1] = 100;while(VL53L0x_SendData[1]--){HAL_Delay(10);HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_RESULT_RANGE_STATUS, I2C_MEMADD_SIZE_8BIT, VL53L0x_RecData+4, 1, 1);if (VL53L0x_RecData[4] & 0x01) break;}if (VL53L0x_RecData[4] & 0x01) return 0;              //检查成功返回0else return 1; //检查失败返回1
}//VL53L0x转换一次
void VL53L0x_StartConversion(I2C_HandleTypeDef *hi2c)
{uint8_t VL53L0x_SendData[1] = {0x01};HAL_I2C_Mem_Write(hi2c, VL53L0x_add, VL53L0X_REG_SYSRANGE_START, I2C_MEMADD_SIZE_8BIT, VL53L0x_SendData, 1, 1);
}uint16_t makeuint16(int lsb, int msb)
{return ((msb & 0xFF) << 8) | (lsb & 0xFF);
}//VL53L0x读取距离等数据反馈信息
void VL53L0x_ReadDistance(I2C_HandleTypeDef *hi2c, struct VL53L0xData *VL_temp)
{//记录历史有效值VL_temp->dist_last = VL_temp->distValid;HAL_I2C_Mem_Read(hi2c, VL53L0x_add, VL53L0X_REG_RESULT_RANGE_STATUS, I2C_MEMADD_SIZE_8BIT, VL_temp->vtemp, 12, 1);VL_temp->acnt = makeuint16(VL_temp->vtemp[7], VL_temp->vtemp[6]);VL_temp->scnt = makeuint16(VL_temp->vtemp[9], VL_temp->vtemp[8]);VL_temp->dist = makeuint16(VL_temp->vtemp[11], VL_temp->vtemp[10]);VL_temp->DeviceRangeStatusInternal = ((VL_temp->vtemp[0] & 0x78) >> 3);//提取有效值if(VL_temp->dist <= 0x0014)      //距离数据无效VL_temp->distValid = VL_temp->dist_last;else     //有效VL_temp->distValid = VL_temp->dist;/*    下面的代码具体干嘛的时间长忘记了,功能是根据对地倾角求得飞机的高度,大家可以直接删掉 */uint8_t i,j;for(i = 14;i>0;i--){VL_temp->dist_buff[i] = VL_temp->dist_buff[i-1];}VL_temp->dist_buff[0] = VL_temp->distValid;i =0;j=0;for(i=0;i<6;i++){if(VL_temp->dist_buff[i] >=2000)j++;}if(j >= 2)     // 1/3的溢出率VL_temp->distValidFinal = 2000;else       //从数组里筛选出最近的有效值{i=0;for(i=0;i<15;i++){if(VL_temp->dist_buff[i] <2000)break;}VL_temp->distValidFinal = VL_temp->dist_buff[i];}VL_temp->GroundDis_last = VL_temp->GroundDis;VL_temp->GroundDis = (float)VL_temp->distValidFinal /1000;VL_temp->GroundDis = VL_temp->GroundDis *cos(ABS((PostureAngle.Pitch /180 *3.14159))) *cos(ABS((PostureAngle.Roll /180 *3.14159)));
}

VL53L0x.h

#ifndef __VL53L0X_H
#define __VL53L0X_H
#include "stm32f4xx_hal.h"
#include "i2c.h"#include "Structure.h"
#include "Algorithm_filter.h"#define VL_CS1_Enable        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(GPIO_PinState)1);   //左侧VL53L0X的PB2拉高使能
#define VL_CS1_Disable      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(GPIO_PinState)0);   //左侧VL53L0X的PB2拉低失能#define VL_CS2_Enable        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(GPIO_PinState)1);   //右侧VL53L0X的PB1拉高使能
#define VL_CS2_Disable      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(GPIO_PinState)0);   //右侧VL53L0X的PB1拉低失能//寄存器操作函数
#define VL53L0x_add         0x52            //VL53L0x的IIC器件地址#define VL53L0X_REG_IDENTIFICATION_MODEL_ID         0xc0
#define VL53L0X_REG_IDENTIFICATION_REVISION_ID      0xc2
#define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD   0x50
#define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x70
#define VL53L0X_REG_SYSRANGE_START                  0x00
#define VL53L0X_REG_RESULT_INTERRUPT_STATUS         0x13
#define VL53L0X_REG_RESULT_RANGE_STATUS             0x14struct VL53L0xData {uint8_t vtemp[12];uint16_t acnt;        //环境统计,激光光强uint16_t scnt;       //信号数uint16_t dist;     //距离,单位mm    最原始数据uint8_t DeviceRangeStatusInternal;uint16_t dist_last;      //历史有效值,用来判断uint16_t distValid;      //原始距离值提取后的有效值uint16_t dist_buff[15];       //测距的滑窗缓存uint16_t distValidFinal;float GroundDis;float GroundDis_last;float Speed;float Speed_last;uint16_t distFilted; //卡尔曼滤波后的距离值uint16_t distFilted_1;//卡尔曼后 + 一阶低通滤波uint8_t Flag_OverRange;   //超出量程标志位/* uint16_t dist_Original; //原始距离值uint16_t dist_OriginalValid; //原始距离值提取后的有效值uint16_t dist_OriginalValid_lsat;*/
};extern struct VL53L0xData  VL53L0x_Bottom;        //底部连接在IIC2的VL53L0x的数据void VL53L0x_init(I2C_HandleTypeDef *hi2c);//检查VL53L0x是否正常
uint8_t VL53L0x_Check(I2C_HandleTypeDef *hi2c);//VL53L0x转换一次
void VL53L0x_StartConversion(I2C_HandleTypeDef *hi2c);//VL53L0x读取距离等数据反馈信息
void VL53L0x_ReadDistance(I2C_HandleTypeDef *hi2c, struct VL53L0xData *VL_temp);void VL53L0x_DataFitting(void);#endif

I2C2 在 STM32CubeMX 的配置:

感慨一小下

压了三年的箱底,可算翻出来了。

当时这款传感器比较新,ST提供的驱动是linux的,CubeMX和HAL库也刚步入正轨,所以借鉴了好多。Arduino的,博客的。

以前懒得码字,可现在学东西多路总容易忘记以前的东西,拿博客当云笔记用,发表出来兴许还能帮到别人,岂不美哉。

更好的 VL53L1x 早已上市,十分好这条产品线。等测距速度提上去,再与MEMS振镜结合,这不就Mini固态激光雷达嘛。

VL53L0x TOF激光测距的 stm32 HAL库驱动代码相关推荐

  1. STM32 HAL库 驱动 MT6701 磁编码器

    写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...

  2. STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

    STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...

  3. VL6810X驱动 距离和光线传感器 stm32 HAL库

    VL6810X驱动 距离和光线传感器 stm32 HAL库 代码 库文件和官方文档 注意事项 1. 2. 3. 这是一款ST出品的传感器,感觉用的人不多 网上没什么驱动代码,所以自己根据st的官方资料 ...

  4. 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)

    l  STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l  STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l  编程使用STM32 HAL库 l  IIC OLED界面编程,动画实 ...

  5. STM32 HAL库IIC驱动

    1. STM32上IIC的一些争议 关于STM32的IIC驱动,网上有很多争论,究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢?下面这个图形象展示了这些争论.总结一些:ST为了规避 ...

  6. STM32使用HAL库驱动SDRAM

    1.驱动平台 开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M.驱动方式使用STM32H750X ...

  7. 基于STM32 HAL库的遥控小车

    目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...

  8. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

  9. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

最新文章

  1. Java8 方法引用
  2. Node.js v11.0 正式发布!
  3. C常量指针 与指针常量区别
  4. python中循环结构_python中的循环结构等相关知识
  5. VoIP服务器处理协议,多协议VoIP服务器的研究与实现
  6. 【Javassist官方文档翻译】第一章 读写字节码
  7. 产生式系统 实验报告 人工智能原理实验
  8. erp框架 saas_Saas模式ERP系统
  9. 今天市场:洗洗更健康!
  10. 【每日蓝桥】44、一七年省赛Java组真题“纸牌三角形”
  11. 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动
  12. 数字电路实验怎么接线视频讲解_【高中物理】电学实验满分知识点总结及例题精讲...
  13. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换
  14. aardio web.blink打开网址
  15. 04-31.eri-test Como ler um arquivo JSON no Java
  16. Nokia 6030默认保密码
  17. 安装微信开发者工具及创建小程序
  18. 计算机平面设计专业素描教案,透视在中职计算机平面设计专业素描教学中的运用策略...
  19. mybatis项目报Error parsing SQL Mapper Configuration.错误及解决方法
  20. 毕业论文查重是怎样查的?

热门文章

  1. 学习笔记6—pandas中ix,loc,iloc有什么区别?
  2. 写给Android开发者的混淆使用手册
  3. 17年第八届蓝桥杯省赛(C语言B组) 题解
  4. 批处理文件中获取当前所在路径的几种方法,以及写文件到txt
  5. 20169219 使用Metaspoit攻击MS08-067实验报告
  6. 关于个人博客转移的那些事
  7. [转载]EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼
  8. 网络协议从入门到底层原理(8)HTTPS(成本、通信过程、TLS1.2的连接,配置服务器HTTPS)
  9. 【数据库系统设计】数据库安全性
  10. 报表参数控件和报表内容自动居中设置方法