matlab_23550/Inu/Src2/main/adc_tools.c
2024-12-27 10:50:32 +03:00

529 lines
16 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// #include "project.h"
#include "adc_tools.h"
// #include "xp_project.h"
#include "IQmathLib.h"
#include "math.h"
#include "my_filter.h"
#include "params.h"
// #include "params_protect.h"
#include "vector.h"
// #include "xp_adc.h"
// #include "TuneUpPlane.h" //Ìîðãàíèå ñâåòîäèîäîì
// #include "log_to_memory.h"
// #include "errors.h"
// #define COUNT_ARR_ADC_BUF 2
#define Shift_Filter 1 //2
#define BTR_ENABLED
#define R_ADC_DEFAULT { 1180 ,1180 , 256, 256, 256, 256, 256, 1180, 1180, 256, 256, 256, 256, 256, 256, 256, 256, 256 }
#define K_LEM_ADC_DEFAULT { 60000,60000,5000, 5000,5000,5000,5000,60000,60000,5000,5000,5000,5000,5000,5000,5000,5000,5000 }
//#define LOG_ACP_TO_BUF
int ADC_f[COUNT_ARR_ADC_BUF][16];
int ADC_sf[COUNT_ARR_ADC_BUF][16];
#define ZERO_ADC_DEFAULT {2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048}
_iq19 iq19_zero_ADC[18] = ZERO_ADC_DEFAULT;
int zero_ADC[18] = ZERO_ADC_DEFAULT;
_iq iq_k_norm_ADC[18];
_iq19 iq19_k_norm_ADC[18];
_iq iq_norm_ADC[18];
unsigned int const R_ADC[18] = R_ADC_DEFAULT;
unsigned int const K_LEM_ADC[18] = K_LEM_ADC_DEFAULT;
//#pragma DATA_SECTION(analog,".fast_vars");
ANALOG_VALUE analog;
//#pragma DATA_SECTION(filter,".fast_vars");
ANALOG_VALUE filter;
ANALOG_RAW_DATA rawData = ANALOG_RAW_DATA_DEFAULT;
_iq koef_Ud_long_filter=0;
_iq koef_Ud_fast_filter=0;
_iq koef_Im_filter=0;
_iq koef_Iabc_filter=0;
_iq koef_Wlong=0;
void calc_norm_ADC(void);
void analog_values_calc(void);
_iq im_calc( _iq ia, _iq ib, _iq ic);
void read_adc(ANALOG_RAW_DATA *data)
{
ADC_f[0][0] = data->U1_1;
ADC_f[0][1] = data->U1_2;
ADC_f[0][2] = data->Izpt1_1;
ADC_f[0][3] = data->Izpt1_2;
ADC_f[0][4] = data->Ia1;
ADC_f[0][5] = data->Ib1;
ADC_f[0][6] = data->Ic1;
ADC_f[0][7] = 0;
ADC_f[0][8] = data->U2_1;
ADC_f[0][9] = data->U2_2;
ADC_f[0][10] = data->Izpt2_1;
ADC_f[0][11] = data->Izpt2_2;
ADC_f[0][12] = data->Ia2;
ADC_f[0][13] = data->Ib2;
ADC_f[0][14] = data->Ic2;
ADC_f[0][15] = 0;
ADC_sf[0][0] += (ADC_f[0][0] - ADC_sf[0][0]) >> Shift_Filter;
ADC_sf[0][1] += (ADC_f[0][1] - ADC_sf[0][1]) >> Shift_Filter;
ADC_sf[0][2] += (ADC_f[0][2] - ADC_sf[0][2]) >> Shift_Filter;
ADC_sf[0][3] += (ADC_f[0][3] - ADC_sf[0][3]) >> Shift_Filter;
ADC_sf[0][4] += (ADC_f[0][4] - ADC_sf[0][4]) >> Shift_Filter;
ADC_sf[0][5] += (ADC_f[0][5] - ADC_sf[0][5]) >> Shift_Filter;
ADC_sf[0][6] += (ADC_f[0][6] - ADC_sf[0][6]) >> Shift_Filter;
ADC_sf[0][7] += (ADC_f[0][7] - ADC_sf[0][7]) >> Shift_Filter;
ADC_sf[0][8] += (ADC_f[0][8] - ADC_sf[0][8]) >> Shift_Filter;
ADC_sf[0][9] += (ADC_f[0][9] - ADC_sf[0][9]) >> Shift_Filter;
ADC_sf[0][10] += (ADC_f[0][10] - ADC_sf[0][10]) >> Shift_Filter;
ADC_sf[0][11] += (ADC_f[0][11] - ADC_sf[0][11]) >> Shift_Filter;
ADC_sf[0][12] += (ADC_f[0][12] - ADC_sf[0][12]) >> Shift_Filter;
ADC_sf[0][13] += (ADC_f[0][13] - ADC_sf[0][13]) >> Shift_Filter;
ADC_sf[0][14] += (ADC_f[0][14] - ADC_sf[0][14]) >> Shift_Filter;
ADC_sf[0][15] += (ADC_f[0][15] - ADC_sf[0][15]) >> Shift_Filter;
ADC_f[1][0] = 0;
ADC_f[1][1] = 0;
ADC_f[1][2] = 0;
ADC_f[1][3] = 0;
ADC_sf[1][0] += (ADC_f[1][0] - ADC_sf[1][0]) >> Shift_Filter;
ADC_sf[1][1] += (ADC_f[1][1] - ADC_sf[1][1]) >> Shift_Filter;
ADC_sf[1][2] += (ADC_f[1][2] - ADC_sf[1][2]) >> Shift_Filter;
ADC_sf[1][3] += (ADC_f[1][3] - ADC_sf[1][3]) >> Shift_Filter;
}
void acp_Handler(void)
{
// read_adc();
calc_norm_ADC();
analog_values_calc();
// Read_Fast_Errors();
}
#define COUNT_DETECT_ZERO 500
// void detect_zero_analog()
// {
// int i, k;
// double tmp_buff[2][16] = {0};
// // _iq koef_zero_ADC_filter = 1;
// for(i = 0; i < 16; tmp_buff[0][i++] = 0);
// for(i = 0; i < 16; tmp_buff[1][i++] = 0);
// i = 0;
// for (i = 0; i<COUNT_DETECT_ZERO; i++)
// {
// read_adc();
// for(k = 2; k < 15; k++)
// {
// if((k == 7) || (k == 8))
// {
// continue;
// }
// tmp_buff[0][k] += ADC_f[0][k];
// }
// for(k = 0;k < 4; k++)
// {
// tmp_buff[1][k] += ADC_f[1][k];
// }
// pause_1000(1000);
// }
// k = 2;
// for(i = 2; i < 15; i++)
// {
// if(i == 7)
// {
// continue;
// }
// if((i == 8) || (i == 9))
// {
// k++;
// continue;
// }
// zero_ADC[k] = (int)(tmp_buff[0][i] / COUNT_DETECT_ZERO + 0.5);
// k++;
// }
// for(i = 0; i < 4; i++, k++)
// {
// zero_ADC[k] = (int)(tmp_buff[1][i] / COUNT_DETECT_ZERO + 0.5);
// }
// zero_ADC[0] = zero_ADC[2];
// zero_ADC[1] = zero_ADC[2];
// zero_ADC[7] = zero_ADC[9];
// zero_ADC[8] = zero_ADC[9];
// }
void init_Adc_Variables(void)
{
unsigned int k;
int *panalog, *pfilter;
for (k=0;k<16;k++)
{
ADC_f[0][k]=0;
ADC_sf[0][k]=0;
ADC_f[1][k]=0;
ADC_sf[1][k]=0;
}
// detect_zero_analog();
for (k=0;k<18;k++)
{
iq19_k_norm_ADC[k] = _IQ19(K_LEM_ADC[k]*250.0/R_ADC[k]/NORMA_ACP/4096.0);
iq19_zero_ADC[k]=_IQ19(zero_ADC[k]); //_IQ19(2030);//_IQ19(1770);
}
koef_Ud_long_filter = _IQ(0.05);
koef_Ud_fast_filter = _IQ(0.2); // _IQ(0.001/0.00931); //_IQ(0.001/0.00131);
koef_Im_filter = _IQ(0.015);
koef_Iabc_filter = _IQ(0.0005); //_IQ(0.002/0.006);
koef_Wlong = _IQ(0.001);
panalog = (int*)&analog;
pfilter = (int*)&filter;
for (k=0;k < sizeof(ANALOG_VALUE) / sizeof(int) ;k++)
{
*(panalog + k) = 0;
*(pfilter + k) = 0;
}
}
inline _iq norma_adc(int plane, int chan, int n_norm)
{
// return _IQ19toIQ(_IQ19mpy((iq19_zero_ADC[n_norm] - ((long)ADC_sf[plane][chan]<<19) ),iq19_k_norm_ADC[n_norm]));
// return _IQ19toIQ(_IQ19mpy((((long)ADC_sf[plane][chan]<<19) - iq19_zero_ADC[n_norm]),iq19_k_norm_ADC[n_norm]));
return _IQ19toIQ(_IQ19mpy((((long)ADC_sf[plane][chan]<<19)),iq19_k_norm_ADC[n_norm]));
}
void calc_norm_ADC(void)
{
iq_norm_ADC[0] = norma_adc(0, 0, 0);
iq_norm_ADC[1] = norma_adc(0, 1, 1);
iq_norm_ADC[2] = norma_adc(0, 2, 2);
iq_norm_ADC[3] = norma_adc(0, 3, 3);
iq_norm_ADC[4] = norma_adc(0, 4, 4);
iq_norm_ADC[5] = norma_adc(0, 5, 5);
iq_norm_ADC[6] = norma_adc(0, 6, 6);
iq_norm_ADC[7] = norma_adc(0, 8, 7);
iq_norm_ADC[8] = norma_adc(0, 9, 8);
iq_norm_ADC[9] = norma_adc(0, 10, 9);
iq_norm_ADC[10] = norma_adc(0, 11, 10);
iq_norm_ADC[11] = norma_adc(0, 12, 11);
iq_norm_ADC[12] = norma_adc(0, 13, 12);
iq_norm_ADC[13] = norma_adc(0, 14, 13);
iq_norm_ADC[14] = norma_adc(1, 0, 14);
iq_norm_ADC[15] = norma_adc(1, 1, 15);
iq_norm_ADC[16] = norma_adc(1, 2, 16);
iq_norm_ADC[17] = norma_adc(1, 3, 17);
}
void analog_values_calc(void)
{
analog.iqU_1 = iq_norm_ADC[0];
analog.iqU_2 = iq_norm_ADC[1];
analog.iqU_3 = iq_norm_ADC[7];
analog.iqU_4 = iq_norm_ADC[8];
analog.iqIin_1 = iq_norm_ADC[2];
analog.iqIin_2 = -iq_norm_ADC[3];
analog.iqIin_3 = iq_norm_ADC[9];
analog.iqIin_4 = -iq_norm_ADC[10];
// #if PROJECT_ARKTIKA == 1
analog.iqIa1_1 = iq_norm_ADC[4];
analog.iqIb1_1 = iq_norm_ADC[5];
analog.iqIc1_1 = iq_norm_ADC[6];
analog.iqIa2_1 = iq_norm_ADC[11];
analog.iqIb2_1 = iq_norm_ADC[12];
analog.iqIc2_1 = iq_norm_ADC[13];
// #endif
#if PROJECT_SIBERIA == 1
analog.iqIa1_1 = iq_norm_ADC[6];
analog.iqIb1_1 = iq_norm_ADC[5];
analog.iqIc1_1 = iq_norm_ADC[4];
analog.iqIa2_1 = iq_norm_ADC[13];
analog.iqIb2_1 = iq_norm_ADC[12];
analog.iqIc2_1 = iq_norm_ADC[11];
#endif
analog.iqIbtr1_1 = labs(iq_norm_ADC[14]);
analog.iqIbtr1_2 = labs(iq_norm_ADC[16]);
analog.iqIbtr2_1 = labs(iq_norm_ADC[15]);
analog.iqIbtr2_2 = labs(iq_norm_ADC[17]);
analog.iqIa1_rms = exp_regul_iq(koef_Iabc_filter, analog.iqIa1_rms, _IQabs(analog.iqIa1_1));
analog.iqIb1_rms = exp_regul_iq(koef_Iabc_filter, analog.iqIb1_rms, _IQabs(analog.iqIb1_1));
analog.iqIc1_rms = exp_regul_iq(koef_Iabc_filter, analog.iqIc1_rms, _IQabs(analog.iqIc1_1));
analog.iqIa2_rms = exp_regul_iq(koef_Iabc_filter, analog.iqIa2_rms, _IQabs(analog.iqIa2_1));
analog.iqIb2_rms = exp_regul_iq(koef_Iabc_filter, analog.iqIb2_rms, _IQabs(analog.iqIb2_1));
analog.iqIc2_rms = exp_regul_iq(koef_Iabc_filter, analog.iqIc2_rms, _IQabs(analog.iqIc2_1));
filter.iqU_1_long = exp_regul_iq(koef_Ud_long_filter, filter.iqU_1_long, analog.iqU_1);
filter.iqU_2_long = exp_regul_iq(koef_Ud_long_filter, filter.iqU_2_long, analog.iqU_2);
filter.iqU_3_long = exp_regul_iq(koef_Ud_long_filter, filter.iqU_3_long, analog.iqU_3);
filter.iqU_4_long = exp_regul_iq(koef_Ud_long_filter, filter.iqU_4_long, analog.iqU_4);
filter.iqIin_1 = exp_regul_iq(koef_Im_filter, filter.iqIin_1, analog.iqIin_1);
filter.iqIin_2 = exp_regul_iq(koef_Im_filter, filter.iqIin_2, analog.iqIin_2);
filter.iqIin_3 = exp_regul_iq(koef_Im_filter, filter.iqIin_3, analog.iqIin_3);
filter.iqIin_4 = exp_regul_iq(koef_Im_filter, filter.iqIin_4, analog.iqIin_4);
filter.iqU_1_fast = exp_regul_iq(koef_Ud_fast_filter, filter.iqU_1_fast, analog.iqU_1);
filter.iqU_2_fast = exp_regul_iq(koef_Ud_fast_filter, filter.iqU_2_fast, analog.iqU_2);
filter.iqU_3_fast = exp_regul_iq(koef_Ud_fast_filter, filter.iqU_3_fast, analog.iqU_3);
filter.iqU_4_fast = exp_regul_iq(koef_Ud_fast_filter, filter.iqU_4_fast, analog.iqU_4);
filter.iqIa1_1 = exp_regul_iq(koef_Ud_fast_filter, filter.iqIa1_1, analog.iqIa1_1);
filter.iqIb1_1 = exp_regul_iq(koef_Ud_fast_filter, filter.iqIb1_1, analog.iqIb1_1);
filter.iqIc1_1 = exp_regul_iq(koef_Ud_fast_filter, filter.iqIc1_1, analog.iqIc1_1);
filter.iqIa2_1 = exp_regul_iq(koef_Ud_fast_filter, filter.iqIa2_1, analog.iqIa2_1);
filter.iqIb2_1 = exp_regul_iq(koef_Ud_fast_filter, filter.iqIb2_1, analog.iqIb2_1);
filter.iqIc2_1 = exp_regul_iq(koef_Ud_fast_filter, filter.iqIc2_1, analog.iqIc2_1);
analog.iqW1 = _IQmpy(filter.iqU_1_fast, analog.iqIin_1) + _IQmpy(filter.iqU_2_fast, analog.iqIin_2);
analog.iqW2 = _IQmpy(filter.iqU_3_fast, analog.iqIin_3) + _IQmpy(filter.iqU_4_fast, analog.iqIin_4);
analog.iqW = analog.iqW1 + analog.iqW2;
analog.iqIm_1 = im_calc(filter.iqIa1_1, filter.iqIb1_1, filter.iqIc1_1);
analog.iqIm_2 = im_calc(filter.iqIa2_1, filter.iqIb2_1, filter.iqIc2_1);
// i_led1_on_off(0);
// i_led1_on_off(1);
filter.iqIm_1 = exp_regul_iq(koef_Im_filter, filter.iqIm_1, analog.iqIm_1);
filter.iqIm_2 = exp_regul_iq(koef_Im_filter, filter.iqIm_2, analog.iqIm_2);
// filter.iqIm = exp_regul_iq(koef_Iabc_filter, filter.iqIm, filter.iqIm_2);
filter.iqW1 = exp_regul_iq(koef_Iabc_filter, filter.iqW1, analog.iqW1);
filter.iqW2 = exp_regul_iq(koef_Iabc_filter, filter.iqW2, analog.iqW2);
filter.iqW = exp_regul_iq(koef_Wlong, filter.iqW, filter.iqW1 + filter.iqW2);
// filter.iqIin_1 = exp_regul_iq(koef_Im_filter, filter.iqIin_1, analog.iqIin_1);
// filter.iqIin_2 = exp_regul_iq(koef_Im_filter, filter.iqIin_2, analog.iqIin_2);
}
#define CONST_IQ_11PI6 96629827 //11Pi/6
#define CONST_IQ_PI6 8784529 // Pi/6
// _iq err_level_adc_on_go = ERR_LEVEL_ADC_PLUS_6_ON_GO_IQ;
// _iq err_level_adc = ERR_LEVEL_ADC_PLUS_6_IQ;
// unsigned int detect_protect_ACP_plus()
// {
// unsigned int mask = 0, result = 0;
// static unsigned int prev_mask = 0xFCFC;
// if(f.Go)
// {
// mask |= filter.iqU_1_long > err_level_adc_on_go ? 1 : 0;
// mask |= filter.iqU_2_long > err_level_adc_on_go ? 1 << 1: 0;
// }
// else
// {
// mask |= filter.iqU_1_long > err_level_adc ? 1 : 0;
// mask |= filter.iqU_2_long > err_level_adc ? 1 << 1: 0;
// }
// #ifdef NEW_I_ZPT_REZISTORS
// mask |= ADC_sf[0][2] < ERR_LEVEL_I_ZPT_PLUS_REZ_249? 1 << 2: 0;
// mask |= ADC_sf[0][3] < ERR_LEVEL_I_ZPT_PLUS_REZ_249? 1 << 3: 0;
// #else
// mask |= ADC_sf[0][2] < ERR_LEVEL_I_ZPT_PLUS? 1 << 2: 0;
// mask |= ADC_sf[0][3] < ERR_LEVEL_I_ZPT_PLUS? 1 << 3: 0;
// #endif
// mask |= ADC_sf[0][4] < ERR_LEVEL_I_FAZA_PLUS? 1 << 4: 0;
// mask |= ADC_sf[0][5] < ERR_LEVEL_I_FAZA_PLUS? 1 << 5: 0;
// mask |= ADC_sf[0][6] < ERR_LEVEL_I_FAZA_PLUS? 1 << 6: 0;
// if(f.Go)
// {
// mask |= filter.iqU_3_long > err_level_adc_on_go ? 1 << 8: 0;
// mask |= filter.iqU_4_long > err_level_adc_on_go ? 1 << 9: 0;
// }
// else
// {
// mask |= (filter.iqU_3_long > err_level_adc) ? 1 << 8: 0;
// mask |= (filter.iqU_4_long > err_level_adc) ? 1 << 9: 0;
// }
// #ifdef NEW_I_ZPT_REZISTORS
// mask |= ADC_sf[0][10] < ERR_LEVEL_I_ZPT_PLUS_REZ_249? 1 << 10: 0;
// mask |= ADC_sf[0][11] < ERR_LEVEL_I_ZPT_PLUS_REZ_249? 1 << 11: 0;
// #else
// mask |= ADC_sf[0][10] < ERR_LEVEL_I_ZPT_PLUS? 1 << 10: 0;
// mask |= ADC_sf[0][11] < ERR_LEVEL_I_ZPT_PLUS? 1 << 11: 0;
// #endif
// mask |= ADC_sf[0][12] < ERR_LEVEL_I_FAZA_PLUS? 1 << 12: 0;
// mask |= ADC_sf[0][13] < ERR_LEVEL_I_FAZA_PLUS? 1 << 13: 0;
// mask |= ADC_sf[0][14] < ERR_LEVEL_I_FAZA_PLUS? 1 << 14: 0;
// //Calculate values for BTR
// #ifdef BTR_ENABLED
// mask |= ADC_sf[1][0] < ERR_LEVEL_BREAK_REZ? 1 << 7: 0; //BTR1pos
// mask |= ADC_sf[1][2] < ERR_LEVEL_BREAK_REZ? 1 << 15: 0; //BTR1neg
// #endif //BTR_ENABLED
// /* */
// result = mask & prev_mask;
// prev_mask |= mask; //
// //
// if(mask == 0) { prev_mask = 0xFFFF;}
// return result;
// }
// unsigned int detect_protect_ACP_minus()
// {
// unsigned int mask = 0, result = 0;
// static unsigned int prev_mask = 0xFCFC; //
// /* */
// if(f.Ready2)
// {
// // mask |= (ADC_sf[0] > ERR_LEVEL_ADC_MINUS_6) ? 1: 0;
// // mask |= (ADC_sf[1] > ERR_LEVEL_ADC_MINUS_6) ? 1 << 1: 0;
// }
// #ifdef NEW_I_ZPT_REZISTORS
// mask |= (ADC_sf[0][2] > ERR_LEVEL_I_ZPT_MINUS_REZ_249)? 1 << 2: 0;
// mask |= (ADC_sf[0][3] > ERR_LEVEL_I_ZPT_MINUS_REZ_249)? 1 << 3: 0;
// #else
// mask |= (ADC_sf[0][2] < ERR_LEVEL_I_ZPT_PLUS)? 1 << 2: 0;
// mask |= (ADC_sf[0][3] < ERR_LEVEL_I_ZPT_PLUS)? 1 << 3: 0;
// #endif
// mask |= ADC_sf[0][4] > ERR_LEVEL_I_FAZA_MINUS? 1 << 4: 0;
// mask |= ADC_sf[0][5] > ERR_LEVEL_I_FAZA_MINUS? 1 << 5: 0;
// mask |= ADC_sf[0][6] > ERR_LEVEL_I_FAZA_MINUS? 1 << 6: 0;
// /* */
// /* if(f.Ready2)
// {
// mask |= (ADC_sf[0][7] > ERR_LEVEL_ADC_MINUS_6) ? 1 << 8: 0;
// mask |= (ADC_sf[0][8] > ERR_LEVEL_ADC_MINUS_6) ? 1 << 9: 0;
// } */
// #ifdef NEW_I_ZPT_REZISTORS
// mask |= ADC_sf[0][10] > ERR_LEVEL_I_ZPT_MINUS_REZ_249? 1 << 10: 0;
// mask |= ADC_sf[0][11] > ERR_LEVEL_I_ZPT_MINUS_REZ_249? 1 << 11: 0;
// #else
// mask |= ADC_sf[0][10] < ERR_LEVEL_I_ZPT_PLUS? 1 << 10: 0;
// mask |= ADC_sf[0][11] < ERR_LEVEL_I_ZPT_PLUS? 1 << 11: 0;
// #endif
// mask |= ADC_sf[0][12] > ERR_LEVEL_I_FAZA_MINUS? 1 << 12: 0;
// mask |= ADC_sf[0][13] > ERR_LEVEL_I_FAZA_MINUS? 1 << 13: 0;
// mask |= ADC_sf[0][14] > ERR_LEVEL_I_FAZA_MINUS? 1 << 14: 0;
// //Calculate values for BTR
// #ifdef BTR_ENABLED
// mask |= ADC_sf[1][1] < ERR_LEVEL_BREAK_REZ? 1 << 7: 0; //BTR2pos
// mask |= ADC_sf[1][3] < ERR_LEVEL_BREAK_REZ? 1 << 15: 0; //BTR2neg
// #endif //BTR_ENABLED
// /* */
// result = mask & prev_mask;
// prev_mask |= mask; //
// //
// if(mask == 0) { prev_mask = 0xFFFF;}
// return result;
// }
// #pragma CODE_SECTION(fillADClogs,".fast_run");
// void fillADClogs(void)
// {
// logpar.log1 = (int16)_IQtoIQ15(analog.iqU_1);
// logpar.log2 = (int16)_IQtoIQ15(analog.iqU_2);
// logpar.log3 = (int16)_IQtoIQ15(analog.iqIin_1);
// logpar.log4 = (int16)_IQtoIQ15(analog.iqIin_2);
// logpar.log5 = (int16)_IQtoIQ15(analog.iqIa1_1);
// logpar.log6 = (int16)_IQtoIQ15(analog.iqIb1_1);
// logpar.log7 = (int16)_IQtoIQ15(analog.iqIc1_1);
// logpar.log8 = (int16)_IQtoIQ15(analog.iqU_3);
// logpar.log9 = (int16)_IQtoIQ15(analog.iqU_4);
// logpar.log10 = (int16)_IQtoIQ15(analog.iqIin_3);
// logpar.log11 = (int16)_IQtoIQ15(analog.iqIin_4);
// logpar.log12 = (int16)_IQtoIQ15(analog.iqIa2_1);
// logpar.log13 = (int16)_IQtoIQ15(analog.iqIb2_1);
// logpar.log14 = (int16)_IQtoIQ15(analog.iqIc2_1);
// // logpar.log15 = (int16)_IQtoIQ15(filter.iqU_1_fast);
// // logpar.log16 = (int16)_IQtoIQ15(filter.iqU_1_long);
// }
/********************************************************************/
/* Расчет модулy тока из показаний трех фаз */
/********************************************************************/
_iq SQRT_32 = _IQ(0.8660254037844);
_iq CONST_23 = _IQ(2.0/3.0);
_iq CONST_15 = _IQ(1.5);
_iq im_calc( _iq ia, _iq ib, _iq ic)
{
_iq isa,isb, t;
isa = _IQmpy(CONST_15,ia);
isb = _IQmpy(SQRT_32,ib-ic );
// ( _IQ19mpy(SQRT_32, _IQ15toIQ19(ib)) - _IQ15mpy(SQRT_32, _IQ15toIQ19(ic)) );
// t = _IQmag(isa,isb);
t = _IQsqrt(_IQmpy(isa, isa) + _IQmpy(isb, isb));
t = _IQmpy(CONST_23,t);
return (t);
}