ToF 测距传感器 VL6180 使用踩坑记(软件 I2C)

您所在的位置:网站首页 i2c_readbyte ToF 测距传感器 VL6180 使用踩坑记(软件 I2C)

ToF 测距传感器 VL6180 使用踩坑记(软件 I2C)

2024-07-11 00:53| 来源: 网络整理| 查看: 265

VL6180 使用坎坷过程 ...... by 矜辰所致 .. 更新测距范围说明 2024.2 前言

最近项目上用到一款测距传感器 VL6180 ,实际网上资料已经很多了,而且都有现成的 Demo ,甚至拿来直接用都可以,实际上在使用 STM32 芯片做测试的时候,参考网上的现成例程,一切看起来都是正常的,但是在移植到项目需要的 51 上的时候,真的是一波三折,问题频出。

上一篇文章写到的 单片机中的 nop 函数 也是因为在移植的过程中遇到了问题,所以特地记录分析了一下,那么本文 主要就来说明一下在移植 VL6180 驱动的过程中遇到的问题,以及如何解决的。(本文的驱动为 软件 I2C 驱动)

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

目录 前言一、 基本介绍1.1 测距范围1.2 引脚以及原理图 二、驱动程序2.1 VL6180 传感器驱动2.2 I2C 通用驱动2.3 us 延时函数 三、移植问题说明3.1 硬件设计注意事项3.2 驱动移植3.3 VL6180 主要问题(DataNotReady 单次读取一直等不到 Ready)`while((VL6180X_ReadByte(...&0x04)) `尝试解决 3.4 解决问题 结语

一、 基本介绍

传感器描述的基本介绍这里就不多说了,也不是什么新的传感器了,ST 官网和网上资料一大堆,简单来说,就是一款可以 测距离 和 光照强度 的传感器,通讯接口为 I2C 。

参考资料可以直接从 ST 官网下载,本文主要针对他的 测距功能说明。

1.1 测距范围

可以测量的距离手册上是写的为 0 ~ 62 cm 最大(根据测量环境决定)。

个人建议如果你需要测量的是 20cm 以内的范围,传感器可以完美的适配。

如果大于 20cm ,就得斟酌一下,虽然我只需要测量 10 cm 以内的范围,但是发现超过 20 cm 的话准确度没那么高。(也许是我大距离没有认真测试,也许与我的测试环境有关。) 对于可以测量距离更远的传感器, ST 公司也有另一个型号的传感器:VL53L 系列的 ToF 测距传感器,测距可以达数米范围。

更新补充,上面说到超过 20 cm 有问题,并不是传感器本身的问题,而是传感器默认的测距范围就是 ~ 20cm ,如果需要测量到 40cm 或者 60cm ,需要修改配置,具体修改方式可参考我下面这篇文章:

ToF 测距传感器 VL6180 测量范围修改(软件 I2C)

1.2 引脚以及原理图

扯远了,我们回来看看我们的 VL6180 ,主要看看传感器引脚以及如何自己画原理图以及 PCB。

当然,大多人接触到传感器都是现成的小模块,比如某宝买的小板子,使用起来直接给 3.3V GND SCL 和 SDA 接口连接即可,如下图:

在这里插入图片描述

关于上面某宝 VL6180 小模块的说明,模块上的 SCL SDA 是已经做过电平转换的,因为 SCL 和 SDA 是需要上拉到 2.8V ,所以使用小模块我们不管接 3.3V 或者 5V 的 IO,都可以直接连接使用, 但是如果 使用的单片机 为 1.8V 的 IO ,那么小模块不可以直接连接。

我在最开始的时候测试使用的是 STM32 ,也是直接用的现成的模块,但是因为后面移植到 1.8V 的单片机上(其实可以在小板子上面去掉电平转换的 MOS管后飞线使用),所以需要了解引脚以及原理图设计,所以这里还是需要说明一下这一部分,手册中对于引脚的定义如下:

在这里插入图片描述

手册上面推荐的原理图如下:

在这里插入图片描述

上图中红色部分,7脚本来是 NC ,但是建议连接 GND(不接的话一般正常使用也是没有问题的),因为在另一份官方文档中有这样的建议,如下图:

在这里插入图片描述 不仅如此,因为传感器使用的过程中,我遇到了一些问题,在官方的社区看到了 ST的工程师有过类似的回复,如下图:

在这里插入图片描述

以上介绍的是芯片的使用原理图,大家如果自己画 PCB ,直接按照上面的来就行了。

需要说明的是,官方推荐的 上拉是到 2.8V or 1.8V,我测试的时候发现 GPIO0 接 1.8V 不行,需要接2.8V。

然后 SCL 和 SDA ,1.8V 或者 2.8V 都可以,注意如果单片机的 IO 口为 1.8V高电平,那么可以直接连接,如果是 3.3V 或者 5V,就需要做电平转换。

GPIO1 不使用的话就什么都不接, 根据以上说明,那么传感器配上驱动就能正常使用了。

二、驱动程序

不管是自己画的 PCB 还是买的小模块,准备好了硬件后,就得写驱动程序了。

一个 软件 I2C 驱动包括,通用驱动(实现 i2c 起始信号,结束信号,读写功能的驱动) 和 传感器驱动(针对使用的传感器实现不同的数据读写的驱动)。

2.1 VL6180 传感器驱动

文章开头也说了,VL6180 传感器驱动程序实际上网上有现成的,比如博主找到的就是下面博文提供的驱动:

STM32驱动VL6180X测距

驱动不用多说,大家可以直接参考,我也确实在 STM32 上面测试成功了,结果如下图:

在这里插入图片描述

那对于上面推荐文章的驱动,我也是直接拿过来用的,当然,I2C 的通用驱动程序得自己实现,相信大家自己手头也应该有一份,我这里也再次放一遍,这个驱动好像是从以前正点原子那儿看到的一直沿用下来的。

2.2 I2C 通用驱动

i2c.c:

#include "i2c.h" // ------------------------------------------------------------------ void i2c_init(void) { // the SDA and SCL pins are defined as input with pull up enabled // pins are initialized as inputs, ext. pull => SDA and SCL = high } // ------------------------------------------------------------------ // send start sequence (S) void I2C_Start(void) { MYIIC_DATA_HIGH; delay_us(5); MYIIC_CLK_HIGH; delay_us(10); MYIIC_DATA_LOW; delay_us(10); MYIIC_CLK_LOW; //使SCL置低,准备发送或者接受数据 delay_us(10); } // ------------------------------------------------------------------ // send stop sequence (P) void I2C_Stop(void) { MYIIC_DATA_LOW; delay_us(5); MYIIC_CLK_LOW; delay_us(10); MYIIC_CLK_HIGH; delay_us(5); MYIIC_DATA_HIGH; delay_us(10); } // ------------------------------------------------------------------ // returns the ACK or NACK //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 I2C_Read_Byte(unsigned char ack) { unsigned char i,receive=0; // MYSDA_IN;//SDA设置为输入 for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3