'Константа для 61 Вольт: 6100/1024*256=1525 'Константа для 60 Вольт: 6000/1024*256=1500 'Константа для 50 Вольт: 5000/1024*256=1250 'Константа для 37 Вольт: 3700/1024*256=925 'Константа для 35 Вольт: 3500/1024*256=875 по умолчанию 'Константа для 10 Ампер: 1000/1024*256=250 по умолчанию 'Константа для 20 Ампер: 2000/1024*256=500 'Константа для 21 Ампер: 2100/1024*256=525 'Константа для 2 Ампер: 200/1024*256=50 'Константа для 1 Ампер: 100/1024*256=25 ''''=========Проверка=================================== '' PRINT AT 1,1, "U=",DEC4 V," I=",DEC4 A '' PRINT AT 2,1, "U",DEC2 V//100," I",DEC2 A//100 '' q = V * A '' q=DIV32 1000 '' PRINT " P", DEC,q ''''=========Конец проверки============================= DEVICE 16F876 DECLARE XTAL 4 'OSC = 4 МГц OPTION_REG.7 = 0 'Подтягивающие резисторы на PortB TRISA=%00000111 TRISB=%11110000 TRISC=%00000000 ADCON1=%10000010 PORTC=0 '0 на PORTC, пока идёт иниц.ЖКИ и прочие установки SYMBOL Protect=PORTC.3 'отсюда уходит сигнал защиты на БЗ SYMBOL LedV=PORTC.1 'сюда подключён HL1 SYMBOL LedA=PORTC.2 'сюда подключён HL2 SYMBOL Beep=PORTC.0 'сюда выводится звук SYMBOL SetButton=PORTB.7 'основная кнопка установок SYMBOL SbrosButton=PORTB.6 'Этой кнопкой низким уровнем сбрасывается защита. SYMBOL JumpA=PORTB.5 'Перемычка: её положение определяет сигнал защиты на порту 'штатный режим - сигнал защиты равен положению перемычки 'перегрузка - сигнал защиты обратный положению перемычки SYMBOL JumpV=PORTB.4 'Перемычка: её положение определяет сигнал защиты на порту 'штатный режим - сигнал защиты равен положению перемычки 'перегрузка - сигнал защиты обратный положению перемычки SYMBOL KorBit=PORTC.5 'Бит коррекции при нулевом токе. LedV=JumpV 'сигнал защиты на LedV LedA=JumpA 'сигнал защиты на LedA KorBit=0 DECLARE ADIN_RES 10 'Задать разрядность встроенного АЦП (16F876 имеет 10-ти разрядный АЦП) DECLARE ADIN_STIME 50 'Задержка на время преобразования АЦП: 50 мкс(uS) DECLARE LCD_TYPE 0 'тип LCD: 0 - алфавитно-цифровой DECLARE LCD_DTPIN PORTB.0 'D4 к PORTB.0 DECLARE LCD_ENPIN PORTC.7 'E к PORTC.7 DECLARE LCD_RSPIN PORTC.6 'RS к PORTC.6 DECLARE LCD_INTERFACE 4 '4-х битный режим для LCD DECLARE LCD_COMMANDUS 5000 'Задержка команд (мкс) DECLARE LCD_DATAUS 50 'Время задержки данных в мкс DECLARE LCD_LINES 2 '2-х строчный режим для LCD 'DELAYMS 100 CLS 'PRINT $FE,2 PRINT $FE,$40, $15, $15, $15, $15, $15, $15, $1F, $01 'Щ(0) PRINT $FE,$48, $11, $11, $13, $15, $19, $11, $11, $00 'И(1) PRINT $FE,$50, $1F, $11, $11, $11, $11, $11, $11, $00 'П(2) PRINT $FE,$58, $15, $15, $15, $0E, $15, $15, $15, $00 'Ж(3) PRINT $FE,$60, $11, $11, $11, $0F, $01, $01, $01, $00 'Ч(4) PRINT $FE,$68, $1F, $11, $10, $1E, $11, $11, $1E, $00 'Б(5) PRINT $FE,$70, $11, $11, $11, $19, $15, $15, $19, $00 'Ы(6) PRINT $FE,$78, $11, $11, $11, $0A, $04, $08, $10, $00 'У(7) DIM adcV AS WORD 'вольты в виде 0...1023 DIM adcA AS WORD 'амперы в виде 0...1023 DIM jv1 AS BIT DIM ja1 AS BIT DIM sbros AS BIT 'От её знач. зависит способ сброса защиты: '1 - автоматически через 4 сек при возврате в допустимые пределы, '0- кнопкой DIM LongPress AS 20 'константа задержки нажатия кнопки DIM ButtonPress AS BYTE 'переменная-счетчик нажатия кнопки для ввода значений DIM q AS WORD 'переменная-джокер DIM Vc AS WORD '3500/1024*256=875 по умолчанию DIM Ac AS WORD '1000/1024*256=250 по умолчанию DIM Uover AS WORD 'Порог срабатывания защиты по НАПРЯЖЕНИЮ DIM Iover AS WORD 'Порог срабатывания защиты по ТОКУ DIM Uz AS BYTE 'U защиты DIM Iz AS BYTE 'I защиты DIM Akor AS BYTE 'автоматическая установка нуля измеряемого тока т.к. на выходе LM358 'есть малое напряжение при отсутствии нагрузки DIM Vmax AS BYTE DIM Amax AS BYTE DIM k AS BYTE 'счётчик количества длинных нажатий кнопки DIM g AS 25 'переводной коэф-т DIM CurX AS 8 'позиция курсора по икс при вводе и DIM V AS WORD 'вольты выражены 3500 по умолчанию DIM A AS WORD 'амперы выражены 1000 по умолчанию DIM mA AS BYTE 'хранит сотые доли Ампер DIM adcR AS BYTE 'Падение напряжения на датчике тока в виде 0...1023 DIM Freq1 AS BYTE 'частота 1 и 2 при двухчастотном сигнале DIM Freq2 AS BYTE DIM ev AS BYTE 'принимает значения = или > в U=xxB DIM ea AS BYTE 'принимает значения = или > в I=xxA DIM i AS BYTE 'счётчик циклов (4max=4сек) при сбросе защиты "АВТОМАТИЧЕСКИ" DIM CyclePause AS WORD 'Пауза при мигании надписей в Режиме Защиты jv1=JumpV+1 'инвертирование в зависимости от положений перемычек ja1=JumpA+1 'чтение данных из EEPROM Vc=EREAD 0 Ac=EREAD 2 Akor=EREAD 4 'Величина коррекции при I=0 учитывается каждый раз при включении Прибора sbros=EREAD 5 Uz=EREAD 6 Iz=EREAD 7 Vmax=Vc/g '4/100 Amax=Ac/g '4/100 IF Vc>1525 THEN Vc=875 IF Ac>525 THEN Ac=250 IF Uz>Vmax THEN Uz=Vmax IF Iz>Amax THEN Iz=Amax Uover=Uz * 100 Iover=Iz * 100 k=0 CyclePause=0 ev=61 ea=ev main: INCLUDE "SetButton.inc" i=0 more: 'считывание показаний АЦП в виде 0...1023 adcV=ADIN 0 adcA=ADIN 1 adcR=ADIN 2 alarm: IF adcV = 0 THEN V=0 Akor=adcA ELSE q=(adcV+1)*10*/Vc '10240*875/256=35000; 10230*875/256=34965.82; 10220*875/256=34931.64 V=q/10 IF q//10 >= 5 THEN INC V 'округление по правилам математики ENDIF V = V - (adcR >> 1) IF adcA > Akor THEN q=(adcA+1)*10*/Ac A=q/10 IF q//10 >= 5 THEN INC A ELSE A=0 ENDIF PRINT AT 1,1,"U",ev,DEC V/100,".",DEC2 V//100,"B I",ea,DEC A/100,"." mA=A//100 'пример 1739//100=39 - целое знач сотых ампер IF A < 1000 THEN PRINT DEC2 mA ELSE q=mA//10 IF q < 5 THEN PRINT DEC1 mA/10 ELSE PRINT DEC1 mA/10 + 1 ENDIF ENDIF PRINT "A " CURSOR 2,1 IF sbros=0 THEN PRINT "*" ELSE PRINT " " ENDIF q = V * A q = DIV32 1000 PRINT " Pa = ",DEC q/10,".",DEC1 q//10," BA",REP 32\3 CURSOR 2,16 IF V>=Uover THEN LedV=JumpV Protect=0 ev=62 GOSUB lcdz PRINT " HA",2,"P." CURSOR 1,1 Freq1=105 Freq2=106 GOSUB zvuk ELSE LedV=jv1 'JumpV+1 ev=61 IF A>=Iover THEN LedA=JumpA Protect=0 ea=62 GOSUB lcdz PRINT " TOK",7," " CURSOR 1,9 Freq1=112 Freq2=110 GOSUB zvuk ELSE LedA=ja1 'JumpA+1 Protect=1 CyclePause=0 ea=61 i=3 ENDIF ENDIF DELAYMS CyclePause IF Protect=0 THEN IF sbros=0 THEN i=3 IF SbrosButton=1 THEN GOTO alarm ENDIF ENDIF IF i<3 THEN INC i GOTO alarm ENDIF IF KorBit=0 THEN EWRITE 4,[Akor] 'запись Akor в EEPROM после проверки на 0 KorBit=1 'присваиваем 1, чтобы больше не писать в EEPROM до следующего включения Прибора GOTO main 'в начало цикла '''------------------Блок подпрограмм:-------------------------- zvuk: DELAYMS CyclePause '1000 PRINT REP 32\8 SOUND Beep,[Freq1,10,Freq2,10] Beep=0 RETURN lcdz: CyclePause=1000 PRINT AT 2,2,"3A",0,1,"TA ",2,"O" RETURN kak_sbros: CURSOR 2,1 IF sbros=0 THEN PRINT "HA",3,"AT",1,"EM KHO",2,"K",1,32 ELSE PRINT "ABTOMAT",1,4,"ECK",1,REP 32\3 ENDIF CURSOR 2,1 RETURN uiz: PRINT AT 1,1, "CPA",5,"AT",6,"B. 3A",0,1,"T",6 PRINT AT 2,1, 2,"P",1,": U=",DEC2 Uz,"B I=",DEC2 Iz,"A" RETURN uimax: PRINT AT 1,1,"Umax = ",DEC2 Vmax," B",REP 32\5 PRINT AT 2,1,"Imax = ",DEC2 Amax," A",REP 32\5 RETURN END