|
楼主 |
发表于 2011-1-7 22:28:28
|
显示全部楼层
管子类型及管脚识别功能则直接利用单片机的AD端口
主要是利用单片机端口可以设置成推勉输出或者高阻3态,高阻状态时,所接的电阻都不起作用。
例如测量上述NPN管,
设置Px1输出1,px2,px3,px为高阻,Vx1 Vx2为两个AD通道,目的测量R13上的电压和集电极电流。
设置Py3输出1,py1,py2,py为高阻,他们都不会影响py3的输出,因为R12是680K,电流很小,因此可以认为py3输出电压为5V,而vy2测量基极电压,运算也可以得到基极电流,也就可以运算得到hfe
设置Pz输出0,pz1 pz2 pz3为高阻,Vz2测量发射极电压,运算后就可以得到Vbe电压
系统按顺序设置px1 py1 pz1分别为0 1.而Px px2 px3 Py py2 py3 Pz pz2 pz3输出高阻,并测量R13 R10 R16上电压,如果他们上随便有一个电压超过20mV,就可以认为导通,设置状态位为1,因此得到如下真值表
判断FET管的程序如下:
for(i=0;i<12;i++)
SetPortZ(i); //设置所有输出为高阻
// 按上面这6种顺序分别设置X Y Z通道电平 ,
//测量X Y Z这3个通道电阻上是否存在电压,
//只要 导通 则记录其状态,
state=0;
for(i=0,state2=0x20;i<6;i++)
{j=FETTABLE;
SetPort(PZ1,j&0x3);
j>>=2;
SetPort(PY1,j&0x3);
j>>=2;
SetPort(PX1,j&0x3);
GetVoltage(1); //所有ADC通道都进行一次采样
v1=abs(Voltage[VX1]-Voltage[VX2]); //这是X通道电阻上压降
v2=abs(Voltage[VY1]-Voltage[VY2]); //测量Y通道电阻上压降
v3=abs(Voltage[VZ1]-Voltage[VZ2]); //测量Z通道电阻上压降
if (v1+v2+v3>7) //只要任意一个通道上电阻有压降说明导通了。
{state|=state2;} //设置state相应bit上的标志
state2>>=1;
}
然后根据state对照上面真值表可以得出X Y Z脚接的是GDS中那一只脚了。
对于JFET管,它具有DS对称互换性,因此不必进行DS判断。
switch (state)
{case 0x13: // NMOS X->G Y->S Z->D
state2=5;
Pin=16;
TestMOS(state2,PinX,PinZ,PinY,&Vth,&Vgs,&Id);
break;
case 0x23: // NMOS x->G Y->D Z->S
state2=5;
Pin=15;
TestMOS(state2,PinX,PinY,PinZ,&Vth,&Vgs,&Id);
break;
case 0x0d: //NMOS X->S Y->G Z->D
state2=5;
。。。。
而BJT管和二极管、电阻则用2端测量法来判断,即将其中一个端子设成高阻状态,以方便判断PN结极性。其真值表如下:
判断程序如下:
code unsigned char DIODETABLE[6]={0x12,0x6,0x24,0x21,0x18,0x09};
// 对应 X Y Z为 10Z 01Z Z10 Z01 1Z0 0Z1
code unsigned char DIODEVOLTAGETABLE[6]={VY2,VX2,VZ2,VY2,VZ2,VX2}; //该状态下需要读取的AD通道
state=0;
for(i=0;i<12;i++)
SetPortZ(i); //设置所有输出为高阻
//下面设置 X Y Z分别输出 0 1 Z(共6种组合),得到被测管状态,根据状态判断被测管是啥类型 引脚如何
for(i=0,state2=0x20;i<6;i++)
{vH=DIODETABLE;
SetPort(PZ1,vH&0x3);
vH>>=2;
SetPort(PY1,vH&0x3);
vH>>=2;
SetPort(PX1,vH&0x3);
GetADC(DIODEVOLTAGETABLE);
vH=ADC_DATA;
if (vH>0)
state |=state2; // if vH>0 说明Vh已经大于20mV了,即已经导通了。
else
{
SetPortZ(PX1); //但如果接的是很大阻值的电阻,那么470上的电压很低,也会少于20mV,以为没导通,所以撤换成R=120K再测量。
SetPortZ(PY1);
SetPortZ(PZ1);
vH=DIODETABLE;
SetPort(PZ2,vH&0x3); //切换到 120K
vH>>=2;
SetPort(PY2,vH&0x3);
vH>>=2;
SetPort(PX2,vH&0x3);
GetADC(DIODEVOLTAGETABLE);
vH=ADC_DATA;
if (vH>3)
state |=state2; // if vH>3 mean vH more then 3*4*5mV=60mV
SetPortZ(PX2);
SetPortZ(PY2);
SetPortZ(PZ2);
}
state2>>=1;
}
switch (state)
{case 0x22: // NPN X=B NPN管 基极是X
state2=1;
if (TestBJT(1,PinX,PinY,PinZ,&VBE,&HFE,&IC)) //尝试BCE 如果管子可以测出参数,则TestBJT返回1, 并测出参数写在VBE HFE IC返回参数中
{Pin=1; }
else if (TestBJT(1,PinX,PinZ,PinY,&VBE,&HFE,&IC)) //再尝试 B E C排列并测出参数,
{Pin=2; } //BEC
else
{Pin=0; }
break;
case 0x18: // NPN B=Y
state2=1;
if (TestBJT(1,PinY,PinX,PinZ,&VBE,&HFE,&IC)) //CBE
{Pin=4; }
else if (TestBJT(1,PinY,PinZ,PinX,&VBE,&HFE,&IC)) //EBC
{Pin=5; }
else
{Pin=3; }
break;
case 0x5: // NPN B=Z
... |
|