Тестер диодов и биполярных транзисторов

Большинство современных тестеров (мультиметров) имеют встроенные функции тестирования диодов и иногда транзисторов. Но если ваш тестер не имеет этих функций, то вы можете собрать тестер диодов и транзисторов своими руками. Ниже представлен проект тестера на микроконтроллере PIC16F688.

Логика тестирования диодов очень проста. Диод — это PN-переход, который как известно, проводит ток только в одном направлении. Следовательно, рабочий диод будет проводить ток в одном направлении. Если диод проводит ток в обеих направлениях, то значит диод нерабочий — пробитый. Если диод ни в одном из направлений не проводит, то диод также не рабочий. Схемная реализация данной логики показана ниже.

Тест диода

Данную логику легко можно адаптировать для теста биполярных транзисторов, который содержит два PN-перехода: один между базой и эмиттером (БЭ-переход) и второй между базой и коллектором (БК-переход). Если оба перехода проводят ток только в одном направлении, транзистор — рабочий, иначе — не рабочий. Также мы можем идентифицировать тип транзистора PNP или NPN, определив направление проводимости тока. Для тестирования транзисторов, в микроконтроллере используется 3 входа/выхода

Тест транзистора

Последовательность для тестирования транзистора:
1. Включить выход (установить в единицу) D2 и считать D1 и D3. Если на D1 логическая единица, переход БЭ проводит ток, иначе — нет. Если D3 в 1, то БК проводит ток, иначе — нет.
2. Установить выход D1 в 1 и считать D2. Если D2 в 1, значит ЭБ проводят ток, иначе — нет.
3. Установить выход D3 в 1 и считать D2. Если D2 в 1, значит КБ проводят ток, иначе — нет.

Далее, если БЭ и БК проводят ток, то транзистор NPN-типа и рабочий. Если же, ЭБ и КБ проводят ток, то транзистор PNP типа и также рабочий. Во всех остальных случаях (к примеру ЭБ и БЭ проводят ток или оба перехода БК и КБ не проводят и т.п.) транзистор находится в не рабочем состоянии.

Принципиальаня схема тестера диодов и транзисторов и описание

Схема тестера диода и транзистора

Схема тестера очень проста. В приборе предусмотрено 2 кнопки управления: Select (выбор) и Detail (подробнее). По нажатию кнопки Select происходит выбор типа теста: тест диода или транзистора. Кнопка Detail работает только при режиме теста транзистора, на экране LCD показывается типа транзистора (NPN или PNP) и статусы проводимости переходов транзистора.
Три ножки тестируемого транзистора (эмиттер, коллектор и база) подсоединяются к «земле» через резистор 1 кОм. Для тестирования используются выводы RA0, RA1, и RA2 микроконтроллера PIC16F688. Для тестирования диода используется только два вывода: Э и К (на схеме обозначены D1 и D2).

Тестер диодов и транзисторов на макетной плате

Программа

Программное обеспечения для данного проекта написано с использованием компилятора MikroC. Во время тестирования и программирования будьте внимательны и следите за установками входов/выходов МК (RA0, RA1 и RA2) т.к. они часто меняются во время работы. Перед тем, как установить какой-либо выход в 1, убедитесь, что два других входа/выхода МК определены как входа. В противном случае возможны конфликты входов/выходов МК.

 /* Project: Diode and Transistor Tester Internal Oscillator @ 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF Copyright @ Rajendra Bhatt November 9, 2010 */ // LCD module connections sbit LCD_RS at RC4_bit; sbit LCD_EN at RC5_bit; sbit LCD_D4 at RC0_bit; sbit LCD_D5 at RC1_bit; sbit LCD_D6 at RC2_bit; sbit LCD_D7 at RC3_bit; sbit LCD_RS_Direction at TRISC4_bit; sbit LCD_EN_Direction at TRISC5_bit; sbit LCD_D4_Direction at TRISC0_bit; sbit LCD_D5_Direction at TRISC1_bit; sbit LCD_D6_Direction at TRISC2_bit; sbit LCD_D7_Direction at TRISC3_bit; // End LCD module connections sbit TestPin1 at RA0_bit; sbit TestPin2 at RA1_bit; sbit TestPin3 at RA2_bit; sbit Detail at RA4_bit; sbit SelectButton at RA5_bit; // Define Messages char message1[] = "Diode Tester"; char message2[] = "BJT Tester"; char message3[] = "Result:"; char message4[] = "Short"; char message5[] = "Open "; char message6[] = "Good "; char message7[] = "BJT is"; 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; //All I/O pins are configured as digital CMCON0 = 0?07 ; // Disbale comparators PORTC = 0; PORTA = 0; TRISC = 0b00000000; // PORTC All Outputs TRISA = 0b00111000; // PORTA All Outputs, Except RA3 (I/P only) Lcd_Init();                      // Initialize LCD Lcd_Cmd(_LCD_CLEAR);             // CLEAR display Lcd_Cmd(_LCD_CURSOR_OFF);        // Cursor off Lcd_Out(1,2,message1);           // Write message1 in 1st row select = 0; test1 = 0; test2 = 0; update_select = 1; detail_select = 0; do {  if(!SelectButton){   debounce_delay();   update_select = 1;   switch (select) {    case 0 : select=1;    break;    case 1 : select=0;    break;   } //case end  }   if(select == 0){   // Diode Tester   if(update_select){    Lcd_Cmd(_LCD_CLEAR);    Lcd_Out(1,2,message1);    Lcd_Out(2,2,message3);    update_select=0;   }   TRISA = 0b00110100; // RA0 O/P, RA2 I/P   TestPin1 = 1;   test1 = TestPin3 ; // Read I/P at RA2   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);   }   }  // End if(select == 0)   if(select && !detail_select){     // Transistor Tester   if(update_select){    Lcd_Cmd(_LCD_CLEAR);    Lcd_Out(1,2,message2);    update_select = 0;   }   // Test for BE and BC Junctions of NPN   TRISA = 0b00110101; // RA0, RA2 I/P, RA1 O/P   TestPin2 = 1;   BE_Junc = TestPin1 ; // Read I/P at RA0   BC_Junc = TestPin3;   // Read I/P at RA2   TestPin2 = 0;    // Test for EB and CB Junctions of PNP   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 = "Good ";   }   else    if(!BE_Junc && !BC_Junc && EB_Junc && CB_Junc){    Lcd_Out(2,2,message3);    Lcd_Out(2,10,message6);    type = "PNP";    BE_info = "Good ";    BC_info = "Good ";   }   else {    Lcd_Out(2,2,message3);    Lcd_Out(2,10,"Bad ");    type = "Bad";   }  }  if(select && !Detail){   debounce_delay();   switch (detail_select) {    case 0 : detail_select=1;    break;    case 1 : detail_select=0;     break;    } //case end   update_select = 1;  }   if(detail_select && update_select){    // Test for BE Junction open   if(!BE_Junc && !EB_Junc){    BE_info = "Open ";   }   // Test for BC Junction open   if(!BC_Junc && !CB_Junc){    BC_info = "Open ";   }   // Test for BE Junction short   if(BE_Junc && EB_Junc){    BE_info = "Short";   }    // Test for BC Junction short   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;  }       // End if (detail_select)  } while(1); } 

Тестер в работе