程序框架
全局函数
全局函数大部分以 STS 开始,如 STSSetMultiSite ()
非全局函数需要在函数前添加通道号,如 fovi0.MeasureVI ()
BEGIN_SINGLE_SITE()
END_SINGLE_SITE()
对某一工位单独进行操作,可配合 for 循环进行串行测试
dvi0.Set(FV,0,DVI400_20V,DVI400_400MA,RELAY_ON); for(BYTE i = 0; i < 4; i++) { BEGIN_SINGLE_SITE(i) dvi0.Set(FV, result[i], DVI400_20V, DVI400_400MA, RELAY_ON); delay_ms(1); END_SINGLE_SITE() }
delay_ms()
毫秒延时
delay_us()
微秒延时
STSDelayms()
毫秒延时,支持小数
StsSetModuleToSite (模块,工位,通道,-1)
STSSetMultiSite()
绑定工位通道
注意:
1) CBIT128、DIO 和 TRM 模块不做工位绑定;
2) OVI40 和 FOVI100 绑定方式不同。
OVI40 的 “0” 代表 CH0~CH3,“1” 代表 CH4~CH7,“2” 代表 CH8~CH11,… 以此类推。
FOVI100 的 “0” 代表 CH0,“1” 代表 CH1,… 以此类推
3) 各通道绑定的最大通道数
StsSetSiteStatus()
设置工位状态,0 为无效,1 为有效。使用完成后及时回复之前的状态。
StsSetSiteStatus(0x000D);//0000 0000 0000 1101——设置site1,site3,site4有效,其他工位均无效。
StsGetSiteStatus()
获取工位状态到数组,0 为无效,1 为有效
BYTE sitesta[4]; StsGetSiteStatus(sitesta, 4); //获取各个工位有效信息
StsGetDieCorXY()
获取测试中圆片的 die 的 XY 坐标
int CorX[4]={0}; int CorY[4]={0}; StsGetDieCorXY(CorX, CorY, 4);//获取4个工位的die坐标
STSSetTimeCheck()
STSGetTimeElapsed()
计算两函数之间经过的时间,单位 ms
STSSetSaveInterval()
设置保存数据的采样间隔(包含 fail 数据)
AWG
AWG 使用流程:
- 1. 设置波形数组 pattern;
- 2.AWGLoader () 导入波形;
- 3. 设置 V1 源初始状态;
- 4.AWGSelect () 选择运行的波形,
- 5. 设置 V/ITrig;
- 6.MeasureVI (MEAS AWG) 设置同步测量;
- 7.STSEnableAWG();
- 8.STSEnableMeas();
- 9.STSAWGRun /STSAWGRunTriggerStop();
STSAWGCreateSineData (存储波形数据首地址,波形数据长度,周期数,波峰值,直流偏置,相位)
创建正弦波数据组
创建的 AWG 波形起始点和结束点均需包含在 AWG 波形数据中,因此数据长度 = AWG 波形采样数 + 1。
周期数:默认为 1
波峰值:默认为 0
直流偏置:默认为 0
相位:默认为 0,单位 deg。
double awg_pattern[1000]=(0.0); STSAWGCreateSineData(&awg_pattern[0],100,1,5,0,180);//创建正弦波,周期数100,波峰1V,直流偏置5V,相位180°,从数组awg_pattern的第1项开始保存。
STSAWGCreateTriangleData (存储波形数据首地址,波形数据长度,周期数,波峰值,直流偏置,相位)
创建三角波数据组
STSAWGCreateSquareData (存储波形数据首地址,波形数据长度,周期数,波峰值,直流偏置,占空比)
创建方波数据组
占空比:默认为 50,单位 %
STSAWGCreateRampData (存储波形数据首地址,波形数据长度,周期数,起始值,结束值)
创建斜波数据组
起始值、结束值默认为 0
STSEnableAWG (需要使能的 VI 源)
使能同步 AWG
STSEnableMeas (需要使能的 VI 源)
使能同步测量
需先设置 AwgLoader () 和 AwgSelect () 函数
VI 源只能提阿尼额 FPVI10、FOVI100 对应源的名称,最多可以填 32 路源
STSAWGRun (延迟时间)
AWG 同步启动,运行 AWG 扫描和测量
运行时间取扫描和测量的较长时间
延迟时间:AWG 扫描运行后延迟一段时间进行测量,默认为空。建议不填写此参数。
STSAWGRunTriggerStop (触发 VI 源名称,触发后停止的 VI 源)
AWG 同步启动,触发后停止
触发 VI 源应与 SetMeasVTrig/SetMeasITrig 的源一致。
停止源最多可填写 16 个,如触发源也需要停止则要再写一次。
fovi1.SetMeasVTrig(2,TRIG FALLING); fovi0.MeasureVI(500,20,MEAS AWG); fovi1.MeasureVI(500,20,MEAS AWG); STSEnableAWG(&fovio);//fovi0同步使能AWG STSEnableMeas(&fovi0,&fovi1);// fovi0 和 fovi1 同步使能测量 STSAWGRunTriggerStop(&fovi1,&fovi1,&fovi0);//当fovi1触发时,fovi0与fovi1同时停止
FXVI
FXVI (通道号,命名)
定义一路 FXVI 通道并绑定逻辑通道
FOVI VCC(0,”VCC”); //定义逻辑通道0位VCC STSSetModuleToSite(MD_F0V1,SITE_1,0,1,2,3,4,5,6,7,-1)://分配0-7通道给site1
Set (工作模式,值,量程,继电器状态,耗时)
设置 FXVI 的工作状态
模式:FI/FV
继电器状态:
RELAY_ON:接通输出继电器
RELAY_OFF:断开输出继电器
RELAY_HOLD:输出继电器保持上一个状态
耗时:达到设置值所用时间,默认 0.1ms,分辨率 0.1ms,具有 capload 功能
fovi0.Set(FV,16.5,FOVI_50V,FOVI_100MA,RELAY_ON)//施加16.5V电压,量程50V100mA,接通输出继电器
SetSync()
多工位同步分别设置工作状态
SetClamp()
设置钳位为满量程的百分比,范围为 10%~102%
MeasureVI (采样次数,测量间隔,测量模式)
设置测量参数
采样次数:范围 1~2048
测量模式:
MEAS_NORMA:默认
MEAS_AWG:AWG 测量模式
GPFXVI()
编组并指定通道,每个 group 内的 FXVI 通道配置 2~128 路,在 Group 进行 Set()前,必须设置所有通道的工作模式,量程和继电器状态一致。编组可以节约测试时间,降低机器成本
GetMeasResult (测量工位,读回数据类型,数据处理方式)
获取 measureVI 的测量结果
读回数据类型:
MVRET:电压测量数据
MIRET:电流测量数据
数据处理方式:
AVERAGE RESULT: 数据平均值(默认)
MAX RESULT: 数据最大值
MIN RESULT: 数据最小值
TRIG RESULT:AWG 同步测量时,跳变触发的位置。即 MeasureVl 中第几个采样点发生跳变.
INT 型变量:每一个采样数据。当此处为 INT 型变量为 N 时,返回第 N+1 个点的测量值
fovi0.MeasureVI(20,10)://采样次数:20间隔时间:10us,默认模式 for(i=0;i<SITENUM;i++){ adresult1[i]=fovi0.GetMeasResult(i,MIRET);//获取测量电流的平均值 adresult2[i]=fovi0.GetMeasResult(i,MIRET,15);//获取第16个点的测量电流值 }
AwgLoader (波形名称,模式,量程,存储数据数组,数据大小)
导入 AWG 波形
同一路通道可导入多个 AWG 波形,但命名必须不同,对相同名称的只写入第一次调用 AwgLoader 函数中设置的波形.
启动 AwgLoader 函数会把波形写入 RAM 中,因此执行该语句会占用测试时间。一次性写入 2048 个点的数组需要 12ms 左右的时间,写入时间与写入点数成正比。波形总长度必须小于等于 2048,超出 2048 以后的数据不会写入 RAM
STSAWGCreateRampData (&awg_pattern[o],sam,1,16.5,21.5);//定义波形,电压由16.5V到21.5V,采样数50,波形储存在awg_pattern数组中 fovi0.AwgLoader("Vst ",FV.FOVI 50V.FOVI 100MA,awg_patter,sam);// 载入awg_pattern波形,命名为Vst,施加电压,量程50V100mA,
AwgSelect (波形名称,起始点,结束点,结束后的跳转点,间隔时间)
选择运行的 AWG 波形并设置运行参数
AWGSelect 前需设置 Set 语句,set 的量程档位必须与 AwgLoader 中一致
AWGSelect 只设置波形参数,并不输出波形。输出需使用 STSAWGRun
SetMeasVTrig/ SetMeasITrig (触发值,触发方式)
设置电压 / 电流触发
触发方式:
TRIG_FALLING 下降沿触发 (默认)
TRIG_RISING 上升沿触发
int T_Point=0; double Trig=200e-6;//触发电流 double Trig Point[4]=(0); double result[4]=(0); int sam=51;//AWG波形图案数据长度 int interval 200;//AWG采样间隔 单位us double awg_pattern[100]=(0.0); STSAWGCreateRampData(&awg_pattern[o],sam,1,16.5,21.5);//定义波形数据,范围 16.5V到 21.5V fovi0.AwgLoader("Vst ",FV,FOVI 50V,FOVI_100MA,awg_pattern,sam);//载入 50 个采样点的awg 波形到RAM,将AWG波形命名为Vst. fovi0.Set(FV,16.5,FOVI 50V,FOVI 100MA,RELAY ON);//设置电压电流量程,必须与导入Vst的AwgLoader()函数中的一致 fovi0.AwgSelect("Vst",0.sam-1,sam-1,interval);//选择Vst波形,开始点0,结束点:sam-1,结束后跳转到:sam-1,采样间隔时间:200us. fovi0.SetMeasITrig(Trig,TRIG_RISING);//设置触发电流 200uA,上升沿触发 fovi0.Measure VI(sam,interval,MEAS_AWG);//采样次数:50,采样间隔时间:200us,AWG模式 STSEnableAWG(&fovio);//同步AWG波形到fovi0. STSEnableMeas(&fovi0);//同步测量fovi0. STSAWGRun();//开始AWG同步 for(i=0:i<SITENUM;i++){ Trig Point[i]=fovio.GetMeasResult(i,MIRET,TRIG RESULT);//获取fovi0的触发位置 T_Point=Trig_Point[i]; Vst->SetTestResult(i,0,awg_pattern[T_Point]); }
AwgRun (波形名称,起始点,结束点,结束后的跳转点,间隔时间,模式)
启动某一路 AWG
模式:
AWG_SINGLE 运行一次
AWG_LOOP 循环运行,使用 AwgStop () 停止
AwgStop()
停止某一路 AWG 循环运行
Pulse (脉冲值,脉冲时间 us,启动测量时间 us,采样次数,采样间隔时间 us)
输出脉冲信号
采样次数:范围 1~2048,默认 10
CBIT
CBIT128
SetOn (设置的继电器位,-1)
设置继电器闭合(低电平),未指定的继电器断开(高电平)
继电器位可以填写多个,以 - 1 结束
CBIT128 cbit128; BYTE K1=0: BYTE K2=1: BYTE K3=2: BYTE K4=3; cbit128.SetOn(K1.K2.-1);//仅K1、K2闭合,K3、K4断开 cbit128.SetOn(K1,K2,K3,K4,-1);//K1、K2、K3、K4均闭合 cbit128.SetOn(-1)://K1、K2、K3、K4均断开
SetCBITOn()
设置单个继电器闭合(低电平),其他继电器保持原状
SetCBITOff()
设置单个继电器断开(高电平),其他继电器保持原状
cbit128.SetOn(K1);// K1闭合 cbit128.SetOn(K2);//K2闭合,此时K1K2均为闭合状态 cbit128.SetOff(K1)://K1断开,此时K1断开K2闭合
CBIT128 无多工位绑定,可通过如下方法实现并行操作
测试条件:四工位测试,每个工位使用 2 个继电器 K1、K2:
SITE1:K1=CBit0,K2=CBit1: SITE2:K1=CBit8,K2=CBit9; SITE3:K1=CBit16,K2=CBit17; SITE4:K1=CBit23,K2=CBit24; CBIT128 cbit128; //方法1: BYTE K1_S1=0;//SITE1 RELAY BYTE K2 S1=1://SITE1 RELAY BYTE K1 S2=8://SITE2 RELAY BYTE K2_S2=9;//SITE2 RELAY BYTE K1_S3=16;//SITE3 RELAY BYTE K2_S3=17://SITE3 RELAY BYTE K1_S4 =23;//SITE4 RELAY BYTE K2_S4 =24;//SITE4 RELAY cbit128SetOn(K1_s1,K1_s2.K1_S3,K1_S4,K2_s1,K2_S2,K2_S3,K2_S4,-1); ∥同时吸合四个STE的K1和K2继电器 //方法2: #define K10,8,16,23; #define K2 1,9,17,24; cbit128.SetOn(K1,K2,-1);//同时吸合四个STE的K1和K2继电器
DIO
DIO (板编号)
定义一块 DIO 板
DIO dio0(0);
Init()
初始化 DIO 模块,使所有继电器断开,所有通道处于高阻态。不影响图形存储和 RAM
dio.Init()
Connect (通道号)
Disconnect (通道号)
接通 / 断开指定通道号的继电器,以 - 1 结尾
如通道号留空则操作数字部分所有 8 通道输出继电器
dio.Connect();//接通数字部分所有8通道输出继电器 dio0.Disonnect(0,1,2,-1)//断开dio0板0/1/2通道的输出继电器
LoadPatternWithLabel()
加载带标签的波形
使用图形码并行描述 8 通道波形,每行代码描述在同一时间 8 个通道的输出波形,顺序为从左到右 7~0。
图形码包括:0、1、L、H、Z、X。含义如下
“0”— 驱动低
“1”— 驱动高
“L” 一期望低
“H” 一期望高
“Z” 一期望为高阻态(需要外部上下拉至 VOH 和 VOL 之间的一个电平)
“X” 一保持
标签可以理解为定位点,第一行和最后一行必须带标签,中间行可以按需求添加。标签名不可重复。
ReLoadPatternWithLabel()
按标签重新加载波形
1) 重新加载的第一个 pattern 必须加标签。
2) 从重新加载的标签起,会逐行替换已加载的 pattern 数据,直到替换内容结束或遇到下一个标签而停止替换 (Load 中的标签或是 ReLoad 中的标签都会停止替换)。
3) 若在运行完新替换的 pattern. 后还希望运行以前的 pattern, 则需要用 ReLoadPatternWithLabel
函数再将 pattern reload 回去。
LoadPatternFromFileWithLabel()
从文件加载波形
SetVIH (通道号,电压值)
SetVIL (通道号,电压值)
SetVOH (通道号,电压值)
SetVOL (通道号,电压值)
设置通道的驱动高低电平和比较高低电平的值
通道号可留空,则表示同时设置 8 个通道
电压值范围 - 2~7V
SetClockFreq (频率值)
SetClockPeriod (周期长度)
设置图形运行频率
频率取值范围 1~5E6 单位 Hz
周期取值范围 2E-7~1 单位 s
SetDelay (通道号,驱动前沿发生时刻值,驱动后沿发生时刻值,比较时刻值)
?比较
比较时刻值默认为 20nS
SetWaveFormat (通道号,格式代码)
设置通道驱动格式
格式代码:
NRZ—— 不归 0(非起效时间保持状态)
RTO—— 归 1(非起效时间置 1)
RTZ—— 归 0(非起效时间置 0)
SBC—— 反码环绕(非起效时间与 PEL 相反)
PEL 指用户输入 pattern 向量,如图 T1 为 PEL 作用时刻,T2 为波形起效时刻。
SetOnTheFlyWithLabel (波形套 ID,开始标签,结束标签)
设置两标签间的波形套
波形套 ID:DIO::OnTheFly1~15
如不设置,则波形套按照 ClockFreq-ClockPeriod-Delay-WaveFormat 函数的设置运行波形
SetClockFreqWithLabel (波形套 ID,频率值)
设置波形套的频率
频率 = 1 / 周期 周期指单个信号持续时间
SetDelayWithLabel (波形套 ID,通道号,前沿时刻值,后沿时刻值,比较时刻值)
设置波形套的时间参数
SetWaveFormatWithLabel (波形套 ID,通道号,格式代码)
设置波形套的驱动格式
RunPatternWithLabel (开始标签, 结束标签)
运行指定标签之间的波形。
1) 图形 pattern 总数 = 结束标签 - 起始标签 + 1. 如 10 到 20 总共有 11 个 pattern
2) 起始标签和结束标签之间的图形 pattern 总数不能超过 65536。
3) RunPatternWithLabeli 语句后需加入适当延时,该延时应大于图形周期 ×pattern 数。即 Tdelay>T*(endLabel-beginLabel+1)
4) 受 DIO 板硬件限制,对 RunPatternWithLabel () 执行错误检查 GetChannelFailWithLabel ()、GetFailCount ()、GetSerialPatternResultWithLabel () 时,需要在末尾多加两行 pattern
GetChannelFailWithLabel (通道号)
获取指定通道上一次 RunPatternWithLabel 后是否有错误行
GetFailCount()
获取 8 个通道上一次 Run 后的总错误行数
GetSerialPatternResultWithLabel (通道号,起始标签,结束标签,方向)
获取指定通道的向量串行输出的结果
方向:MSB 输出从高位(左侧位)开始;LSB 输出从低位(右侧位)开始
dio.LoadPatternWithLabel("L0000000","a1"); dio.LoadPatternWithLabel("H1111111"); dio.LoadPatternWithLabel("L0000000","a2"); dio.LoadPatternWithLabel("XXXXXXXX"); dio.LoadPatternWithLabel("XXXXXXXX","a3"); dio.RunPatternWithLabel("a1","a3")://运行a1到a3 delay_ms(2);//延迟时间取决于pattern运行时间 BOOL flag=TRUE: int failNum=0; flag=dio.GetChannelFailWithLabel(7);//获取CH7从a1到a2的错误信息,如果有错误则flag=1,否则flag=0 if(flag == 1){ failNum=dio.GetFailCount();//获取8个通道a1到a2的错误行数 } DWORD pattern=0; pattern=dio. GetSerialPatternResultWithLabel(7,”a1”,”a2”,MSB)//获取CH7从a1到a2的结果,如果结果是LHL则返回值为二进制111,即十进制7.
LoopSetWithLabel (起始标签,结束标签,循环次数)
Pattern 循环输出
结束标签可与起始标签相同,此时循环次数范围为 2~4194303
结束标签与起始标签不同时,必须位于起始标签后,此时循环次数范围为 1~4194303,从第二次循环起只运行从起始标签 + 1 到结束标签的 pattern。
如要无限循环则循环次数 =-1,每次循环都运行起始标签到结束标签的 pattern,需使用 StopPatern () 结束循环
循环输出不允许标签交叉和嵌套
StopPatern()
结束循环
dio.Connect(); delay_ms(1); dio.LoopSetWithLabel("a","b",-1);//a到b无限循环 dio.RunPatternWithLabel("a","b")://运行a到b的波形pattern delay_ms(1);//循环运行时间 dio.StopPattern()://停止循环
SetExternalTriggerEnableWithLabel (等待触发起始标签,等待触发结束标签,触发结果)
设置外部信号触发
触发结果:true 使能;false 无效
触发信号脉冲宽度不得小于 130nS
一般会设置起始标签与结束标签相同,则运行到该行结束后停止运行,等待外部触发信号到来后继续运行后续 pattern。
如果结束标签在起始标签后,则每次外部信号只会触发运行 1 行 pattern,直到运行到结束标签。如起始到结束标签有 5 行,则运行到起始标签行停止,前 4 次触发信号均运行 1 行,第 5 次触发运行剩余 pattern
SetExternalTriggerModeWithLabel (触发方式)
设置外部信号触发模式
触发方式:
DIO::RisingEdge 上升沿触发
DIO::FallingEdge 下降沿触发
dio.LoadPatternWithLabel("L0000000",a1): dio.LoadPatternWithLabel("H1111111"): dio.LoadPatternWithLabel("L1111111","a2"): dio.LoadPatternWithLabel("L0000000"); dio.LoadPatternWithLabel("H1111111"): dio.LoadPatternWithLabel("L0000000","a3"): dio.SetExternalTriggerEnabledWithLabel("a2","a2".true)://设置a2等待触发 dio.SetExternalTriggerModeWithLabel(DIO::RisingEdge)://设置上升沿触发 dio.RunPatternWithLabel("a1","a3");//运行a1到a3的pattern delay_ms(5);//设置运行pattern的延迟,运行到a2结束时会停止 EN.Set(FV,5,FOVI_10V,FOVI_10MA,RELAY_ON)://使能信号 //触发信号使能后a2后续的pattern将继续运行
SetSynRunPatternWithLabel (起始标签,结束标签)
设置 DIO 板同步运行
STSDIOStartSynRunPatternWithLabel()
启动多块 DIO 同步运行 pattern
两个函数需配合使用,每次运行 DIO 同步前都需要设置一次同步标志
I2CSet()
常见问题
Q:FOVI 和 FPVI 的区别?
A: 两块板卡主要区别如下:
1) FOVI 单板八通道,分为两组,每四个通道为一组,分组浮动;FPVI 单板双通道,每通
道独立浮动;
2) FOVI 最大采样次数是 2048,最小采样间隔是 10us;FPVI 最大采样次数是 4096,最小采样间隔是 2us;
3) FOVI 最大电压量程是 50V (最大输出是 40V), 最大电流档位是 1A, 脉冲档位;FPVI 最大电压量程是 100V (硬件版本 3.1 及以上),最大电流档位是 10A, 也是脉冲档位;
4) FOVI 在 1A 脉冲工作模式下是依靠 150mA 恒流源进行充电;FPVI 在 10A 脉冲工作模式下是依靠 400mA (SM8122Rev1.20 及以下版本) 500mA (SM8122Rev3.10 版本) 恒流源进行充电;
Q: 浮动源 Capload 功能有什么作用?
A:浮动源 Capload 从上一个状态缓慢上下电至本次设定状态,可避免过冲造成被测器件损坏。浮动源积分时间与电压电流档位无关,与板卡硬件及驱动逻辑有关。FOVI 和 FPVI 有两个硬件积分时间档位:0.1ms 和 0.2ms, 最小设置到 0.1ms, 超过 0.2ms, 会启动 Capload 功能。
Q:GROUP 函数支持哪些板卡与函数,有什么注意事项?
A:GROUP 目前仅支持 FOVI 与 FPVI 板卡,支持调用的函数包括 Set、SetClamp、MeasureVI,执行 GROUP 的 Set () 函数之前,需要将 GROUP 内板卡所有通道的工作模式、电压 / 电流量程和输出继电器的状态设置一致。