Pmod ToF分层块库

Digilent为针对Digilent FPGA开发板的Pmod ToF提供了一个库,将与Xilinx SDK开发环境一起使用。

概述

软件

Vivado库存储库的层次结构分支邮政编码Git存储库


图书馆的使用

为了实现Pmod ToF功能,库访问Pmod ToF硬件。请按照向Vivado IPI设计中添加分层块将Pmod ToF分层块添加到项目中。

库模块

上图显示了Pmod ToF分层块库的总体结构以及库模块之间的关系。
库模块访问Pmod ToF功能。这些模块如下:

ISL29501模块包含用于通过I2C与ISL29501芯片。
eepm模块包含用于通过I2C与爱特梅尔公司®AT24C04Deepm内存。
PmodToF模块实现了Pmod ToF器件的初始化函数、校准函数、ISL29501注册表和eepm内存访问功能。
I2C接口GPIO接口UART接口属于最底层,由Xilinx SDK中的BSP项目提供。这些接口实现了通信协议。

PmodToF模块

PmodToF库模块实现了PmodToF的相关功能。
这些功能在I2C上配置和初始化Pmod ToF设备,并访问Pmod ToF功能,如执行校准和测量以及R/W操作eepm和ISL29501寄存器。
要了解更多细节,请参阅ISL29501 -飞行时间(ToF)集成电路EEPROM作为部分。
为了实现I2C通信,PmodToF模块访问中实现的函数ISL29501模块eepm模块.它使用数字IO引脚暴露在Pmod ToF连接器:SCL(I2C时钟)和SDA (I2C数据)。ISL29501还使用了IRQ(中断)和SS(启动样本)。而IRQ和SS引脚是特定于ISL29501芯片,I2C线(数据和时钟)是与eepm设备。

PmodToF模块包含用于执行校准和测量的库函数。校准通过调整测量误差来保证测量的准确性。有关校准和测量的详细信息,请参阅校准测量部分。

PmodToF_Initialize

剧情简介:

空白PmodToF_Initialize ();

参数:

<一>

返回值:

<一>

描述:

函数初始化eepm和ISL29501。
它设置ISL29501芯片地址和eepm通过I2C协议进行通信的芯片地址并初始化
ISL29501寄存器(参见ISL29501 -飞行时间(ToF)集成电路章节),如ISL29501固件程序(an1724.pdf)ISL29501芯片初始化文档。

例子:

# include“PmodToF.h”

PmodToF_Initialize ();


PmodToF_start_calibration

剧情简介:

uint8_t PmodToF_start_calibration(双actual_distance);

参数:

< actual_distance > 这是正确的距离值为此需要进行手动校准。
距离需要大于5厘米(0.05米)。

返回值:

uint8_t -错误码:

ERRVAL_SUCCESS 0 成功
ERRVAL_INCORRECT_CALIB_DISTACE 0中 不正确的校准距离;它必须大于5厘米(0.05米)
ERRVAL_FAILED_STARTING_CALIB 0 xfc 启动校准失败,eepm或ISL29501设备繁忙

描述:

这个函数执行手动校准设备,对由actual_distance参数值提供的距离进行校准。
它调用所有3校准例程描述在ISL29501固件程序(an1724.pdf)文档。

例子:

# include“PmodToF.h”

ErrCode = PmodToF_start_calibration(距离);


PmodToF_perform_distance_measurement

剧情简介:

双PmodToF_perform_distance_measurement ();

参数:

<一>

返回值:

距离值 由装置测量的距离

描述:

这个函数发起一个测量并检索测量到的距离值
在调用此函数之前,重要的是执行手动校准,或者将校准存储在中,然后从eepm从用户区域或工厂校准恢复eepm
它遵循了进行距离测量的步骤,如ISL29501固件程序(an1724.pdf)文档。

例子:

# include“PmodToF.h”

measured_distance = PmodToF_perform_distance_measurement ();


PmodToF_ReadCalibsFromEPROM_User

剧情简介:

uint8_t PmodToF_ReadCalibsFromEPROM_User ();

参数:

<一>

返回值:

uint8_t -错误码:

ERRVAL_SUCCESS 0 成功
ERRVAL_EPROM_MAGICNO 0 xfd 错误的魔术数字时,从eepm
ERRVAL_EPROM_CRC 以0 xfe 读取数据时校验和错误eepm

描述:

该函数从中读取用户校准数据eepm

例子:

# include“PmodToF.h”

PmodToF_ReadCalibsFromEPROM_User();


PmodToF_WriteCalibsToEPROM_User

剧情简介:

uint8_t PmodToF_WriteCalibsToEPROM_User ();

参数:

<一>

返回值:

uint8_t -错误码:

ERRVAL_SUCCESS 0 成功
ERRVAL_EPROM_WRITE 0 xfa 没有写eepm在I2C通信
ERRVAL_ToF_READ 0 xf6 通过I2C通信读取ISL29501寄存器失败

描述:

的用户校准区域写入校准数据eepm
必须在对校准数据进行更改之后(在手动校准之后)调用它,以便将它们保存在非易失性存储器中。

例子:

# include“PmodToF.h”

uint8_t ErrCode = PmodToF_WriteCalibsToEPROM_User();


PmodToF_RestoreAllCalibsFromEPROM_Factory

剧情简介:

uint8_t PmodToF_RestoreAllCalibsFromEPROM_Factory ();

参数:

<一>

返回值:

uint8_t -错误码:

ERRVAL_SUCCESS 0 成功
ERRVAL_EPROM_MAGICNO 0 xfd 错误的魔术数字时,从eepm
ERRVAL_EPROM_CRC 以0 xfe 读取数据时校验和错误eepm
ERRVAL_EPROM_WRITE 0 xfa 没有写eepm在I2C通信
ERRVAL_ToF_READ 0 xf6 通过I2C通信读取ISL29501寄存器失败

描述:

该功能从中恢复出厂校准数据eepm
工厂校准数据从eepm并写入用户校准区eepm并进入ISL29501校准寄存器。

例子:

# include“PmodToF.h”

uint8_t ErrCode = PmodToF_RestoreAllCalibsFromEPROM_Factory();


PmodToF_ReadSerialNoFromEPROM

剧情简介:

uint8_t PmodToF_ReadSerialNoFromEPROM (char * pSzSerialNo);
char * pSzSerialNo 用于保存序列号序列的字符串指针

返回值:

uint8_t -错误码:

ERRVAL_SUCCESS 0 成功
ERRVAL_EPROM_MAGICNO 0 xfd 错误的魔术数字时,从eepm
ERRVAL_EPROM_CRC 以0 xfe 读取数据时校验和错误eepm

描述:

此函数从中检索序列号信息(12个字符)eepm

这个函数的调用者在pSzSerialNo中分配足够的空间是很重要的。

例子:

# include“PmodToF.h”

char SerialNo [13];
uint8_t ErrCode = PmodToF_ReadSerialNoFromEPROM(SerialNo);

要了解更多细节,请参阅序列号部分。

ISL29501模块

ISL29501模块由PmodToF模块为目的图书馆内部(初始化和R/W操作)通过I2C与ISL29501芯片。
看到ISL29501 -飞行时间(ToF)集成电路部分获取更多细节。

eepm模块

eepm模块被PmodToF模块为目的图书馆内部(初始化和R/W操作)通过I2C与爱特梅尔公司®AT24C04D内存芯片。
看到EEPROM作为部分获取更多细节。


Pmod ToF硬件和校准细节

ISL29501 -飞行时间(ToF)集成电路

ISL29501芯片使用暴露在Pmod ToF连接器中的数字IO引脚访问:SCL(时钟总线),SDA(数据总线),IRQ(中断)和SS(样本启动)。
SCL和SDA由I2C总线使用,并与爱特梅尔公司®AT24C04D内存芯片。IRQ和SS是GPIO别针。
ISL29501芯片可以通过I2C协议访问地址:0 x57h

每次电路板被通电循环和Zybo Z7-20电路板被编程,PmodToF_Initialize函数,并从其中导入程序值eepm用户区,进入初始化寄存器。

芯片初始化程序在ISL29501固件程序(an1724.pdf)文档。
这些值(见下表)是由Digilent设置的,用户在更改它们时必须非常小心。在这种情况下,用户必须修改这些值手动校准前
请阅读ISL29501文档在继续之前。

注意:在恢复出厂校准之前,如果用户修改了这些寄存器值(位于PmodToF_Initialize函数),必须将它们恢复到下面指定的值,否则测量将不正确。

寄存器地址 数据
0 x10 0 x04
0 x11 0 x6e
0 * 13 0 x71
0 x18 0将
0 x19 0将
0 x60 0 x01
0 x90 0 x0f
0 x91 0 xff


校准

为了实现精确的距离测量,需要对Pmod ToF进行校准。的eepm存储两组校准值。
工厂校准集包含通用校准值,在设备制造时加载不能修改

用户校准集包含用于校正测量的校准值。用户可以在执行自己的校准时覆盖用户校准设置。最初,用户校准集加载工厂校准值。它总是可以通过调用恢复到工厂校准PmodToF_RestoreAllCalibsFromEPROM_Factory函数。

在工厂eepm其编程具有通用校准剖面,有助于在30cm-3m范围内进行测量。
如果用户想要更精确的测量,可以通过调用PmodToF_start_calibration函数。

校准程序涉及Pmod ToF所需的三种校准:级校准相声校准距离标定
对于校准程序,用户需要一个支持设置,以保持Zybo Z7-20板垂直,并至少高于地面或桌子40厘米。
下面的图像是所描述的设置示例。

setup.jpg


校准程序的步骤如下:

  1. 级校准不需要任何特殊设置。这是一个内部校准,因此外部条件不相关。
    用户需要等待5秒进行此校准
  2. 设置相声校准,必须阻止发射器的光到达光电二极管。为了这个校准是准确的,它是关键的,所有的光被阻挡。所有的光都被阻挡,只有噪声信号到达局部放电电路。这可以通过包内的泡沫覆盖两个光学元件来实现,以确保没有返回路径的红外信号发射领导(见下图)。如果光学元件没有被正确覆盖,在进行测量时将会产生很大的误差。串扰校准过程比幅值校准慢。用户需要等待10秒才能执行此校准
    setup3.jpg
  3. 设置距离标定, Pmod必须被放置在一个已知距离的白色目标(一个具有高IR反射能力的目标),完全覆盖Pmod的发射器二极管的视场。电路板的位置必须保证发射器的光不会反射到桌面、墙壁或其他物体上。一个好的估计是让所有物体至少保持两倍的校准距离乘以两倍的发射器的视角正切(+/-3°)。用户可以想象一个假想的圆柱体,其半径计算如下,板和目标在末端(例如:校准距离为30cm,圆柱体的半径为6.3cm)。
    formula.jpg
    用户应在最小和最大期望测量距离之间选择一个校准距离。Pmod ToF也应放置在离地面或桌子至少40cm的地方。测量距离Pmod ToF越远,面积应该越大。用户需要等待10秒才能执行此校准
    下面的图像是一个设置30cm校准距离的示例。

setup2.jpg

注意:关于每次校准开始和结束的时刻的信息将通过UART显示在终端应用程序中。

有关校准过程的详细信息,请参阅TOF串扰校正的最佳实践

校准寄存器

校准寄存器可在ISL29501文件,在章节0.4A:闭环校准寄存器。


测量

可以通过调用来执行度量PmodToF_perform_distance_measurement函数。


EEPROM作为

Pmod ToF提供了一个非易失性eepm内存爱特梅尔公司®AT24C04D它有4kbits的可用空间。
爱特梅尔公司®AT24C04D存储器芯片使用暴露在Pmod ToF连接器中的数字IO引脚访问:SCL(时钟总线)和SDA(数据总线)。
它与ISL29501芯片共享I2C总线。
爱特梅尔公司®AT24C04D内部组织为32页,每页16字节。

eepm存储两组校准值。工厂校准集包含设备制造时执行的通用校准值不能修改
用户校准集包含用户执行自己校准时生成的值。最初,用户校准集与工厂校准阀加载。总是可以通过调用PmodToF_RestoreAllCalibsFromEPROM_Factory函数。

部分内容 段基地址 大小
序列号 0 x00 16字节
用户校准数据 0 x10 16字节
工厂校准数据 0 x20 16字节
空闲内存 464个字节

访问设备需要8位设备地址字。
内存可以通过I2C协议访问地址:0 x50h结构如下:

设备地址
Bit7 位6 位5 位4 位3 位2 位1 位0
1 0 1 0 0 0 A8 R / W

设备地址字节的第0位是读/写操作选择位。设备地址字节的第1位是9位存储器阵列字地址的最有效位。

9位存储器阵列字地址
页码 内存页中的地址
位8 Bit7 位6 位5 位4 位3 位2 位1 位0
A8 A7 A6 A5 A4 A3 A2 A1 A0

eepm用于存储以下系统信息:

  • 序列号:
    • 12字节的有效负载(参见序列号
    • 2额外字节:魔术数字,校验和
    • 2个虚拟字节用于对齐到16字节
    • 总共16字节=一个内存页。
  • 用户校准:
    • 13字节的有效负载(参见校准寄存器
    • 2额外字节:魔术数字,校验和
    • 一个虚拟字节用于对齐到16字节
    • 总共16字节=一个内存页。
  • 工厂校准:
    • 13字节的有效负载(参见校准寄存器
    • 2额外字节:魔术数字,校验和
    • 一个虚拟字节用于对齐到16字节
    • 总共16字节=一个内存页。

总共使用了3个内存页(48字节),请参阅上面的地址空间表。
请注意,用户校准区域的结构与工厂校准区域的结构相同。
有关校准过程的详细信息,请参阅校准部分。

为了安全起见,上面提到的每个内存部分都包含了额外的信息:

  • 包含特定幻数(0xEB)的字节。
  • 一种字节,它包含写入特定部分的所有字节的校验和

当阅读一个章节的内容时eepm,检查这两个安全字节,当发现不匹配时返回错误。

序列号

每个板都有一个独特的序列号(称为SerialNo),构建如下:

  • 6个字符Pmod ToF前缀(Digilent ID + Schematic ID): " 210356 "
  • 每个板的6个字符的唯一序列(从条形码标签中“D”后读取):例如“A76C0C”

示例Pmod ToF SerialNo: " 210356A76C0C "
这是写在eepm在生产过程中,用户不得更改。