2021-01-20

VL53L0x激光传感模块实现在stm32f103zet6上的hal库移植,CubeMx初始化


一、 原理介绍略过
因为在其他中博客中已经介绍很详细,本人在调试过程中主要参考了blog,用的是正点原子的精英版:https://www.freesion.com/article/68111176561/
深受启发,以作感谢。
二、引脚介绍
1、模块外部一共6个引脚:
在这里插入图片描述

引脚分别为:XSH片选,INT中断(未用),SDA数据,SCL时钟,GND地线,VCC电源。
历程中,SCL对应PB6,SDA对应PB7,XSH对应PA15,
三、移植过程中遇到的问题
1>首先是移植需要做哪些修改,作者在这里遇到了好多坑,重点做介绍:
驱动文件是从ST官网下载的,这个官网也有两个,
官网提供的两个驱动
其实两个并没有本质的区别,只是例程有些不同,移植时主要使用了API目录下的文件,在这里插入图片描述
我们需要将这两个文件夹添加到CubeMx生成的标准工程中,这个过程比较简单,其次是修改,添加这两个文件后会报很多的错,按照链接中的blog修改后还是会出问题,例如好多头文件在所用平台的库中并没有,需要注释掉没有调用的头文件,在这里插入图片描述
首先要明确一点,API中的调用关系,vl53l0x_platform.c中提供了模块层的读写函数,是对
vl53l0x_i2c_win_serial_comms.c中的平台层的读写进行了封装,因为平台改变,我们也可以重新实现被调用的平台接口函数,作者这里是直接沿用的原来平台的文件,把没有用到的函数内容删除,根据vl53l0x_platform.c中VL53L0X_write_multi,VL53L0X_read_multi,VL53L0X_write_byte,VL53L0X_write_word,VL53L0X_write_dword,VL53L0X_read_byte,VL53L0X_read_word,VL53L0X_read_dword,几个函数被调用,在vl53l0x_i2c_win_serial_comms.c中,需要实现这几个函数,可以看到vl53l0x_i2c_win_serial_comms.c这个平台文件是对底层IIC协议的读写进行的封装,在这些函数中调用到的底层协议函数有两个,分别是VL_IIC_Write_nByte和VL_IIC_Read_nByte,作者在实验中没有用硬件IIC实现,使用的是gpio口软件模拟的IIC,所以在模拟IIC接口的基本功能后还要实现这两个函数。这部分容易搞错的地方就是函数名,两次封装过程中,各个参数的位置也在改变,需要看清楚。
改动完这些基本就移植好了。想要实现串口打印,还需要在usart.c中重定向printf.
2>测距要不要校准
该模块的4个校准主要有:参考SPADs校准(Reference SPADs calibration ),温度校准(Ref (temperature) calibration),偏移校准(Offset calibration),盖玻片校准(Cross-talk calibration)。从模块测量上来讲校准主要影响的就是精准度和误差,当然这些校准都可以不写,一般参考SPADs校准和温度校准每次上电都要校准一次,偏移和盖玻璃片校准比较复杂,一般只在模块成型后校准一次,作者亲自试过,如果把校准都删掉的话测量误差会非常大,添加上spads和温度校准后误差会明显缩小,后面两个校准因为没有用24C01所以没有具体测试,有条件的话做完偏移校准后应该会误差更低。
3>测距函数的选择
API中针对测距的函数有3个,参考博客中也有介绍:

    A、调用VL53L0X_StartMeasurement()函数,VL53L0X会按照之前设置的测距模式开始测距。
    B、调用VL53L0X_PerformSingleMeasurement()函数,VL53L0X会开始测距并且等待测距完成。此函数内部调用了VL53L0X_StartMeasurement()和VL53L0X_GetMeasurementDataReady()。
    C、调用VL53L0X_PerformSingleRangingMeasurement()函数,VL53L0X会开始测距,然后等待测距完成,接着清除中断,最后输出测量数据退出。此函数内部调用了VL53L0X_PerformSingleMeasurement()、VL53L0X_GetRangingMeasurementData()和VL53L0X_ClearInterruptMask()。

当然经过实验,这三种都是可行的,第三个函数是推荐用的,如果需要中间值进行判断的话,可以选择第二个。
三、测量过程
在这里插入图片描述
图片中的校准是直接读取24C02中的校准值写入的,作者项目中是直接只执行两个校准的。
四、代码实现
因为没有实现更加复杂的功能,使用的是普通单次测量加while循环的办法实现反复读取测量值。
在这里插入图片描述
到此以完美实现vl53l0x到STM32f103zet6上的HAL库移植,读者可实现其他复杂功能,有问题可以留言交流。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值