5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
1

Повышение безопасности проверки транзисторов в транзисторном тестере на AVR

26.01.2020, 20:17. Показов 494. Ответов 19
Метки нет (Все метки)

Как доработать прошивку и уменьшить ток базы при опросе в транзисторном тестере до 0,1...0,5 мА (хотя бы не более 1 )в транзисторном тестере (схема из интернета ,с драйв2 и других сайтов )? Нужно ли увеличить сопротивление резисторов 680 Ом до 1...5,1 кОм и переделать прошивку? С мощными транзисторами и диодами такой ток нормален, а вот с bfr93, 2sc9014, кт312 , кт368 такие резисторы в момент замыкания других выводов программно на корпус маловаты.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Повышение безопасности проверки транзисторов в транзисторном тестере на AVR   Повышение безопасности проверки транзисторов в транзисторном тестере на AVR   Повышение безопасности проверки транзисторов в транзисторном тестере на AVR  

Вложения
Тип файла: zip Tester.zip (13.6 Кб, 2 просмотров)
Тип файла: zip Тестер полупроводников.zip (175.2 Кб, 2 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2020, 20:17
Ответы с готовыми решениями:

Повышение безопасности сайта
Скажите пожалуйста как можна повысить безопасность сайта и защитить его от взлома:)

Повышение безопасности ОС семейства Windows
Люди подкиньте побольше информации о состоянии безопасности ОС: Windows 98 Windows XP Windows 7 ...

Создание стенда для проверки приборов безопасности
Добрый час суток. Задался вопросом создания стенда для проверки прибора безопасности...

Как расставить токи в транзисторном каскаде?
Добрый день, помогите пожалуйста! Вот в схеме подключения транзистора, токи базы и коллектора...

19
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 20:18  [ТС] 2
Исходники аналогов где-то были в интернете (нужно залогиниваться).
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 20:43  [ТС] 3
Может, отказаться от автоопределения выводов и и выбрать правильные резисторы, задавшись обозначениями , придумав другую прошивку . В базе , желательно, десятки килоом или не менее нескольких килоом при автоопределении или 470 кОм , когда h21e измеряют , в коллекторе около 1 килоома, напряжение не должно превышать 3...5 В, для некоторых полевых транзисторов ток прямосмещенного перехода не должен превышать 0,1 мА, а напряжение (для некоторых ) между затвором и каналом должно быть не более 2...3 В (как для КП301). Для КТ814,КТ814 такой режим может и подойти.
Мой макет для опытов по работе с индикатором :
0
Миниатюры
Повышение безопасности проверки транзисторов в транзисторном тестере на AVR  
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 21:55  [ТС] 4
Принцип действия аналогичен следующему файлу с исходниками, только lcd.h иначе сконфигурирована под 1602й контроллер.
0
Миниатюры
Повышение безопасности проверки транзисторов в транзисторном тестере на AVR  
Вложения
Тип файла: zip hex2.zip (111.1 Кб, 0 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 22:25  [ТС] 5
В main.c исходника прототипа есть такие строчки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "main.h"
 
// Определение прототипов функций
void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TristatePin);
void DischargePin(uint8_t PinToDischarge, uint8_t DischargeDirection);
unsigned int ReadADC(uint8_t mux);
void battery_check( void );
void show_battery( void );
 
struct Diode diodes[6];
uint8_t NumOfDiodes;
 
uint8_t b,c,e;              // Выводы транзистора
unsigned long lhfe;         // К передачи по тоеу (long)
uint8_t PartReady;          // Признак наличия компонента
uint8_t PartMode;           // Подвид компонента
uint8_t PartFound, tmpPartFound;    //das gefundene Bauteil
unsigned int hfe[2];        // К передачи по току (для вывода)
unsigned int uBE[2];        // Падение напряжения B<->E транзистора
 
unsigned long cv;
 
unsigned int gthvoltage;    //Gate-Schwellspannung
uint8_t tmpval, tmpval2;
char string_buf[6];
int main(void) {
uint8_t tmp;
    
    LCD_DIR = 0x0F;
    LCD_PORT = 0x40;        // Подтяжка на пине управления негатив/позитив
//  Инициализация АЦП
    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);           // Прескалер=8
    
    SETBIT(LCD_PORT,LCD_RES);
    CLRBIT(LCD_PORT,LCD_CLK);
    CLRBIT(LCD_PORT,LCD_DAT);
    CLRBIT(LCD_PORT,LCD_RES);
    ReadADC( 5 | (1<<REFS1) );                              //Холостое чтение АЦП
unsigned int rhval = eeprom_read_word(&R_H_VAL);            //R_H
unsigned int rlval = eeprom_read_word(&R_L_VAL);            //R_L
...
В прошивке _English.eep (для 123.hex) есть такие байты

Код
002000) 22 00 00 00 A8 02 5C 12 8A 01 1B 01 54 65 73 74...
A8 02 -это, кажется, 02A8 -680 (eeprom_read_word(&R_H_VAL) (680 Ом), фиксать , переведя в 16-ричную форму,
5С 12 -это ,кажется, 125С 4700 ( eeprom_read_word(&R_L_VAL); ) , правильно ли мы его поняли, про 470 кОм

Добавлено через 3 минуты
еще

C++
1
2
3
4
5
6
7
8
// Вычисление коэффициента передачи транзистора по току
        // hFE = Ток эмиттера / Ток базы
        lhfe = hfe[1];
        // Приведение к отношению RH/RL (470K/680)
        lhfe *= (((unsigned long)rhval * 100) / (unsigned long)rlval);
        if(uBE[1]<11) uBE[1] = 11;      // Исключаем ошибку деления на "0".
        lhfe /= uBE[1];
        hfe[1] = (unsigned int) lhfe;   // Приводим к значению uint (0..65535)
Добавлено через 2 минуты
если 1 кОм, то 0x02A8->0x03E8 --> A8 02->E8 03

Добавлено через 2 минуты
если RL =4,7 кОм, то A8 02->5C 12
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 22:29  [ТС] 6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
#include "main.h"
 
// Определение прототипов функций
void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TristatePin);
void DischargePin(uint8_t PinToDischarge, uint8_t DischargeDirection);
unsigned int ReadADC(uint8_t mux);
void battery_check( void );
void show_battery( void );
 
struct Diode diodes[6];
uint8_t NumOfDiodes;
 
uint8_t b,c,e;              // Выводы транзистора
unsigned long lhfe;         // К передачи по тоеу (long)
uint8_t PartReady;          // Признак наличия компонента
uint8_t PartMode;           // Подвид компонента
uint8_t PartFound, tmpPartFound;    //das gefundene Bauteil
unsigned int hfe[2];        // К передачи по току (для вывода)
unsigned int uBE[2];        // Падение напряжения B<->E транзистора
 
unsigned long cv;
 
unsigned int gthvoltage;    //Gate-Schwellspannung
uint8_t tmpval, tmpval2;
char string_buf[6];
 
 
//
// ===================================== Главный модуль программы =====================================
//
int main(void) {
uint8_t tmp;
    
    LCD_DIR = 0x0F;
    LCD_PORT = 0x40;        // Подтяжка на пине управления негатив/позитив
//  Инициализация АЦП
    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);           // Прескалер=8
    
    SETBIT(LCD_PORT,LCD_RES);
    CLRBIT(LCD_PORT,LCD_CLK);
    CLRBIT(LCD_PORT,LCD_DAT);
    CLRBIT(LCD_PORT,LCD_RES);
    ReadADC( 5 | (1<<REFS1) );                              //Холостое чтение АЦП
unsigned int rhval = eeprom_read_word(&R_H_VAL);            //R_H
unsigned int rlval = eeprom_read_word(&R_L_VAL);            //R_L
    SETBIT(LCD_PORT,LCD_RES);
    nokia_init();
 
    PartFound = PART_NONE;
    tmpPartFound = PART_NONE;
    NumOfDiodes = 0;
    PartReady = 0;
    PartMode = 0;
//
// ********* Начало проверки подключенного устройства
//
    nokia_cls();        // Очисттиь экран
    put_qmark();        // Вывести знаки вопроса
    battery_check();    // Проверить батарейку
    show_battery();     // Наложить спрайт батарейки
/*
    nokia_cls();        // Проверка отображения графического спрайта
    put_simi();
for(;;);    
*/  
    //Alle 6 Kombinationsmцglichkeiten fьr die 3 Pins prьfen
    CheckPins(TP1, TP2, TP3);
    CheckPins(TP1, TP3, TP2);
    CheckPins(TP2, TP1, TP3);
    CheckPins(TP2, TP3, TP1);
    CheckPins(TP3, TP2, TP1);
    CheckPins(TP3, TP1, TP2);
/*
utoa(PartFound,string_buf,10);      // Вывод на экран отладочных значений переменных
nokia_pdec(0,0);
utoa(NumOfDiodes,string_buf,10);        // Вывод на экран отладочных значений переменных
nokia_pdec(0,1);
for(;;);
*/
//
// *** Обнаружен диод. Начало секции обработки типов диодов ***
//
    if(PartFound == PART_DIODE) {
        if( NumOfDiodes ) nokia_cls();
        if(NumOfDiodes == 1) {
            // =============================== Обычный диод
            put_diode();
            nokia_gotoXY(21,2);
            nokia_put_char(diodes[0].Cathode + 1);
            nokia_gotoXY(56,2);
            nokia_put_char(diodes[0].Anode + 1);
            itoa(diodes[0].Voltage, string_buf, 10);
            nokia_gotoXY(7,4);
            nokia_Uf();
            nokia_pdec(35,4);
            nokia_gotoXY(63,4);
            nokia_mV();
            goto end;
        } else if(NumOfDiodes == 2) {
        // =============================== Двойной встречно-последовательный диод
            if(diodes[0].Anode == diodes[1].Anode) {
                // Общий анод
                put_ca();
                nokia_gotoXY(38,1);
                nokia_put_char(diodes[0].Cathode + 1);
                nokia_gotoXY(14,4);
                nokia_put_char(diodes[0].Anode + 1);
                nokia_gotoXY(63,4);
                nokia_put_char(diodes[1].Anode + 1);
                goto end;
            } else if(diodes[0].Cathode == diodes[1].Cathode) {
                // Сборка с общим катодом
                put_cc();
                nokia_gotoXY(38,1);
                nokia_put_char(diodes[0].Cathode + 1);
                nokia_gotoXY(14,4);
                nokia_put_char(diodes[0].Anode + 1);
                nokia_gotoXY(63,4);
                nokia_put_char(diodes[1].Anode + 1);
                goto end;
            } else if ((diodes[0].Cathode == diodes[1].Anode) && (diodes[1].Cathode == diodes[0].Anode)) {
                // Антипараллельные диоды
                put_anti();
                goto end;
            }
        } else if(NumOfDiodes == 3) {
            //Serienschaltung aus 2 Dioden; wird als 3 Dioden erkannt
            b = 3;
            c = 3;
            /* Ьberprьfen auf eine fьr eine Serienschaltung von 2 Dioden mцgliche Konstellation
                Dafьr mьssen 2 der Kathoden und 2 der Anoden ьbereinstimmen.
                Das kommmt daher, dass die Dioden als 2 Einzeldioden und ZUSДTZLICH als eine "groЯe" Diode erkannt werden.
            */
            if((diodes[0].Anode == diodes[1].Anode) || (diodes[0].Anode == diodes[2].Anode)) b = diodes[0].Anode;
            if(diodes[1].Anode == diodes[2].Anode) b = diodes[1].Anode;
 
            if((diodes[0].Cathode == diodes[1].Cathode) || (diodes[0].Cathode == diodes[2].Cathode)) c = diodes[0].Cathode;
            if(diodes[1].Cathode == diodes[2].Cathode) c = diodes[1].Cathode;
            if((b<3) && (c<3)) {                
                put_serial();
                nokia_gotoXY(14,3);
                nokia_put_char(c + 1);
                nokia_gotoXY(63,3);
                nokia_put_char(b + 1);
                nokia_gotoXY(37,0);
                nokia_put_char(4-b-c);  // Вычисляем позицию третьего вывода.
                goto end;
            }
        }
    } else
    if (PartFound == PART_TRANSISTOR) {
// *** Обнаружена структура транзистора ***
        if(PartReady == 0) {    //Wenn 2. Prьfung nie gemacht, z.B. bei Transistor mit Schutzdiode
            hfe[1] = hfe[0];
            uBE[1] = uBE[0];
        }
        if((hfe[0]>hfe[1])) {   //Wenn der Verstдrkungsfaktor beim ersten Test hцher war: C und E vertauschen!
            hfe[1] = hfe[0];
            uBE[1] = uBE[0];
            tmp = c;
            c = e;
            e = tmp;
        }
        nokia_cls();
        // Вывод общего обозначения транзистора
        put_bipolar();
        // Вывод обозначения стрелочки для npn или pnp транзистора
        if(PartMode == PART_MODE_NPN) put_an(); else put_ap();
        // Если обнаружен защитный диод, вывод в соответсвующей полярности
        if(NumOfDiodes > 2) { if(PartMode == PART_MODE_NPN) put_npd(); else put_ppd(); }
        // Вывод цоколевки транзистора
        nokia_gotoXY(21,1);     // Вывод позиции базы
        nokia_put_char(b + 1);
        nokia_gotoXY(43,0);     // Вывод позиции коллектора
        nokia_put_char(c + 1);
        nokia_gotoXY(43,2);     // Вывод позиции еммитера
        nokia_put_char(e + 1);
        // Вычисление коэффициента передачи транзистора по току
        // hFE = Ток эмиттера / Ток базы
        lhfe = hfe[1];
        // Приведение к отношению RH/RL (470K/680)
        lhfe *= (((unsigned long)rhval * 100) / (unsigned long)rlval);
        if(uBE[1]<11) uBE[1] = 11;      // Исключаем ошибку деления на "0".
        lhfe /= uBE[1];
        hfe[1] = (unsigned int) lhfe;   // Приводим к значению uint (0..65535)
        nokia_gotoXY(0,4);
        nokia_hFE();
        utoa(hfe[1], string_buf, 10);
        nokia_pdec(35,4);
/*
utoa(NumOfDiodes,string_buf,10);        // Вывод на экран отладочных значений переменных
nokia_pdec(0,0);
for(;;);
*/
        for(c=0;c<NumOfDiodes;c++) {
            if(((diodes[c].Cathode == e) && (diodes[c].Anode == b) && (PartMode == PART_MODE_NPN)) || ((diodes[c].Anode == e) && (diodes[c].Cathode == b) && (PartMode == PART_MODE_PNP))) {
                nokia_gotoXY(7,5);
                nokia_Uf();
                itoa(diodes[c].Voltage, string_buf, 10);
                nokia_pdec(35,5);
                nokia_gotoXY(70, 5);
                nokia_mV();
                goto end;
            }
        }
        goto end;
    } else
    if (PartFound == PART_FET) {    //JFET oder MOSFET
// *** Обнаружен полевик MOS  или JFET ***
        nokia_cls();
        if( (PartMode == PART_MODE_N_D_MOS) || (PartMode == PART_MODE_P_D_MOS)) {
                if( PartMode & 1 ) put_ndmos(); else put_pdmos(); 
        } else {
            if((PartMode==PART_MODE_N_JFET) || (PartMode==PART_MODE_P_JFET)) {
                if( PartMode & 1 ) put_nfet(); else put_pfet(); 
            } else {
                if( PartMode & 1 ) put_nemos(); else put_pemos(); 
            }
        }
        nokia_gotoXY(21,2);
        nokia_put_char(b + 1);
        nokia_gotoXY(49,2);
        nokia_put_char(e + 1);
        nokia_gotoXY(49,0);
        nokia_put_char(c + 1);
// Определение наличия защитного диода      
        if((NumOfDiodes > 0) && (PartMode < 3)) {   //MOSFET mit Schutzdiode; gibt es nur bei Anreicherungs-FETs
    // Вывод символа защитного диода в нужной полярности
            if( PartMode & 1 ) N_prot_D(); else P_prot_D();
        }
// Замер порогового напряжения для MOSFET
        if(PartMode < 3) {  //Anreicherungs-MOSFET
            gthvoltage=(gthvoltage/8);
            nokia_gotoXY(0,4);
            nokia_Vt();
            utoa(gthvoltage, string_buf, 10);   //Gate-Schwellspannung, wurde zuvor ermittelt
            nokia_pdec(28,4);
            nokia_gotoXY(70,4);
            nokia_mV();
        }
        goto end; // С полевиками закончили.
    } else if (PartFound == PART_THYRISTOR) {
// Обнаружен тиристор  
        nokia_cls();
        put_tyry();             // Выводим символ тиристора
        nokia_gotoXY(21,2);     // Размещаем обозначения выводов
        nokia_put_char(c+1);
        nokia_gotoXY(56,3);
        nokia_put_char(e+1);
        nokia_gotoXY(56,1);
        nokia_put_char(b+1);
//      GAK=bce
        goto end; // С тиристорами закончили.
    } else if (PartFound == PART_TRIAC) {
 // Обнаружен симистор
        nokia_cls();
        put_simi();             // Выводим символ симистора
//      b=Gate e=A1 c=A2
        nokia_gotoXY(56,0);     // Размещаем обозначения выводов
        nokia_put_char(b+1);
        nokia_gotoXY(21,2);
        nokia_put_char(e+1);
        nokia_gotoXY(56,2);
        nokia_put_char(c+1);
    } // Больше нечего определять...
end:
    show_battery();             // "Наложить" спрайт батарейки
    CLRBIT(ADCSRA,ADEN);        // Выключить АЦП
    SETBIT(ACSR,ACD);           // Выключить АК
    ADMUX = 0x00;               // Выключить внутренний ИОН
    MCUCR = 0xA0;
    DDRD = 0x08;                // Все порты на ввод и без подтяжек! Кроме пина на сброс ЖКИ
    PORTD = 0x08;
    DDRB = 0x00;
    PORTB = 0x00;
    DDRC = 0x00;
    PORTC = 0x00;
asm volatile("sleep");          // "Заснуть" до полного сброса МК.
//
// *************** END OF MAIN ************
}
 
//
// ==================================
//
void DischargePin(uint8_t PinToDischarge, uint8_t DischargeDirection) {
    /*Anschluss eines Bauelementes kurz(10ms) auf ein bestimmtes Potenzial legen
        Diese Funktion ist zum Entladen von MOSFET-Gates vorgesehen, um Schutzdioden u.д. in MOSFETs erkennen zu kцnnen
        Parameter:
        PinToDischarge: zu entladender Pin
        DischargeDirection: 0 = gegen Masse (N-Kanal-FET), 1= gegen Plus(P-Kanal-FET)
    */
    uint8_t tmpval;
    tmpval = (PinToDischarge * 2);      //nцtig wegen der Anordnung der Widerstдnde
 
    if(DischargeDirection) R_PORT |= (1<<tmpval);           //R_L aus
    R_DDR |= (1<<tmpval);           //Pin auf Ausgang und ьber R_L auf Masse
    _delay_ms(10);
    R_DDR &= ~(1<<tmpval);          //Pin wieder auf Eingang
    if(DischargeDirection) R_PORT &= ~(1<<tmpval);          //R_L aus
}
//
// ==================================
//
 
unsigned int ReadADC(uint8_t mux) {
unsigned int adcx = 0;
    ADMUX = mux | (1<<REFS0);                           // Опорное = U питания
    for(uint8_t j = 0; j != 8; j++) {                   // 8 замеров
        ADCSRA |= (1<<ADSC);
        while (ADCSRA&(1<<ADSC));
        adcx += ADCW;                                   // Накопление
    }
    return adcx >>= 3;                                  // Возвращаем усредненное
}
 
// Индексы состояния батарейки
#define b100    3       // Заряд на 100%     
#define b75     2       // Заряд на  75%     
#define b25     1       // Заряд на  25%     
#define b0      0       // Полный разряд        
 
char    battery;
 
void battery_check( void ){
signed int U = ReadADC( 5 | (1<<REFS1) );               // Внутренний ИОН = 2.56 вольт
    if ( U > 800 ) battery = b100; else                 // больше 8 вольт - полная емкость (2.23 после делителя)
    if ( U > 700 ) battery =  b75; else                 // больше 7 вольт - 75% емкости    (1.98 после делителя)
    if ( U > 600 ) battery =  b25; else                 // больше 6 вольт - 25% емкости      (1.74 после делителя)
    battery = b0;                                       // полный разряд  - меньше 6 вольт (1.49 после делителя)
}   
 
void show_battery( void ){
    switch( battery ){
        case b100: put_batt100(); break;
        case b75: put_batt75(); break;
        case b25: put_batt25(); break;
        case b0: put_batt0(); break;
        default: ;
    }
}   
 
/*
// Для отладки (контроль числовых значений)
utoa(PartFound,string_buf,10);
nokia_pdec(0,0);
utoa(PartMode,string_buf,10);
nokia_pdec(0,2);
utoa(NumOfDiodes,string_buf,10);
nokia_pdec(0,3);
for(;;);
*/
 
void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TristatePin) {
    /*
    Funktion zum Testen der Eigenschaften des Bauteils bei der angegebenen Pin-Belegung
    Parameter:
    HighPin: Pin, der anfangs auf positives Potenzial gelegt wird
    LowPin: Pin, der anfangs auf negatives Potenzial gelegt wird
    TristatePin: Pin, der anfangs offen gelassen wird
 
    Im Testverlauf wird TristatePin natьrlich auch positiv oder negativ geschaltet.
    */
    unsigned int adcv[6];
    uint8_t tmpval, tmpval2;
    /*
        HighPin wird fest auf Vcc gelegt
        LowPin wird ьber R_L auf GND gelegt
        TristatePin wird hochohmig geschaltet, dafьr ist keine Aktion nцtig
    */
    //Pins setzen
    tmpval = (LowPin * 2);          //nцtig wegen der Anordnung der Widerstдnde
    R_DDR = (1<<tmpval);            //Low-Pin auf Ausgang und ьber R_L auf Masse
    R_PORT = 0;
    ADC_DDR = (1<<HighPin);         //High-Pin auf Ausgang
    ADC_PORT = (1<<HighPin);        //High-Pin fest auf Vcc
    _delay_ms(5);
    //Bei manchen MOSFETs muss das Gate (TristatePin) zuerst entladen werden
    //N-Kanal:
    DischargePin(TristatePin,0);
    //Spannung am Low-Pin ermitteln
    adcv[0] = ReadADC(LowPin);
    if(adcv[0] < 200) goto next;    //Sperrt das Bauteil jetzt?
    //sonst: Entladen fьr P-Kanal (Gate auf Plus)
    DischargePin(TristatePin,1);
    //Spannung am Low-Pin ermitteln
    adcv[0] = ReadADC(LowPin);
 
next:
 
    if(adcv[0] > 19) {//Bauteil leitet ohne Steuerstrom etwas
        //Test auf N-JFET oder selbstleitenden N-MOSFET
        R_DDR |= (2<<(TristatePin*2));  //Tristate-Pin (vermutetes Gate) ьber R_H auf Masse
        _delay_ms(20);
        adcv[1] = ReadADC(LowPin);      //Spannung am vermuteten Source messen
        R_PORT |= (2<<(TristatePin*2)); //Tristate-Pin (vermutetes Gate) ьber R_H auf Plus
        _delay_ms(20);
        adcv[2] = ReadADC(LowPin);      //Spannung am vermuteten Source erneut messen
        //Wenn es sich um einen selbstleitenden MOSFET oder JFET handelt, mьsste adcv[1] > adcv[0] sein
        if(adcv[2]>(adcv[1]+100)) {
            //Spannung am Gate messen, zur Unterscheidung zwischen MOSFET und JFET
            ADC_PORT = 0;
            ADC_DDR = (1<<LowPin);  //Low-Pin fest auf Masse
            tmpval = (HighPin * 2);     //nцtig wegen der Anordnung der Widerstдnde
            R_DDR |= (1<<tmpval);           //High-Pin auf Ausgang
            R_PORT |= (1<<tmpval);          //High-Pin ьber R_L auf Vcc
            _delay_ms(20);
            adcv[2] = ReadADC(TristatePin);     //Spannung am vermuteten Gate messen
            if(adcv[2]>800) {   //MOSFET
                PartFound = PART_FET;           //N-Kanal-MOSFET
                PartMode = PART_MODE_N_D_MOS;   //Verarmungs-MOSFET
            } else {    //JFET (pn-Ьbergang zwischen G und S leitet)
                PartFound = PART_FET;           //N-Kanal-JFET
                PartMode = PART_MODE_N_JFET;
            }
            b = TristatePin;
            c = HighPin;
            e = LowPin;
        }
        ADC_PORT = 0;
        //Test auf P-JFET oder selbstleitenden P-MOSFET
        ADC_DDR = (1<<LowPin);  //Low-Pin (vermuteter Drain) fest auf Masse, Tristate-Pin (vermutetes Gate) ist noch ьber R_H auf Plus
        tmpval = (HighPin * 2);         //nцtig wegen der Anordnung der Widerstдnde
        R_DDR |= (1<<tmpval);           //High-Pin auf Ausgang
        R_PORT |= (1<<tmpval);          //High-Pin ьber R_L auf Vcc
        _delay_ms(20);
        adcv[1] = ReadADC(HighPin);     //Spannung am vermuteten Source messen
        R_PORT = (1<<tmpval);           //Tristate-Pin (vermutetes Gate) ьber R_H auf Masse
        _delay_ms(20);
        adcv[2] = ReadADC(HighPin);     //Spannung am vermuteten Source erneut messen
        //Wenn es sich um einen selbstleitenden P-MOSFET oder P-JFET handelt, mьsste adcv[0] > adcv[1] sein
        if(adcv[1]>(adcv[2]+100)) {
            //Spannung am Gate messen, zur Unterscheidung zwischen MOSFET und JFET
            ADC_PORT = (1<<HighPin);    //High-Pin fest auf Plus
            ADC_DDR = (1<<HighPin);     //High-Pin auf Ausgang
            _delay_ms(20);
            adcv[2] = ReadADC(TristatePin);     //Spannung am vermuteten Gate messen
            if(adcv[2]<200) {   //MOSFET
                PartFound = PART_FET;           //P-Kanal-MOSFET
                PartMode = PART_MODE_P_D_MOS;   //Verarmungs-MOSFET
            } else {    //JFET (pn-Ьbergang zwischen G und S leitet)
                PartFound = PART_FET;           //P-Kanal-JFET
                PartMode = PART_MODE_P_JFET;
            }
            b = TristatePin;
            c = LowPin;
            e = HighPin;
        }
    }
    //Pins erneut setzen
    tmpval = (LowPin * 2);          //nцtig wegen der Anordnung der Widerstдnde
    R_DDR = (1<<tmpval);            //Low-Pin auf Ausgang und ьber R_L auf Masse
    R_PORT = 0;
    ADC_DDR = (1<<HighPin);         //High-Pin auf Ausgang
    ADC_PORT = (1<<HighPin);        //High-Pin fest auf Vcc
    _delay_ms(5);
    
    if(adcv[0] < 200) { //Wenn das Bauteil keinen Durchgang zwischen HighPin und LowPin hat
        //Test auf pnp
        tmpval2 = (TristatePin * 2);        //nцtig wegen der Anordnung der Widerstдnde
        R_DDR |= (1<<tmpval2);          //Tristate-Pin ьber R_L auf Masse, zum Test auf pnp
        _delay_ms(2);
        adcv[1] = ReadADC(LowPin);      //Spannung messen
        if(adcv[1] > 700) {
            //Bauteil leitet => pnp-Transistor o.д.
            //Verstдrkungsfaktor in beide Richtungen messen
            R_DDR = (1<<tmpval);        //Tristate-Pin (Basis) hochohmig
            tmpval2++;
            R_DDR |= (1<<tmpval2);      //Tristate-Pin (Basis) ьber R_H auf Masse
 
            _delay_ms(10);
            adcv[1] = ReadADC(LowPin);      //Spannung am Low-Pin (vermuteter Kollektor) messen
            adcv[2] = ReadADC(TristatePin); //Basisspannung messen
            //Prьfen, ob Test schon mal gelaufen
            if((PartFound == PART_TRANSISTOR) || (PartFound == PART_FET)) PartReady = 1;
            hfe[PartReady] = adcv[1];
            uBE[PartReady] = adcv[2];
 
            if(PartFound != PART_THYRISTOR) {
                if(adcv[2] > 200) {
                    PartFound = PART_TRANSISTOR;    //PNP-Transistor gefunden (Basis wird "nach oben" gezogen)
                    PartMode = PART_MODE_PNP;
                } else {
                    if(adcv[0] < 20) {  //Durchlassspannung im gesperrten Zustand gering genug? (sonst werden D-Mode-FETs fдlschlicherweise als E-Mode erkannt)
                        PartFound = PART_FET;           //P-Kanal-MOSFET gefunden (Basis/Gate wird NICHT "nach oben" gezogen)
                        PartMode = PART_MODE_P_E_MOS;
                        //Messung der Gate-Schwellspannung
                        tmpval = (1<<LowPin);
                        tmpval2 = R_DDR;
                        ADMUX = TristatePin | (1<<REFS0);
                        gthvoltage = 0;
                        for(b=0;b<13;b++) {
                            wdt_reset();
                            DischargePin(TristatePin,1);
                            while (!(ADC_PIN&tmpval));  // Warten, bis der MOSFET schaltet und Drain auf high geht
                            R_DDR = 0;
                            ADCSRA |= (1<<ADSC);
                            while (ADCSRA&(1<<ADSC));
                            gthvoltage += (1023 - ADCW);
                            R_DDR = tmpval2;
                        }
                        gthvoltage *= 3;    //Umrechnung in mV, zusammen mit der Division durch 8 (bei der LCD-Anzeige)
                    }
                }
                b = TristatePin;
                c = LowPin;
                e = HighPin;
            }
        }
 
        //Tristate (vermutete Basis) auf Plus, zum Test auf npn
        ADC_PORT = 0;                   //Low-Pin fest auf Masse
        tmpval = (TristatePin * 2);     //nцtig wegen der Anordnung der Widerstдnde
        tmpval2 = (HighPin * 2);        //nцtig wegen der Anordnung der Widerstдnde
        R_DDR = (1<<tmpval) | (1<<tmpval2);         //High-Pin und Tristate-Pin auf Ausgang
        R_PORT = (1<<tmpval) | (1<<tmpval2);        //High-Pin und Tristate-Pin ьber R_L auf Vcc
        ADC_DDR = (1<<LowPin);          //Low-Pin auf Ausgang
        _delay_ms(10);
        adcv[1] = ReadADC(HighPin);     //Spannung am High-Pin messen
        if(adcv[1] < 500) {
            if(PartReady==1) goto testend;
            //Bauteil leitet => npn-Transistor o.д.
 
            //Test auf Thyristor:
            //Gate entladen
            
            R_PORT = (1<<tmpval2);          //Tristate-Pin (Gate) ьber R_L auf Masse
            _delay_ms(10);
            R_DDR = (1<<tmpval2);           //Tristate-Pin (Gate) hochohmig
            //Test auf Thyristor
            _delay_ms(5);
            adcv[3] = ReadADC(HighPin);     //Spannung am High-Pin (vermutete Anode) erneut messen
            
            R_PORT = 0;                     //High-Pin (vermutete Anode) auf Masse
            _delay_ms(5);
            R_PORT = (1<<tmpval2);          //High-Pin (vermutete Anode) wieder auf Plus
            _delay_ms(5);
            adcv[2] = ReadADC(HighPin);     //Spannung am High-Pin (vermutete Anode) erneut messen
            if((adcv[3] < 500) && (adcv[2] > 900)) {    //Nach Abschalten des Haltestroms muss der Thyristor sperren
                //war vor Abschaltung des Triggerstroms geschaltet und ist immer noch geschaltet obwohl Gate aus => Thyristor
                PartFound = PART_THYRISTOR;
                //Test auf Triac
                R_DDR = 0;
                R_PORT = 0;
                ADC_PORT = (1<<LowPin); //Low-Pin fest auf Plus
                _delay_ms(5);
                R_DDR = (1<<tmpval2);   //HighPin ьber R_L auf Masse
                _delay_ms(5);
                if(ReadADC(HighPin) > 50) goto savenresult; //Spannung am High-Pin (vermuteter A2) messen; falls zu hoch: Bauteil leitet jetzt => kein Triac
                R_DDR |= (1<<tmpval);   //Gate auch ьber R_L auf Masse => Triac mьsste zьnden
                _delay_ms(5);
                if(ReadADC(TristatePin) < 200) goto savenresult; //Spannung am Tristate-Pin (vermutetes Gate) messen; Abbruch falls Spannung zu gering
                if(ReadADC(HighPin) < 150) goto savenresult; //Bauteil leitet jetzt nicht => kein Triac => Abbruch
                R_DDR = (1<<tmpval2);   //TristatePin (Gate) wieder hochohmig
                _delay_ms(5);
                if(ReadADC(HighPin) < 150) goto savenresult; //Bauteil leitet nach Abschalten des Gatestroms nicht mehr=> kein Triac => Abbruch
                R_PORT = (1<<tmpval2);  //HighPin ьber R_L auf Plus => Haltestrom aus
                _delay_ms(5);
                R_PORT = 0;             //HighPin wieder ьber R_L auf Masse; Triac mьsste jetzt sperren
                _delay_ms(5);
                if(ReadADC(HighPin) > 50) goto savenresult; //Spannung am High-Pin (vermuteter A2) messen; falls zu hoch: Bauteil leitet jetzt => kein Triac
                PartFound = PART_TRIAC;
                PartReady = 1;
                goto savenresult;
            }
            //Test auf Transistor oder MOSFET
            tmpval++;
            R_DDR |= (1<<tmpval);       //Tristate-Pin (Basis) auf Ausgang
            R_PORT |= (1<<tmpval);      //Tristate-Pin (Basis) ьber R_H auf Plus
            _delay_ms(50);
            adcv[1] = ReadADC(HighPin);     //Spannung am High-Pin (vermuteter Kollektor) messen
            adcv[2] = ReadADC(TristatePin); //Basisspannung messen
 
            if((PartFound == PART_TRANSISTOR) || (PartFound == PART_FET)) PartReady = 1;    //prьfen, ob Test schon mal gelaufen
            hfe[PartReady] = 1023 - adcv[1];
            uBE[PartReady] = 1023 - adcv[2];
            if(adcv[2] < 500) {
                PartFound = PART_TRANSISTOR;    //NPN-Transistor gefunden (Basis wird "nach unten" gezogen)
                PartMode = PART_MODE_NPN;
            } else {
                if(adcv[0] < 20) {  //Durchlassspannung im gesperrten Zustand gering genug? (sonst werden D-Mode-FETs fдlschlicherweise als E-Mode erkannt)
                    PartFound = PART_FET;           //N-Kanal-MOSFET gefunden (Basis/Gate wird NICHT "nach unten" gezogen)
                    PartMode = PART_MODE_N_E_MOS;
                    //Gate-Schwellspannung messen
                    tmpval2 = R_DDR;
                    tmpval=(1<<HighPin);
                    ADMUX = TristatePin | (1<<REFS0);
                    gthvoltage = 0;
                    for(b=0;b<13;b++) {
                        wdt_reset();
                        DischargePin(TristatePin,0);
                        while ((ADC_PIN&tmpval));  // Warten, bis der MOSFET schaltet und Drain auf low geht
                        R_DDR = 0;
                        R_PORT = 0;
                        ADCSRA |= (1<<ADSC);
                        while (ADCSRA&(1<<ADSC));
                        gthvoltage += ADCW;
                        R_DDR = tmpval2;
                        R_PORT = tmpval2;
                    }
                    gthvoltage *= 3;    //Umrechnung in mV, zusammen mit der Division durch 8 (bei der LCD-Anzeige)
                }
            }
            savenresult:
            b = TristatePin;
            c = HighPin;
            e = LowPin;
        }
        ADC_DDR = 0;
        ADC_PORT = 0;
        //Fertig
    } else {    //Durchgang
        //Test auf Diode
        tmpval2 = (2<<(2*HighPin)); //R_H
        tmpval = (1<<(2*HighPin));  //R_L
        ADC_PORT = 0;
        ADC_DDR = (1<<LowPin);  //Low-Pin fest auf Masse, High-Pin ist noch ьber R_L auf Vcc
        DischargePin(TristatePin,1);    //Entladen fьr P-Kanal-MOSFET
        _delay_ms(5);
        adcv[0] = ReadADC(HighPin) - ReadADC(LowPin);
        R_DDR = tmpval2;    //High-Pin ьber R_H auf Plus
        R_PORT = tmpval2;
        _delay_ms(5);
        adcv[2] = ReadADC(HighPin) - ReadADC(LowPin);
        R_DDR = tmpval; //High-Pin ьber R_L auf Plus
        R_PORT = tmpval;
        DischargePin(TristatePin,0);    //Entladen fьr N-Kanal-MOSFET
        _delay_ms(5);
        adcv[1] = ReadADC(HighPin) - ReadADC(LowPin);
        R_DDR = tmpval2;    //High-Pin ьber R_H  auf Plus
        R_PORT = tmpval2;
        _delay_ms(5);
        adcv[3] = ReadADC(HighPin) - ReadADC(LowPin);
        /*Ohne das Entladen kann es zu Falscherkennungen kommen, da das Gate eines MOSFETs noch geladen sein kann.
            Die zusдtzliche Messung mit dem "groЯen" Widerstand R_H wird durchgefьhrt, um antiparallele Dioden von
            Widerstдnden unterscheiden zu kцnnen.
            Eine Diode hat eine vom Durchlassstrom relativ unabhдngige Durchlassspg.
            Bei einem Widerstand дndert sich der Spannungsabfall stark (linear) mit dem Strom.
        */
        if(adcv[0] > adcv[1]) {
            adcv[1] = adcv[0];  //der hцhere Wert gewinnt
            adcv[3] = adcv[2];
        }
 
        if((adcv[1] > 30) && (adcv[1] < 950)) { //Spannung liegt ьber 0,15V und unter 4,64V => Ok
            if((PartFound == PART_NONE) || (PartFound == PART_RESISTOR)) PartFound = PART_DIODE;    //Diode nur angeben, wenn noch kein anderes Bauteil gefunden wurde. Sonst gдbe es Probleme bei Transistoren mit Schutzdiode
            diodes[NumOfDiodes].Anode = HighPin;
            diodes[NumOfDiodes].Cathode = LowPin;
            diodes[NumOfDiodes].Voltage = (adcv[1]*54/11);  // ca. mit 4,9 multiplizieren, um aus dem ADC-Wert die Spannung in Millivolt zu erhalten
            NumOfDiodes++;
            for(uint8_t i=0;i<NumOfDiodes;i++) {
                if((diodes[i].Anode == LowPin) && (diodes[i].Cathode == HighPin)) { //zwei antiparallele Dioden: Defekt oder Duo-LED
                    if((adcv[3]*64) < (adcv[1] / 5)) {  //Durchlassspannung fдllt bei geringerem Teststrom stark ab => Defekt
                        if(i<NumOfDiodes) {
                            for(uint8_t j=i;j<(NumOfDiodes-1);j++) {
                                diodes[j].Anode = diodes[j+1].Anode;
                                diodes[j].Cathode = diodes[j+1].Cathode;
                                diodes[j].Voltage = diodes[j+1].Voltage;
                            }
                        }
                        NumOfDiodes -= 2;
                    }
                }
            }
        }
    }
testend:
    ADC_DDR = 0;
    ADC_PORT = 0;
    R_DDR = 0;
    R_PORT = 0;
}
Добавлено через 1 минуту
У нас вместо нокиевских программ индикации обычный 1602 в 4-битном режиме, без лишних спрайтов.

Добавлено через 1 минуту
Вообще , это достаточно примитивная и неточная схема.
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 22:44  [ТС] 7
В китайском тестере M890G h21e+1 (h21e с погрешностью тестера ) обычно измеряется следующим образом (уточнить отсутствие опечатки в эмиттерном резисторе)
0
Миниатюры
Повышение безопасности проверки транзисторов в транзисторном тестере на AVR  
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
26.01.2020, 22:49  [ТС] 8
10 кОм ли Rэ ( опечатка ли там)? Уточню потом.
0
Миниатюры
Повышение безопасности проверки транзисторов в транзисторном тестере на AVR  
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
27.01.2020, 01:00  [ТС] 9
Если Rk(~=Re по токам ) = 10 кОм , то 0x02A8 A8 02--> 0x2710 - > 10 27

В китайском тестере питание 9В, у нас лог 1 не более 5В на х.х.

Добавлено через 2 часа 5 минут
Погрешность измерения емкости достаточно большая (с _English.eep, 123.hex , 470 кОм, 680 Ом, без коррекции OSCCAL ), например при 1 нФ показывает 1,7 нФ, с 2,2...2,7нФ выдает 3,3...3,8 нФ, зависимость от ESR (ложно "залучшает" емкость из-за большого ESR, как и в дешевых китайских тестерах без четырехзажимной схемы с векторным вольтметром или мостовой ). На BD140 показывал PNP, hfe=177.
0
27 / 22 / 5
Регистрация: 31.01.2019
Сообщений: 95
27.01.2020, 17:52 10
Цитата Сообщение от USERPC01 Посмотреть сообщение
10 кОм ли Rэ ( опечатка ли там)? Уточню потом.
У меня в китайском впаян 10 Ом, В базах стоят по 220 кОм.
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 19:25  [ТС] 11
C RL=4,7k вместо 680 Ом некоторые элементы (в других точках ВАХ ) проверяются безопаснее, но следует учитывать зависимость h21e от токов коллектора и базы , напряжения коллектор-база , его зависимости от них . У меня с этой прошивкой под RL=4,7k,RH=470k с BD140 получалось hfe=110, Uf=638mV , до этого при более малосигнальном режиме он был (при RL= 680 Ом) 169...172
0
Вложения
Тип файла: zip rl4_7k_mega8_1602.zip (78.6 Кб, 0 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 19:45  [ТС] 12
Напряжение Uf диодов вблизи точки knife pont немного уменьшится, но проверка их может быть безопаснее. Некоторые СВЧ- элементы таким пробником не проверяют во избежание ВЧ-пробоя, или это возможно хотя бы при RL=10 кОм , но не для всех , а выдерживающих 5 В обратное.

Добавлено через 4 минуты
Режиму измерения емкости в нем не верят , он может завышать в 1,5..2,5 раза. Это можно переделать, но это только дополнительный режим на случай обрыва для тенденциозной индикации параметров выводов с обрывом, математика его достаточно проблемна , а таймер не настроен достаточно правильно.

Добавлено через 9 минут
С 100 мкФ может завышать в 10 раз, может, все таки с 1...2,2 кОм пробовать ?Но для базы 1...7 мА это не безопасно(кроме мощных) .

Добавлено через 22 секунды
С нумерацией пинов лучше.

Добавлено через 1 минуту
В алгоритме индикации емкости еще какая-то константа (у учетом апериодического процесса заряда , компаратора и таймера)не исправлена.
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 19:57  [ТС] 13
Альтернативные исходники с сайта Маркуса
там еще надо подбирать константы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define N_GATE_CAPACITY_FACTOR 387
#define P_GATE_CAPACITY_FACTOR 142
 
/*
    Genaue Werte der verwendeten Widerstдnde in Ohm.
    Der Nennwert fьr R_L ist 680 Ohm, fьr R_H 470kOhm
    Um das Programm auf Abweichungen von diesen Werten (z.B. durch Bauteiltoleranzen)
    zu kalibrieren, die Widerstandswerte in Ohm in die folgenden Defines eintragen:
*/
#define R_L_VAL 680         //R_L; Norm wert 680 Ohm
#define R_H_VAL 470000UL    //R_H; Normwert 470000 Ohm, als unsigned long angeben
 
//Im Programm nцtige Widerstandswerte berechnen
#define RH_RL_RATIO (R_H_VAL / R_L_VAL)
#define R_READ_RH (R_H_VAL / 100)
 
 
/*  Faktoren fьr die Kapatitдtsmessung bei Kondensatoren
    Diese Faktoren hдngen von Fertigungstoleranzen des AVR ab und mьssen somit ggf. angepasst werden
    H_CAPACITY_FACTOR ist fьr die Messung mit 470k-Widerstand (geringe Kapazitдt)
    L_CAPACITY_FACTOR ist fьr die Messung mit 680-Ohm-Widerstand (hohe Kapazitдt)
    Der gesamte Messbereich ist ca. 0,2nF bis 1000µF.
*/
#define H_CAPACITY_FACTOR 394
#define L_CAPACITY_FACTOR 283
0
Вложения
Тип файла: zip ATmega8.zip (132.3 Кб, 0 просмотров)
Тип файла: zip ATmega8_.zip (271.4 Кб, 0 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 20:03  [ТС] 14
https://www.mikrocontroller.ne... stortester

Добавлено через 3 минуты
Очевидно , с такими большими резисторами он работает не очень устойчиво.
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 22:04  [ТС] 15
Еще один вариант (немецкая версия), с 680 Ом, по емкости корректировать множители :

1нФ-1,3 нФ
100 нФ-144,40нФ

2200 мкФ -3315,26 мкФ

КТ815Г
hfe=87,Uf=692 mV
КТ940А
hfe=71,Uf=731 mV
BD140
hfe=173,Uf=716 mV
BC547
hfe=395,Uf=780 mV
КД522Б
Uf=643mV
АЛ336 зеленый
Uf=1904mV
0
Вложения
Тип файла: rar 99.rar (193.7 Кб, 0 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 22:18  [ТС] 16
Д9(голубая полоска) Uf=476 mv, а по китайскому тестеру в режиме диодов 250 мВ , не слишком ли большой ток (тот случай).

Добавлено через 7 минут
А есть английская прошивка с скорректированными
C++
1
2
#define H_CAPACITY_FACTOR 394
#define L_CAPACITY_FACTOR 283
?
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 22:40  [ТС] 17
Приделал к одному из файлов седьмую атмел студию (менять коэффициенты и дорабатывать):
0
Вложения
Тип файла: zip GccApplication1.zip (136.2 Кб, 0 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 22:57  [ТС] 18
Пробовал скомпилировать с
C++
1
2
3
4
//#define H_CAPACITY_FACTOR 394
//#define L_CAPACITY_FACTOR 283
#define H_CAPACITY_FACTOR 281
#define L_CAPACITY_FACTOR 220
, улучшилось . но надо уменьшить ;на 100 нФ 103 нФ , 2200 мкф(с минусовым ) -2601 мкФ,
10 нФ 11,09 нФ, 150 пФ- 0,19 нФ
0
Вложения
Тип файла: zip GccApplication1.zip (131.6 Кб, 0 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 23:19  [ТС] 19
с значениями (завышает вверху на 2200 мкФ, немного занижает внизу на 10...100 нФ, завышает на 150 пФ )
C++
1
2
#define H_CAPACITY_FACTOR 249
#define L_CAPACITY_FACTOR 207
более реальные результаты


C++
1
2
3
4
5
6
7
8
9
10
11
#define N_GATE_CAPACITY_FACTOR 387
#define P_GATE_CAPACITY_FACTOR 142
 
/*
    Genaue Werte der verwendeten Widerstдnde in Ohm.
    Der Nennwert fьr R_L ist 680 Ohm, fьr R_H 470kOhm
    Um das Programm auf Abweichungen von diesen Werten (z.B. durch Bauteiltoleranzen)
    zu kalibrieren, die Widerstandswerte in Ohm in die folgenden Defines eintragen:
*/
#define R_L_VAL 680         //R_L; Norm wert 680 Ohm
#define R_H_VAL 470000UL    //R_H; Normwert 470000 Ohm, als unsigned long angeben
пока не уточнял и не менял (с 680 Ом и 470 кОм).
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,378
02.02.2020, 23:21  [ТС] 20
вариант прошивки (доработать)
0
Вложения
Тип файла: zip мега8а.zip (136.1 Кб, 0 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2020, 23:21

Напряжение смещения в широкополосном транзисторном усилителе
Вообщем то не могу найти методику расчета напряжения смещения для широкополосного транзисторного...

Подсчёт результатов в программе-тестере
доделать тест,осталось только сделать так что бы в конце он считал результаты сколько правильных и...

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

AVR JTAG mkI + avarice + avr-gdb + Linux
По какой то неведомой причине мне причине не могу нормально подключится к серверу avarice через...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

(Avr Studio + WinAvr) vs (mikroC PRO for AVR)
Сам пользуюсь (Avr Studyo + WinAvr). Ктонибудь использует mykroC PRO for AVR ? Слышал там...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.