TE3000激光控制卡使用说明书
2006/05
一 概述
TE3000是一款针对激光控制行业设计的多功能DA输出卡,为用户提供了4路模拟信号输出通道 ,2路PWM数字信号输出通道 , 26Bit TTL 数字量输入通道,26Bit TTL数字量输出通道。内建的32Bit“解码引擎”可以主动从PC的内存中取得指令,并以每秒10万次的速度解析用户指令,从而实现高速,连续,精细的控制输出。
二、性能和技术指标
2.1 性能
? 4路模拟信号输出通道
? 模拟信号输出分辩率16Bit
? 模拟信号输出范围±10V或 ±5V
? PWM输出可调范围16bit
? PWM输出可调精度0.1uS
? PWM输出首脉冲抑制
? 26Bit DI TTL兼容数字量输入
? 26Bit DO TTL兼容数字量输出,可位操作。
? 内建32Bit解码引擎
? 解码器缓存4K BYTE
? 解码指令周期100nS
? PCI总线兼容PCI2.2规范
? 5V,3.3V PCI环境兼容
? PCIX 环境兼容(33M)
? PCI主控传输方式,BUSMASTER
? 链表DMA,Scatter /gatter DMA
? 兼容Windows2000,XP
? VC兼容DLL,LIB
2.2模拟信号输出技术指标
? 模拟信号输出通道: 4
? 模拟信号输出分辨率 16位
? 模拟信号输出范围: ±10 V或 ±5V
? 数模转换器件 DAC5547
? 连续控制周期 100ns
? 建立时间: 2uS
? 精度: 优于±0.003%满量程
? 线性度: ± 1/2 LSB
? 复位状态: 0输出
? 输出负载能力: ±5mA
2.3 PWM 输出
? PWM输出通道: 2路反相
? 脉冲周期范围: 0.1uS – 6.5535mS
? 高电平输出范围: 0.0uS – 6.5535mS
? 分辨率 0.1uS
? 建立时间: 0.1uS
? 输出电平: TTL兼容
? 低电平输出: 灌电流20mA时,最大输出0.5 V ? 高电平输出 源电流20mA时,最小输出2.4V ? 复位输出 PWMA 输出0
2.4 数字量输出
? 通道: 26路
? 输出电平: TTL兼容
? 低电平输出: 灌电流20mA时,最大输出0.5 V ? 高电平输出 源电流20mA时,最小输出2.4V ? 复位输出 输出0
2.5 数字量输入
? 通道: 26路
? 输入电平: TTL兼容
? 低电平输入: 最大0.8V
? 高电平输入 最小2.0V
2.6 其他参数
? 工作温度 : 0 - 60
? 储存温度 : -40 - 80
? 最大功耗 : 500mA
三.板卡布局
接口定义:
CN2 :DB37接口,模拟量输出,PWM ,DIO输出 CN1 :IDC40接口,辅助数字接口EDIO
JP1 :选择模拟量输出范围
OPEN ±10 V :CLOSE ±5V
JP2 :预激励PWM输出控制
OPEN 无输出 :CLOSE 有输出
四、引脚描述
4.1 CN2
模拟量输出引脚 : AO(0..2)
数字量输出引脚 : DO(0..9)
数字量输入引脚 : DI(0..9)
PWM 输出引脚 : PWMA
开激光(LaserON): PWMB
数字地 : DGND
模拟地 : AGND
4.2 辅助数字量引脚CN2
数字输出 :
EDO【0:15】
数字输入 : EDIO【0:15】
电源 :
VCC=5V
数字地
:
DGND
五.工作原理:
TE3000的工作核心是在FPGA中内建的32bit解码引擎(DJET)。 DJET 以100ns的速度解析用户给定的指令,实现DA的输出,数字输出, PWM输出,延时等功能。用户应用程序通过DMA传输或直接命令方式同DJET进行数据沟通。直接命令是由应用程序通过IO写的方式通知DJET,DJET会立刻执行直接命令,如果DJET正在DMA传输方式,会在结束当前指令后暂停DMA 指令的读取,立刻执行直接命令; DMA传输方式是一种智能的控制方式,应用程序设置好相应的参数后DJET会自动从PC的内存中取出指令;DMA传输方式时指令大小可以是无穷大,也可以是指定的内存块的大小。
我们为客户提供简单函数接口来完成相应的控制:
TE3000_writeIoPort :实现直接命令控制。
TE3000_SglTranfer :实现块DMA传输控制。
TE3000_ShuttleTranfer:实现循环DMA传输控制
.关于本卡片设计使用主控链表式DMA的介绍
Windows操作系统的管理内存机制使的应用程序很难在运行时申请到连续的大块的物理内存,由于DMA是直接对物理内存操作,如果不用链表DMA方式会造成每次DMA数据块大小受连续内存块大小限制。链表DMA方式是使用链表来管理不连续的物理内存,从而使应用程序在运行时可以使用整个空闲内存,提高内存的使用效率,链表是由驱动程序设置,通过硬件自动管理,应用程序不必关心实现细节。只需用数组或malloc申请需要的内存大小。(链表管理最大内存值受限于注册表TE3000项目 // MaxSglTransferSize,你需要修改此项以申请合适的缓冲区)。
如果我们将链表首尾相连,就可以实现连续的DMA传输,传输的数据大小可以是无穷大,我们提供的函数会在指定的块传输完成后,产生一个事件,应用程序可以在此时更新其中的内容。从而实现连续的解码控制。
六.解码引擎(DJET)指令简介
解码引擎接受32BI指令,通常情况下指令包括控制命令和参数两个
部分,(只有在连续坐标输出时,指令包含两个模拟通道输出的参数);控制命
令固定占用最高一个字节,根据控制命令不同可以带一个或两个不同意义
的参数,参数长度也会不同。
6.1指令列表:
控制命令 参数1 参数2 说明 0X10 连续坐标输出 PWM控制输出 系统工作控制命令
0X12 延时时间 无 解码器延时
0X16 等待条件 无 解码器等待
0X20 DA0输出值 延时时间 模拟量0通道绝对输出
0X21 DA1输出值 延时时间 模拟量1通道绝对输出
0X22 DA2输出值 延时时间 模拟量2通道绝对输出
0X23 DA3输出值 延时时间 模拟量3通道绝对输出
0X28 DA0输出值 选择开关 模拟量0通道选择输出
0X29 DA1输出值 选择开关 模拟量1通道选择输出
0X30 DO 输出值 延时时间 数字量输出DO【9:0】
0X31 EDO 输出值 延时时间 数字量输出EDO【15:0】
0X34 DO位选择 延时时间 数字量位置高
0X35 DO位选择 延时时间 数字量位清零
0X40 脉宽初始宽度 无 脉宽初始值设置
0X42 脉宽调整步长 无 脉宽调整步长设置
0X44 步长调整次数 无 脉宽调整次数设置
0X46 周期值 无 PWM输出周期值
0X48 延时时间 无 开激光延时设置
0X50 位置次数低位 无 连续位置输出次数设置低16位 0X51 位置次数高位 无 连续位置输出次数设置高13位 0X52 延时时间 无 连续位置输出延时设置
0X70 脉宽 无 预激励脉冲宽度
0X71 周期 无 预激励PWM周期
其他 保留功能
6.2系统工作控制命令offset=0x10
位域 31:24 23:4 3 2:0
定义 0X10 保留 开始连续位置输出 PWM输出控制 说明: BIT【3】由低到高,开始连续位置输出功能。以后的指令为连续的位置指令,每个指令包含DA0,DA1值。(参考连续位置输出介绍)
BIT【0】软件控制激光开关 , 高电平立刻开激光LaserON,PWM输出
BIT【1】硬件控制激光开关 , DI【9】为低,开激光LaserON,PWM输出
BIT【2】智能控制激光开关 , 如果连续输出进行中开激光LaserON,PWM输出
参考PWM输出功能介绍
6.3.解码器延时控制offset=0x10
位域 31:24 23:16 15:0
定义 0X12 保留 延时长度T
说明: 参数T是需要延时的大小,单位是0.1uS。
由于指令解析需要https://www.docsj.com/doc/f214819713.html,,所以实际延时是(T+1)X 0.1uS
此命令只在DMA续解码时有用。
6.4.解码器等待控制offset=0x16
位域 31:24 23:7 6 5 4:0
定义 0X10 保留 等待使能Y 等待条件 位置选择SEL 说明 : 当使能为高时,解码器等待SEL【4:0】指定的DI位,同Y相同时继续执行以后的指令,否则一直等待。
SEL【4】=0 则 SEL【3:0】 选择DI【9:0】
SEL【4】=1 则 SEL【3:0】 选择EDI【15:0】
例如 : 0x10000060 会等待DI【0】为低时继续执行。
6.5直接模拟量输出offset=0x20,0x21,0x22,0x23
位域 31:24 23:16 15:0
模拟量0通道 0x20 延时长度M DA输出值VALUE
模拟量1通道 0x21 延时长度M DA输出值VALUE
模拟量3通道 0x22 延时长度M DA输出值VALUE
模拟量3通道 0x23 延时长度M DA输出值VALUE
说明 : 将给定的值写入对应的数模转换器,并执行延时M个延时单位
VALUE范围0000-0xffff 跳线选择对应±10 V或 ±5V。
M范围是0-255,延时单位是0.8u;
如“TEST01” 跳线选择±5V
0x20190000;设置DA0=-5V,延时20uS
0x20194000;设置DA0=-2.5V,延时20uS
0x20198000;设置DA0=0V,延时20uS
0x2019c000;设置DA0=2.5V,延时20uS
0x2019ffff; 设置DA0=5V,延时20uS 0x100003e7; 延时100uS 0x20008000 设置DA0=0V
6.6选择模拟量输出offset=0x28,0x29
说
明
位域 31:24 23:16 15:0
模拟量0通道 0x28 选择值S DA 输出值VALUE 模拟量1通道 0x29 选择值S DA 输出值VALUE
说明 : 如果EDI【7:0】同选择值相同,输出VALUE 到DA 通道。 否则忽略从命令。
6.7数字量输出offset=0x30,0x31
位域 31:24 23:16 15:0 数字量DO 0x30 延时大小M DO 输出值VALUE 数字量EDO 0x31 延时大小M EDO 输出值VALUE 说明 : 将给定的值VALUE 输出到数字输出,并执行延时T 个延时单位
DO 范围是【9:0】,EDO 范围是【15:0】;
M 范围是0-255,延时单位是0.8uS
6.8数字量位操作offset=0x34,0x35
位域 31:24 23:8 7:5
4:0 置高 0x34 延时大小T 保留 位选择S 清零 0x35 延时大小T 保留 位选择S
说明 : 对特定的位操作,并且延时T 时间
S【4】=0选择DO 端口,S【3:0】选择0-9
S【4】=2选择EDO 端口,S【3:0】选择0-15 T 占用16bit 范围【0-65535】延时单位为0.1uS
6.9 PWM 输参数设置offset=0x40,0x42,0x44,0x46, 0x48 位域 31:24 23:16 15:0 脉宽初始值设置 0x40 保留 PStartValue 脉宽调整步长设置 0x42 保留 PStepValue 脉宽调整次数设置 0x44 保留 PStepCounr PWM 输出周期值 0x46 保留 PATime 开激光延时设置 0x48 保留 PSync 说明 : 以上参数占有16位宽度,时间单位0.1uS
由于一些激光器需要在开激光头几个脉冲宽度小于正常的宽度。 这就需要设置脉宽调整步长,和调整次数。
开激光延时设置:激光打开操作到实际的LaserOn 的时间。 例子如下
0x4000000a 设置脉宽初始值设置1uS
0x4200000a 脉宽调整步长设置1us
0x44000002 脉宽调整次数2次;
0x44000032 PWM周期为5uS
0480000064 开激光延时10uS
0x10000001 打开PWM
产生的周期为5us的PWM信号,
第一个脉冲在0x10000001指令10uS出现;
第一个脉宽1uS, 第二个脉宽2uS,
第三个脉宽3uS,以后都为3uS。
6.10 连续位置输出参数设置offset=0x50,0x51,0x52
位域 31:24 23:16 15:0
连续位置输出次数设置低16位 0x40 保留 PStartValue
连续位置输出次数设置高13位 0x42 保留 PStepValue
连续位置输出延时设置 0x44 保留 PStepCounr
说明 : 连续位置输出在一个指令中输出DA0和DA1的值,
可以节省内存,提高编程效率;
输出次数是29位的整数,即最大可以是512M个【DA0,DA1】组合
输出延时指两个输出间的延时:0-65535,时间单位0.1uS 例如: 0x50000006 ;
0x51000000 ; 需要连续输出6次
0x52000064 输出延时10uS
0x10000008 开始连续位置输出;
0x0000ffff DA0输出5V,DA1输出-5V,延时10uS
0xffff0000 DA0输出-5V,DA1输出5V,延时10uS
0x0000ffff DA0输出5V,DA1输出-5V,延时10uS
0xffff0000 DA0输出-5V,DA1输出5V,延时10uS
0x0000ffff DA0输出5V,DA1输出-5V,延时10uS
0xffff0000 DA0输出-5V,DA1输出5V,延时10uS
6.11预激励PWM参数设置offset=0x70,0x71
位域 31:24 23:16 15:0
脉宽 0x70 无 预激励脉冲宽度
周期 0x71 无 预激励PWM周期 说明 : 当没有控制激光开始时,可以由跳线选择是否预激励,
脉宽和周期16bit的整数,单位时间0.1uS;
上电时初始化脉宽=1.6uS ; 周期=50uS
七 应用程序接口函数简介:
T3000_GetCardCount(U32 *CardCount);
功能:得到在系统中TE3000的卡数。
T3000_Open(U32 CardIndex, HANDLE *pDevice);
功能:对准备操作的卡初始化,得到句柄
T3000_Reset(hDevice);
功能: 复位TE3000,清空硬件缓冲区
T3000_Close(HANDLE hDevice)
功能: TE3000 操作结束,释放系统资源
T3000_ReadIoPort( HANDLE hDevice, U32 Offset, U32 *pData);
功能: 读出特定偏移位置的值
说明: TE3000使用此函数读取DI,EDI的值,Offset=0;
DI【9:0】占用*pData【9:0】
EDI【15:0】占用*pData【31:16】
T3000_WriteIoPort ( HANDLE hDevice, U32 Offset, U32 Data)
功能: 写特定偏移位置的值
说明: TE3000使用此函数对解码引擎直接控制,Offset=0;
T3000_SglTransfer(
HANDLE hDevice, U32 *pBuffer,U32 Length,
BUSWIDTH BusWidth, U32 IopToPci, BOOLEAN bSync) 功能: 开始指定的缓冲区输出,块传输
说明: *pBuffer 缓冲区开始位置
Length 缓冲区大小(BYTE计算)
BSync 同步/异步传输,同步指结束传输后函数返回
异步指函数立即返回,以后查询传输是否结束
本卡固定值BusWidth=3,IopToPci=0;
T3000_SglStopTransfer(HANDLE hDevice)
功能: 立刻结束块传输
T3000_SglCompleteEventGet(HANDLE hDevice, HANDLE *pEvent)
功能: 异步块传输时,得到传输结束事件
T3000_IsSglComplete(HANDLE hDevice, BOOLEAN *pbDone)
功能: 异步块传输时,查询传输是否结束
T3000_ShuttleBufferSetup
(HANDLE hDevice, void *Buffer, U32 Count, U32 *BufferId);
功能: 建立循环缓冲区链表;
说明: *Buffer 为当前块指针;
Count 为当前块大小(BYTE记)
BufferId 当前块编号
注意每块大小不能大于64M;
T3000_ShuttleTransfer
(HANDLE hDevice, BUSWIDTH BusWidth, U32 IopToPci); 功能: 开始将缓冲区循环输出;
说明: 对于本卡BusWidth=3,IopToPci=0;
T3000_ShuttleStopTransfer(HANDLE hDevice);
功能: 结束缓冲区循环输出
T3000_BlockFreeEventGet(HANDLE hDevice, HANDLE *pEvent)
功能: 循环输出时,得到块结束事件
T3000_BlockFreeIdGet(HANDLE hDevice, U32 *pId);
功能: 循环输出时,得到结束块的编号
八.软件安装
8.1 软件列表
随机的软件包括驱动程序,应用程序开发库,例子程序。
驱动程序 .\Driver\Te3000.sys
.\Driver\Te3000.inf
.\Driver\Te3000.dll
头文件 .\include\Te3000Api.h
.\include\Te3000Erro.h
.\include\Te3000Type.h 库文件 .\Lib\Te3000.Lib
说明书 .\DOC\Te3000.pdf
例子程序 .\LaserSample\*.*
安装文件 .\Setup\*.*
8.2 驱动安装
执行Setup\setup.exe安装程序,按提示一步步操作
当提示输入SGL缓存最大值大小时,填入适当的值,默认值64M,如果你的物理内存比较大可以选择更大的SGL缓存。
当所有的文件复制完成后,选择重新启动电脑。
九.硬件安装
1.关掉计算机及所有外设电源。
2.打开机盖,选择一个空槽,拧开档条的固定螺丝。
3.小心插入TE3000卡,上紧档条上的螺丝。
4.盖上机盖,连接好外围设备,打开电源。
十、 编程指南
例1:通用操作流程
:
T3000_GetCardCount(&Count); //得到系统中TE3000卡数
T3000_Open(Index, &hDevice); //打开指定的卡操作
:
T3000_WriteIoPort (hDevice, 0, 0x20004000);//DA0输出-2.5V.
T3000_WriteIoPort (hDevice, 0, 0x2100C000);//DA1输出 2.5V.
T3000_WriteIoPort (hDevice, 0, 0x31005555);//EDO[15:0]输出 0x5555.
T3000_WriteIoPort (hDevice, 0, 0x34000000);//DO[0]=1.
T3000_ReadIoPort(hDevice, 0, U32 *DI); //读出DI,EDI数字输入的值
:
T3000_Close(hDevice);
注意:系统中可以有多块TE3000卡,应用程序支持对多卡操作。
例1:块传输操作流程同步传输
i=0 ; DmaOutBuffer[i]=0x34006400; //SET_DO[0]=1 延时10uS
i++ ; DmaOutBuffer[i]=0x35006400; //CLR_DO[0]=0 延时10uS
i++ ; DmaOutBuffer[i]=0x34006400; //SET_DO[0]=1 延时10uS
i++ ; DmaOutBuffer[i]=0x35006400; //CLR_DO[0]=0 延时10uS
i++ ; DmaOutBuffer[i]=0x34006400; //SET_DO[0]=1 延时10uS
i++ ; DmaOutBuffer[i]=0x35006400; //CLR_DO[0]=0 延时10uS
i++ ; DmaOutBuffer[i]=0x34006400; //SET_DO[0]=1 延时10uS // 填充数据
3000_SglTransfer(hDevice, DmaOutBuffer, i*4 , BusWidth32, 0, FALSE);
T3000_SglStopTransfer(hDevice);
// SGL块传输,同步传输,传输结束后函数返回
// 注意传输完成时,最后的数据进如解码器FIFO,解码器解析指令还要时间 所以不能执行FIFO清空的函数。
例3:块传输异步等待结束
T3000_SglTransfer(hDevice, DmaOutBuffer, i*4, BusWidth32, 0, TRUE);
bDone = FALSE;
while(!bDone)
{
rc = T3000_IsSglComplete(hDevice, &bDone);
}
T3000_SglStopTransfer(hDevice);
//软件查询传输结束
例4:块传输异步事件通知结束
rc = T3000_SglCompleteEventGet(hDevice, &hEvent); //安装事件
r c = T3000_SglTransfer(hDevice, DmaOutBuffer, i*4, BusWidth32, 0, FALSE); dwRet = WaitForSingleObject(hEvent, 1000);
if(WAIT_TIMEOUT == dwRet)
{ p rintf("\n ERROR: T3000_SglTransfer time out!\n");}
T3000_SglStopTransfer(hDevice);
例4:循环块传输流程
T3000_ShuttleBufferSetup(
hDevice,
Buffer0_start_adrress,
Buffer0_SIZE,
&BufferId);
}; //安装第一个数据块
T3000_ShuttleBufferSetup(
hDevice,
Buffer1_start_adrress,
Buffer1_SIZE,
&BufferId);
};//安装第二个数据块
rc = T3000_ShuttleTransfer(hDevice, BusWidth32, 0);
t ime = n; //循环输出n次
w hile(time--)
{
dwRet = WaitForSingleObject(hEvent, INFINITE);
//等待数据块传输结束事件
rc = T3000_BlockFreeIdGet(hDevice, &BufferId);
//取得传输结束块的编号
rc = T3000_BlockFreeEventGet(hDevice, &hEvent);
//设置等待下次传输结束事件
//应用程序在此更新数据块的内容
}
r c = T3000_ShuttleStopTransfer(hDevice);
// 注意:所安装的数据块小于8个;
// 注意:数据块总和大小不能超过注册本项目的限制值
// 注意:每个数据块大小要求小于64M
// 注意:数据块太小会需要应用程序过多干预
十一、校准
交付到客户的每一块TE3000都经过校准,只有在极其少数的情况下你才有必要重新对板卡进行校准。
11.1可调电阻
对TE3000各模拟量输出通道的偏移和满度的校准,是通过一组可调电阻进行的,列表如下。
可调电阻编号 功能
VR1 模拟量输出0通道偏移校准
VR2 模拟量输出1通道偏移校准
VR3 模拟量输出2通道偏移校准
VR4 模拟量输出3通道偏移校准
VR5 模拟量输出满度校准(+)
11.2 校准过程
1)模拟通道满度校准;
模拟通道0写入0XFFF,调节 VR5,在输出端得到电压10V。
满度校准是所有的输出通道共用,所以只需校准一个通道。
2)模拟量输出0通道偏移校准
模拟通道0写入0x8000,调节VR1,在输出端得到电压0V。
2)模拟量输出1通道偏移校准
模拟通道1写入0x8000,调节VR2,在输出端得到电压0V。
2)模拟量输出2通道偏移校准
模拟通道2写入0x8000,调节VR3,在输出端得到电压0V。
2)模拟量输出2通道偏移校准
模拟通道2写入0x8000,调节VR4,在输出端得到电压0V。