VL53L0x TOF激光测距的 stm32 HAL库驱动代码
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库驱动代码相关推荐
- STM32 HAL库 驱动 MT6701 磁编码器
写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...
- STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机
STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...
- VL6810X驱动 距离和光线传感器 stm32 HAL库
VL6810X驱动 距离和光线传感器 stm32 HAL库 代码 库文件和官方文档 注意事项 1. 2. 3. 这是一款ST出品的传感器,感觉用的人不多 网上没什么驱动代码,所以自己根据st的官方资料 ...
- 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)
l STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l 编程使用STM32 HAL库 l IIC OLED界面编程,动画实 ...
- STM32 HAL库IIC驱动
1. STM32上IIC的一些争议 关于STM32的IIC驱动,网上有很多争论,究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢?下面这个图形象展示了这些争论.总结一些:ST为了规避 ...
- STM32使用HAL库驱动SDRAM
1.驱动平台 开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M.驱动方式使用STM32H750X ...
- 基于STM32 HAL库的遥控小车
目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...
- 温湿度传感器驱动SHT85 单片机STM32 HAL库
功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
最新文章
- Java8 方法引用
- Node.js v11.0 正式发布!
- C常量指针 与指针常量区别
- python中循环结构_python中的循环结构等相关知识
- VoIP服务器处理协议,多协议VoIP服务器的研究与实现
- 【Javassist官方文档翻译】第一章 读写字节码
- 产生式系统 实验报告 人工智能原理实验
- erp框架 saas_Saas模式ERP系统
- 今天市场:洗洗更健康!
- 【每日蓝桥】44、一七年省赛Java组真题“纸牌三角形”
- 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动
- 数字电路实验怎么接线视频讲解_【高中物理】电学实验满分知识点总结及例题精讲...
- 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换
- aardio web.blink打开网址
- 04-31.eri-test Como ler um arquivo JSON no Java
- Nokia 6030默认保密码
- 安装微信开发者工具及创建小程序
- 计算机平面设计专业素描教案,透视在中职计算机平面设计专业素描教学中的运用策略...
- mybatis项目报Error parsing SQL Mapper Configuration.错误及解决方法
- 毕业论文查重是怎样查的?
热门文章
- 学习笔记6—pandas中ix,loc,iloc有什么区别?
- 写给Android开发者的混淆使用手册
- 17年第八届蓝桥杯省赛(C语言B组) 题解
- 批处理文件中获取当前所在路径的几种方法,以及写文件到txt
- 20169219 使用Metaspoit攻击MS08-067实验报告
- 关于个人博客转移的那些事
- [转载]EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼
- 网络协议从入门到底层原理(8)HTTPS(成本、通信过程、TLS1.2的连接,配置服务器HTTPS)
- 【数据库系统设计】数据库安全性
- 报表参数控件和报表内容自动居中设置方法