Files
ICE_22220_6/Source/Internal/measure.c
2026-03-18 17:13:01 +03:00

303 lines
5.8 KiB
C

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_SWPrioritizedIsrLevels.h"
#include "filter_bat2.h"
#include "package.h"
#include "measure.h"
#include "package.h"
#include "peripher.h"
#include "ADC.h"
#include "RS485.h"
#include "message.h"
#include "log_to_mem.h"
#include <math.h> // Ýòî ÷òîáû ìåðèòü àìïëèòóäó! sqrt áåç ýòîãî áóäåò êðèâ!!!
unsigned int CanPowse,CanGO;
unsigned int Maska[2][8];
int MAX_TPL_CANAL=0; // Êîëè÷åñòâî òåìïåðàòóðíûõ êàíàëîâ
int period_blink;
FLAG chk,sig;
long time_1_5sec, time_5msec, time_5sec;
int sens_type[24];
int sens_pair[24];
int adc0[24];
int tmp0[24];
float tmpK[24];
FILTERBAT def_FILTERBAT = DEF_FILTERBAT;
FILTERBAT filter[40];
interrupt void cpu_timer1_isr_SENS(void);
/********************************************************************/
/* Ðàñ÷åò ìîäóëà òîêà èç ïîêàçàíèé äâóõ ôàç */
/********************************************************************/
float im_calc(float ia,float ib)
{
float isa,isb;
isa = - 1.5 * (ia + ib);
isb = COSPi6 * (ia - ib);
return (2*sqrt(isa*isa+isb*isb)/3);
}
interrupt void cpu_timer1_isr_SENS(void)
{
static unsigned int
count_blink=0, count_bright=0, count_mode,
blink_over, blink_alarm, work_lamp, heat_lamp, errr_lamp;
static int preTest;
EALLOW;
CpuTimer1.InterruptCount++;
IER |= M_INT13; // Set "global" priority
IER &= MINT13; // Set "global" priority
EINT;
EDIS; // This is needed to disable write to EALLOW protected registers
if(!cReset) ServiceDog();
if(Read_Log) return;
if(++CanPowse >= CANPOWSE)
{
CanPowse = 0;
CanGO = 1;
}
if((!sig.bit.Error)|(cTestLamp)) toggle_READY();
else set_READY();
if(++count_bright >= maximum_bright)
{
count_bright = 0 ;
if(work_lamp) GpioDataRegs.GPBCLEAR.bit.GPIO60=1;
else GpioDataRegs.GPBSET.bit.GPIO60=1;
if(heat_lamp) GpioDataRegs.GPBCLEAR.bit.GPIO58=1;
else GpioDataRegs.GPBSET.bit.GPIO58=1;
if(errr_lamp) GpioDataRegs.GPBCLEAR.bit.GPIO62=1;
else GpioDataRegs.GPBSET.bit.GPIO62=1;
}
if(count_bright == Brightness)
if(!cTestLamp)
{
GpioDataRegs.GPBSET.bit.GPIO60=1;
GpioDataRegs.GPBSET.bit.GPIO58=1;
GpioDataRegs.GPBSET.bit.GPIO62=1;
}
if(cTestLamp & !preTest)
{
count_blink = period_blink;
count_mode = 0;
}
preTest = cTestLamp;
if(++count_blink >= period_blink)
{
count_blink=0;
count_mode++;
blink_over = (count_mode & 1)?1:0;
blink_alarm = (count_mode & 7)?1:0;
GpioDataRegs.GPBTOGGLE.bit.GPIO63=1;
/* ýòî ÷òîá äîñêó òåñòèòü
if(cTestLamp)
{GpioDataRegs.GPBTOGGLE.bit.GPIO49=1;
toggle_READY();
GpioDataRegs.GPBTOGGLE.bit.GPIO52=1;}
*/
}
if(cExtLamp)
{
work_lamp = cExtLite;
heat_lamp = cExtLite;
errr_lamp = cExtLite;
}
else
{
if(cTestLamp)
{
work_lamp = blink_over;
heat_lamp = blink_over;
errr_lamp = blink_over;
}
else
{
if(sig.bit.Error) work_lamp = 0;//blink_over;
// else if(sig.bit.Alarm) work_lamp = blink_alarm;
else work_lamp = 1;
if(sig.bit.OverHeat) heat_lamp = 1;
else if(sig.bit.SubHeat) heat_lamp = blink_over;
else if(sig.bit.OutHeat) heat_lamp = !blink_alarm;
else heat_lamp = 0;
} } }
void Init_sensors()
{
int i;
period_blink = READY_FREQ;
time_1_5sec = (3 * ADC_FREQ) / 2;
time_5msec = (5 * ADC_FREQ) / 1000;
time_5sec = (5 * ADC_FREQ);
for(i=0;i<24;i++)
{
sens_type[i]=0;
sens_pair[i]=i;
}
for(i=0;i<12;i++)
sens_type[i]=TERMO_AD;
for(i=0;i<40;i++) filter[i] = def_FILTERBAT;
for(i=0;i<24;i++) modbus[i] &= NOER;
MAX_TPL_CANAL = 12;
}
void Init_packMask()
{
int i,j;
for(i=0;i<2;i++)
for(j=0;j<8;j++) { Maska[i][j]=0; }
for(i=0;i<24;i++)
if(sens_type[i])
{
Maska[m_FAST][ i /16]|=(1<<( i %16));
Maska[m_FAST][(i+24)/16]|=(1<<((i+24)%16));
}
for(i=0;i<3; i++)
Maska[m_SLOW][i+3] = Maska[m_FAST][i]; // Óñòàâêè
Maska[m_FAST][1]|=0x0080; // Äèñêðåòíûå âõîäû
Maska[m_SLOW][6] = 0x0070; // ßðêîñòü ëàìï, ïåðèîä ïîñûëîê
Maska[m_SLOW][7]|= 0xE000; // Àäðåñ, êîìàíäû, è ÷òîá íå âûëàçèëî
}
int er_anal(int term, long * count, int edge, int pre)
{
if (term)
{
if((*count)>=edge) return 1;
(*count)++; return pre;
}
if( (*count) == 0 ) return 0;
(*count)--; return pre;
}
void reset_errs(int sens, ERROR er)
{
unsigned int set;
ERROR err;
err=er;
if(!sens_error[sens].bit.Latch)
{
set = sens_error[sens].all & NOER;
sens_error[sens].all = err.all | set;
}
else
{
sens_error[sens].all |= err.all;
}
sens_error[sens].bit.Ready = !(err.bit.Stop && (!sens_error[sens].bit.Ignor));
chk.bit.Error|= !(sens_error[sens].bit.Ready);
}
void Temper_count(int chan)
{
float Numb;
int Temper;
int no_ignor;
ERROR error;
if(!chan)
{
sig.all = chk.all;
chk.all = 0;
}
if(chan<MAX_TPL_CANAL*2)
if(sens_error[chan].bit.Bypas)
{
sens_error[chan].all = 0;
sens_error[chan].bit.Bypas = 1;
sens_data[chan] = 0;
return;
}
Numb = ADC_table[chan];
if(cTermoCal)
{
sens_data[chan] = Numb;
return; // øòîáû ñòðóêòóðà îøèáîê íå âëåçàëà â äàííûå
}
error.all = 0;
no_ignor = !sens_error[chan].bit.Ignor;
Numb = (Numb-adc0[chan])*tmpK[chan]+tmp0[chan]-273;
if(Numb < -20) Numb = -20;
if(Numb > 200) Numb = 200;
Temper = sens_data[chan] = calres[chan] = (int)(Numb*10);
// Îáðûâ èëè íåèñïðàâíîñòü
if(Temper<=-200 || Temper>=2000)
{
error.bit.Tear = 1;
chk.bit.OutHeat = no_ignor;
}
if(!error.bit.Tear)
{
if(((Temper>sens_hi_edge[chan]-Cooling) && (sens_error[chan].bit.Hyper)) ||
(Temper>sens_hi_edge[chan]) )
{
error.bit.Hyper = 1;
error.bit.Stop = no_ignor;
chk.bit.OverHeat= no_ignor;
}
else
// Ïðåäóïðåæäåíèå ïî òåìïåðàòóðå
if(Temper>sens_lo_edge[chan])
{
error.bit.Over = 1;
chk.bit.SubHeat = no_ignor;
} }
reset_errs(chan,error);
}