程序框架
全局函数
全局函数大部分以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内板卡所有通道的工作模式、电压/电流量程和输出继电器的状态设置一致。