ToF 测距传感器 VL6180 使用踩坑记(软件 I2C) |
您所在的位置:网站首页 › i2c_readbyte › ToF 测距传感器 VL6180 使用踩坑记(软件 I2C) |
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(不接的话一般正常使用也是没有问题的),因为在另一份官方文档中有这样的建议,如下图:
以上介绍的是芯片的使用原理图,大家如果自己画 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 |