电子说
简介
如今,大多数数字万用表都具有用于测试二极管(有时是晶体管)的内置功能。该项目的目的是演示一种使用微控制器为二极管和双极结传输器(BJT)构建测试设备的简单方法。该测试算法基于一个简单的事实,即工作中的 PN结仅在一个方向上传导电流。此项目中使用了PIC16F688微控制器,该开关可切换二极管和晶体管PN结之间的偏置电压,并确定特定结是正常,开路还是短路。
理论
测试二极管的逻辑很简单。二极管是PN结,仅允许一个方向的电流传导。因此,好的二极管将仅在一个方向上传导电流。如果在两个方向上都工作,则表示二极管短路,而在两个方向上都工作时,则表示开路。该逻辑的电路实现如下所示。
通过意识到这一点,可以很容易地将此概念扩展为测试晶体管。晶体管由两个PN结组成:一个在基极和发射极之间(BE结),另一个在基极和集电极之间(BC结)。如果两个结仅在一个方向上传导,则晶体管正常,否则出现故障。我们还可以通过考虑电流传导的方向来确定晶体管的类型(PNP或NPN)。需要一个微控制器的三个I/O引脚来实现晶体管的测试算法。
晶体管的测试顺序如下。
将D2设置为高电平并读取D1和D3。如果D1为高电平,则BE结导通,否则不导通。如果D3为高电平,则BC结导通,否则不导通。
将D1设置为高电平并读取D2。如果D2为高电平,则EB结导通,否则为非。
将D3设置为高电平并读取D2。如果D2为高电平,则CB结导通,否则不导通。
现在,如果仅BE和BC结导通,则该晶体管为NPN型且工作正常。而且,如果仅EB和CB结导通,则该晶体管仍然正常,但晶体管类型为PNP。其他所有情况(例如EB和BE均导通,或BC和CB均不导通等)表明晶体管不佳。
电路图和说明
该项目的电路图非常简单。它具有两个用于输入的按钮开关,分别为选择和详细信息。按下“选择”按钮可以在二极管测试和晶体管测试之间进行选择,“详细信息”按钮仅在进行晶体管测试时才可用,并显示测试结果的详细信息,例如晶体管类型和结状态。测试晶体管的三个支路(E,B和C)通过1 K电阻接地,并且两个PN结将通过PIC16F688微控制器的RA0,RA1和RA2端口引脚进行测试。二极管的测试仅需要两个引脚,并且将使用E和C引脚。这就是为什么它们在电路图中具有备用标签D1和D2的原因。
电路在面包板上设置
软件
此项目的固件是使用MikroC编译器开发的。编程时,您必须非常小心三个测试引脚(RA0,RA1和RA2)的方向设置,因为它们在运行测试算法时会经常变化。在将任何测试引脚设置为高电平之前,必须确保将其他两个引脚定义为输入引脚,以免端口引脚之间出现任何电压冲突或短路。
/*
项目:二极管和晶体管测试仪
内部振荡器@ 4MHz,启用了MCLR,启用PWRT,关闭WDT
版权@ Rajendra Bhatt
2010年11月9日
*/
//LCD模块连接
sbit LCD_RS at RC4_bit;
位RC5_bit的LCD_EN;
位RC0_bit的LCD_D4;
位RC1_bit的LCD_D5;
sbit LCD_D6为RC2_bit;
sbit LCD_D7为RC3_bit;
sbit LCD_RS_Direction为TRISC4_bit;
sbit LCD_EN_Direction位于TRISC5_bit;
sbit LCD_D4_Direction位于TRISC0_bit;
sbit LCD_D5_Direction位于TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;
//结束LCD模块连接
sbit TestPin1 at RA0_bit;
sbit TestPin2 at RA1_bit;
sbit TestPin3 at RA2_bit;
sbit RA4_bit的详细信息;
sbit SelectButton在RA5_bit;
//定义消息
char message1 [] =“二极管测试仪”;
char message2 [] =“ BJT Tes ter”;
char message3 [] =“结果:”;
char message4 [] =“短”;
char message5 [] =“打开”;
char message6 [] =“良好”;
char message7 [] =“ BJT是”;
char * type =“ xxx”;
char * BE_Info =“ xxxxx”;
char * BC_Info =“ xxxxx”;
unsigned int select,test1,test2,update_select,detail_select;
unsigned int BE_Junc,BC_Junc,EB_Junc,CB_Junc;
void debounce_delay(void){
Delay_ms(200);
}
void main(){
ANSEL = 0b00000000;//所有I/O引脚都配置为数字
CMCON0 = 0x07;//散售比较器
PORTC = 0;
PORTA = 0;
TRISC = 0b00000000;//PORTC所有输出
TRISA = 0b00111000;//PORTA的所有输出,RA3除外(仅I/P)
Lcd_Init();//初始化LCD
Lcd_Cmd(_LCD_CLEAR);//清除显示
Lcd_Cmd(_LCD_CURSOR_OFF);//光标关闭
Lcd_Out(1,2,message1);//在第1行中写message1
select = 0;
test1 = 0;
test2 = 0;
update_select = 1;
detail_select = 0;
做{
if(!SelectButton){
debounce_delay() ;
update_select = 1;
开关(选择){
case 0:select = 1;
break;
case 1:select = 0;
break;
}//案例结束
}
if(select == 0){//二极管测试仪
if(update_select){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2,message1);
Lcd_Out(2,2,message3);
update_select = 0;
}
TRISA = 0b0 0110100;//RA0 O/P,RA2 I/P
TestPin1 = 1;
test1 = TestPin3;//读取RA2上的I/P
TestPin1 = 0;
TRISA = 0b00110001;//RA0 I/P,RA2 O/P
TestPin3 = 1;
test2 = TestPin1;
TestPin3 = 0;
if((test1 == 1)&&(test2 == 1)){
Lcd_Out(2,10,message4);
}
if((test1 == 1)&&(test2 == 0)){
Lcd_Out(2, 10,message6);
}
if((test1 == 0)&&(test2 == 1)) {
Lcd_Out(2,10,message6);
}
if((test1 == 0)&&(test2 == 0)){
Lcd_Out(2,10,message5);
}
}//结束if(select == 0)
if(select &&!detail_select){//晶体管测试仪
if(update_select){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2 ,message2);
update_select = 0;
}
//测试BE NPN
的BC和BC交界处TRISA = 0b00110101;//RA0,RA2 I/P,RA1 O/P
TestPin2 = 1;
BE_Junc = TestPin1;//读取RA0处的I/P
BC_Junc = TestPin3;//在RA2处读取I/P
TestPin2 = 0;
//测试PNP的EB和CB结点
TRISA = 0b00110110;//RA0 O/P,RA1/RA2 I/P
TestPin1 = 1;
EB_Junc = TestPin2;
TestPin1 = 0;
TRISA = 0b00110011;//RA0 O/P,RA1/RA2 I/P
TestPin3 = 1;
CB_Junc = TestPin2;
TestPin3 = 0;
if( BE_Junc && BC_Junc &&!EB_Junc &&!CB_Junc){
Lcd_Out(2,2,message3);
Lcd_Out( 2,10,message6);
type =“ NPN”;
BE_info =“ Good”;
BC_info =“好”;
}
else
if(!BE_Junc &&!BC_Junc && EB_Junc && CB_Junc){
Lcd_Out(2,2,message3);
Lcd_Out(2,10,message6);
type =“ PNP”;
BE_info =“良好”;
BC_info =“良好”;
}
其他{
Lcd_Out(2,2,message3);
Lcd_Out( 2,10,“ Bad”);
type =“ Bad”;
}
}
if(select &&!Detail){
debounce_delay();
开关(detail_select){
情况0:detail_select = 1;
break;
情况1:detail_select = 0;
break;
}//案例结束
update_select = 1;
}
if(detail_select && update_select){
//测试BE结是否打开
if(!BE_Junc &&!EB_Junc){
BE_info =“打开”;
}
//测试BC结是否打开
if(!BC_Junc &&!CB_Junc ){
BC_info =“打开“;
}
//测试BE Junction short
if(BE_Junc && EB_Junc){
BE_info =“ Short”;
}
//测试BC结短路
if(BC_Junc && CB_Junc){
BC_info =“ Short”;
}
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,“ Type:”);
Lcd_Out(1,7,type);
Lcd_Out(2,1,“ BE:”);
Lcd_Out(2,4,BE_info);
Lcd_Out(2,9,“ BC:”);
Lcd_Out(2,12,BC_info);
update_select = 0;
}////如果(detail_select)
}结束,则while(1);
}
下载源代码和十六进制文件
输出
下面是我在测试各种输入条件时为二极管和BJT测试仪拍摄的照片。
其余图片
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !