Pmod ToF分层块库
Digilent为针对Digilent FPGA开发板的Pmod ToF提供了一个库,将与Xilinx SDK开发环境一起使用。
概述
软件
图书馆的使用
为了实现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设备繁忙 |
描述:
例子:
# 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厘米。
下面的图像是所描述的设置示例。
校准程序的步骤如下:
-
的级校准不需要任何特殊设置。这是一个内部校准,因此外部条件不相关。
用户需要等待5秒进行此校准. -
设置距离标定, Pmod必须被放置在一个已知距离的白色目标(一个具有高IR反射能力的目标),完全覆盖Pmod的发射器二极管的视场。电路板的位置必须保证发射器的光不会反射到桌面、墙壁或其他物体上。一个好的估计是让所有物体至少保持两倍的校准距离乘以两倍的发射器的视角正切(+/-3°)。用户可以想象一个假想的圆柱体,其半径计算如下,板和目标在末端(例如:校准距离为30cm,圆柱体的半径为6.3cm)。
用户应在最小和最大期望测量距离之间选择一个校准距离。Pmod ToF也应放置在离地面或桌子至少40cm的地方。测量距离Pmod ToF越远,面积应该越大。用户需要等待10秒才能执行此校准.
下面的图像是一个设置30cm校准距离的示例。
注意:关于每次校准开始和结束的时刻的信息将通过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在生产过程中,用户不得更改。