1)初始化时,建议采用“AstInitAllDVI()”语句,该语句可以同时将所有DVI通道初始化。PVI也类似。 2)PVI切换量程或工作模式时,需要较长的时间。例如,PVI的100mA以下量程和1A、10A量程互切时,一次需要7~10ms;1A和10A量程互切时,一次需要15ms;一次connect/disconnect,需要7~10ms。所以,使用同一电流量程的参数尽量放在一起,避免不必要的量程切换。 3)当需要对一个外接电容的管脚测试小电流(用4uA档)时,建议先用大电流档(例如4mA)给电容迅速充电,再切换到小电流档进行测量,可以节省时间。 4)多工位扫描参数,采用设置标志位法进行并行扫描,可大大节省时间。 【例】 假设DVI1连接扫描输入的管脚,DVI0连接判断输出的管脚: float vx = 0; //扫描变量 float adresult[4], result[4]; BYTE k[4] = {0,0,0,0}; //工位标志
dvi0.Connect(); dvi1.Connect(); delay_ms(1);
dvi1.SetModeFVMI(DVI_VRNG_5V, 3, DVI_IRNG_40MA, 40e-3, -40e-3); //先让器件进入已知的稳定状态 dvi1.Enable();
dvi0.SetModeFIMV(DVI_IRNG_400UA, 0, DVI_VRNG_20V, 20, 0); dvi0.Enable();
delay_us(200);
double vstep1=0.1; //设置扫描步进
vx=2.0; //设置扫描的起始电压 for (; vx>0; vx-=(float)vstep1) { dvi1.SetModeFVMI(DVI_VRNG_5V, vx, DVI_IRNG_40MA, 40e-3, -40e-3); dvi1.Enable(); delay_us(200); dvi0.Measure(adresult, SAMPLE_TIMES); for ( int i=0; i<4; i++) { if ((k[i] == 0) && (adresult[i] < 5)) //判断扫描的结果及工位标志 { result[i] = vx; k[i]=1; //将已经符合条件的工位标志为1,防止下次扫描后改变结果 } } if ((k[0] == 1) && (k[1] == 1) && (k[2] == 1) && (k[3] == 1)) //判断四个工位是否都已经扫描完毕 break; }
for ( int i=0; i<4; i++) { vin.SetTestResult(i, 0, result[i]); }
dvi0.Disable(); dvi1.Disable(); dvi0.Disconnect; dvi1.Disconnect();
【注意】多工位并行扫描不仅可以用在逐步扫描算法,也可以用在二分法扫描算法。与多工位串行扫描相比,并行扫描的时间是多工位中扫描时间时间最长的那个工位的扫描时间,因此时间将得到大大的缩短。
5) 单工位扫描参数,推荐使用先粗后细或二分法。 【例】 假设DVI1连接扫描输入的管脚,DVI0连接判断输出的管脚: a) 先粗扫后细扫,可用于施密特器件,时间较长。 float vx = 0; //扫描变量 float adresult[4],result[4];
dvi0.Connect(); dvi1.Connect(); delay_ms(1);
dvi1.SetModeFVMI(DVI_VRNG_5V, 3, DVI_IRNG_40MA, 40e-3, -40e-3); //先让器件进入已知的稳定状态 dvi1.Enable();
dvi0.SetModeFIMV(DVI_IRNG_400UA, 0, DVI_VRNG_20V, 20, 0); dvi0.Enable();
delay_us(200);
double vstep1=0.1; //设置粗扫步进
vx=2.0; //设置扫描的起始电压 for (; vx>0; vx-=(float)vstep1) { dvi1.SetModeFVMI(DVI_VRNG_5V, vx, DVI_IRNG_40MA, 40e-3, -40e-3); dvi1.Enable(); delay_us(200);
dvi0.Measure(adresult, SAMPLE_TIMES);
result[0]=vx;
if(adresult[0]<3) //判断扫描结果 break; }
vx=result[0]+vstep1; //将粗扫结果返回一个粗扫的步进作为细扫的起始电压 double vstep2=0.01; //设置细扫步进
for (; vx>0; vx-=(float)vstep2) { dvi1.SetModeFVMI(DVI_VRNG_5V, vx, DVI_IRNG_40MA, 40e-3, -40e-3); dvi1.Enable(); delay_us(200);
dvi0.Measure(adresult, SAMPLE_TIMES);
result[0]=vx;
if(adresult[0]<3) //判断结果 break; }
vin.SetTestResult(0, 0, result[0]);
dvi0.Disable(); dvi1.Disable(); dvi0.Disconnect; dvi1.Disconnect();
b) 二分法,适用于非施密特器件,时间短。 float vx = 0; //扫描变量 float adresult[4]; int i=0;
dvi0.Connect(); dvi1.Connect(); delay_ms(1);
dvi1.SetModeFVMI(DVI_VRNG_5V, 3, DVI_IRNG_40MA, 40e-3, -40e-3); //先让器件进入已知的稳定状态 dvi1.Enable();
dvi0.SetModeFIMV(DVI_IRNG_400UA, 0, DVI_VRNG_20V, 20, 0); dvi0.Enable();
delay_us(200);
double vstep1=1; //设置二分法的长度,其取值与起始值和目标值有关
vx=2.5; //设置扫描的起始值,保证目标值在[vx-vstep1,vx+vstep1] for (i=0;i<10;i++) //i的上限值决定了扫描的精度和扫描时间 { dvi1.SetModeFVMI(DVI_VRNG_5V, vx, DVI_IRNG_40MA, 40e-3, -40e-3); dvi1.Enable(); delay_us(200);
dvi0.Measure(adresult, SAMPLE_TIMES);
if(adresult[0]>3) vx=vx-vstep1;
else if(adresult[0]<3) vx=vx+vstep1; vstep1=vstep1/2; }
vin.SetTestResult(0, 0, vx);
dvi0.Disable(); dvi1.Disable(); dvi0.Disconnect; dvi1.Disconnect(); |