Dmitry Kovalev
/
LG
n
Fork of LG by
Diff: ThermoCalc.c
- Revision:
- 21:bc8c1cec3da6
- Parent:
- 1:f2adcae3d304
diff -r 18e3fd7b92d0 -r bc8c1cec3da6 ThermoCalc.c --- a/ThermoCalc.c Tue Feb 02 17:14:25 2016 +0000 +++ b/ThermoCalc.c Wed Feb 03 07:19:30 2016 +0000 @@ -2,292 +2,271 @@ #define debug #define TEMP_AVER_PERIOD 4 // e. number of seconds for average - int TermoCompens_Sum = 0; +int TermoCompens_Sum = 0; unsigned int IsHeating; - //int Tmp_Out[NUM_OF_THERMOSENS]; - int dThermoHeatDeltaPer_dTermo[TERMO_FUNC_SIZE]; - int dThermoCoolDeltaPer_dTermo[TERMO_FUNC_SIZE]; - int dFuncPer_dTermo[TERMO_FUNC_SIZE]; - int TermoCompDelta; - int Temp_Aver; //e. the mean temperature for 1 Sec for T4 sensor //r. ������� ����������� �� 1 ������� ��� ������� T4 - int TempEvolution = 0; - int StartTermoCompens = 0; //e. initial thermocompensation (in XXX seconds after start ) //r. ��������� ���������������� (����� ��� ������ ����� ������) +//int Tmp_Out[NUM_OF_THERMOSENS]; +int dThermoHeatDeltaPer_dTermo[TERMO_FUNC_SIZE]; +int dThermoCoolDeltaPer_dTermo[TERMO_FUNC_SIZE]; +int dFuncPer_dTermo[TERMO_FUNC_SIZE]; +int TermoCompDelta; +int Temp_Aver; //e. the mean temperature for 1 Sec for T4 sensor //r. средняя температура за 1 секунду для датчика T4 +int TempEvolution = 0; +int StartTermoCompens = 0; //e. initial thermocompensation (in XXX seconds after start ) //r. начальная термокомпенсация (через ХХХ секунд после старта) -extern int WP_reset_heating; //e. voltage of reset at heating //r. ���������� ������ ��� ���������� -extern int WP_reset_cooling; //e. voltage of reset at cooling //r. ���������� ������ ��� ���������� +extern int WP_reset_heating; //e. voltage of reset at heating //r. напряжение сброса при нагревании +extern int WP_reset_cooling; //e. voltage of reset at cooling //r. напряжение сброса при охлаждении __inline Max_Saturation(unsigned *lvl, unsigned limit) { - if (*lvl>limit) *lvl = limit; + if (*lvl>limit) *lvl = limit; } /*{ - switch (Device_blk.Str.TermoMode) //e. selecting thermocompensation mode //r. ����� ������ ���������������� + switch (Device_blk.Str.TermoMode) //e. selecting thermocompensation mode //r. выбор режима термокомпенсации { case TERMO_ON: case TERMO_ON_NUMB_OFF: - TermoCompens_Sum += StartTermoCompens + DynamicDeltaCalc(); //e. accumulation of the value of thermocompensation from request to request //r. ���������� �������� ���������������� �� ������� �� ������� + TermoCompens_Sum += StartTermoCompens + DynamicDeltaCalc(); //e. accumulation of the value of thermocompensation from request to request //r. накопление величины термокомпенсации от запроса до запроса break; - + case TERMO_ON_STATIC_ONLY: case TERMO_ON_STATIC_ONLY_NUMB_OFF: #if !defined debug_SOI - TermoCompens_Sum += StartTermoCompens; //e. accumulation of the value of thermocompensation from request to request //r. ���������� �������� ���������������� �� ������� �� ������� + TermoCompens_Sum += StartTermoCompens; //e. accumulation of the value of thermocompensation from request to request //r. накопление величины термокомпенсации от запроса до запроса #endif break; - + case TERMO_ON_DYNAMIC_ONLY: case TERMO_ON_DYNAMIC_ONLY_NUMB_OFF: #if !defined debug_SOI - TermoCompens_Sum += DynamicTermoCompens(); //e. accumulation of the value of thermocompensation from request to request //r. ���������� �������� ���������������� �� ������� �� ������� + TermoCompens_Sum += DynamicTermoCompens(); //e. accumulation of the value of thermocompensation from request to request //r. накопление величины термокомпенсации от запроса до запроса #endif break; - + case TERMO_OFF: default: - TermoCompens_Sum = 0; //e. thermocompensation is disable, therefore its part is equal to zero //r. ���������������� ���������, ������� �� ����� ����� ���� + TermoCompens_Sum = 0; //e. thermocompensation is disable, therefore its part is equal to zero //r. термокомпенсация выключена, поэтому ее вклад равен нулю } //of thermomode switch } */ /****************************************************************************** ** Function name: StaticTermoCompens ** -** Descriptions: Procedure of +** Descriptions: Procedure of ** -** parameters: None -** Returned value: None -** +** parameters: None +** Returned value: None +** ******************************************************************************/ -int StaticTermoCompens(int temperature) //r. ������ ����������� ������������ ���������������� �� ���� ������ ������� (100 ���) +int StaticTermoCompens(int temperature) //r. расчет статической составляющей термокомпенсации за один период прибора (100 мкс) { - float TermoCompens_Curr; //r. �������� ���������������� �� ���� ������ ������� (100 ���) + float TermoCompens_Curr; //r. величина термокомпенсации за один период прибора (100 мкс) + + int i, t; - int i, t; - - //r. ���������� ������ ����������� TSENS_NUMB - //r. ��� ����� �������������: T4, ��� ������: T1 - //r. � ���������� �������-����������� ���������������� - - //r. Tmp_Out[TSENS_NUMB] = 8960; //-2560; //5120; //8000; // -2600; //-5000; + //r. используем только термодатчик TSENS_NUMB + //r. для новых термодатчиков: T4, для старых: T1 + //r. и используем кусочно-непрерывную термокомпенсацию + + //r. Tmp_Out[TSENS_NUMB] = 8960; //-2560; //5120; //8000; // -2600; //-5000; + + t = temperature; + if(t > Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1]) { + t = Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1]; + } - t = temperature; - if(t > Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1]) - { - t = Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1]; - } - - i = 0; - while( t > Device_blk.Str.TemperInt[i] ) i++; + i = 0; + while( t > Device_blk.Str.TemperInt[i] ) i++; - //r. Tmp_Out[5] = i; - TermoCompens_Curr = Device_blk.Str.TermoFunc[i] - dFuncPer_dTermo[i] * (float)( Device_blk.Str.TemperInt[i] - t ); + //r. Tmp_Out[5] = i; + TermoCompens_Curr = Device_blk.Str.TermoFunc[i] - dFuncPer_dTermo[i] * (float)( Device_blk.Str.TemperInt[i] - t ); - //r. ������� - //r. TermoCompens_Curr = 1.111111125; // ������� - //r.TermoCompens_Curr = // 0.25; // �� 1 ��� ������������� 2500 ��������� - /*r. - //0.000100; // �����., ��� ������� �� 1 ��� ������������� 1 ������� - //1.0001; // �����., ��� ������� �� 1 ��� ������������� 10001 ������� - // 0.000125; // �����., ��� ������� �� 1 ��� ������������� 1.25 �������� (�� 100 ��������� 122 ���.???) - // 0.000105; // �� 100 ��� �.������������� 105 ���., ������. 103??? - */ + //r. Отладка + //r. TermoCompens_Curr = 1.111111125; // отладка + //r.TermoCompens_Curr = // 0.25; // за 1 сек накапливается 2500 импульсов + /*r. + //0.000100; // коэфф., при котором за 1 сек накапливается 1 импульс + //1.0001; // коэфф., при котором за 1 сек накапливается 10001 импульс + // 0.000125; // коэфф., при котором за 1 сек накапливается 1.25 импульса (за 100 выводится 122 имп.???) + // 0.000105; // за 100 сек д.накапливаться 105 имп., накапл. 103??? + */ - // TermoCompens_Curr = LONG_2_FRACT_14_18(TermoCompens_Curr); //r. TermoCompens_Curr ��������� � ������ 14.18 + // TermoCompens_Curr = LONG_2_FRACT_14_18(TermoCompens_Curr); //r. TermoCompens_Curr переводим в формат 14.18 - return TermoCompens_Curr; + return TermoCompens_Curr; } // StaticTermoCompens /****************************************************************************** ** Function name: DynamicDeltaCalc ** -** Descriptions: Procedure of +** Descriptions: Procedure of ** -** parameters: None -** Returned value: Thermocompensation addition -** +** parameters: None +** Returned value: Thermocompensation addition +** ******************************************************************************/ -int DynamicDeltaCalc() //e. calculation the addition termocompensation for 1 reset //r. ������ ������� ���������������� �� ���� ��������� +int DynamicDeltaCalc() //e. calculation the addition termocompensation for 1 reset //r. расчет добавки термокомпенсации на одно обнуление { - int i, t; + int i, t; + + t = Temp_Aver; - t = Temp_Aver; + if (IsHeating) { + if(t > Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]) { + t = Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]; + } + + i = 0; + while( t > Device_blk.Str.TemperIntDyn[i] ) i++; - if (IsHeating) - { - if(t > Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]) - { - t = Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]; - } - - i = 0; - while( t > Device_blk.Str.TemperIntDyn[i] ) i++; - - TermoCompDelta = ( Device_blk.Str.ThermoHeatDelta[i] - dThermoHeatDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperIntDyn[i] - t ) ); + TermoCompDelta = ( Device_blk.Str.ThermoHeatDelta[i] - dThermoHeatDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperIntDyn[i] - t ) ); + } else { + if(t > Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]) { + t = Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]; + } + + i = 0; + while( t > Device_blk.Str.TemperCoolIntDyn[i] ) i++; + + TermoCompDelta = ( Device_blk.Str.ThermoCoolDelta[i] - dThermoCoolDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperCoolIntDyn[i] - t ) ); } - else - { - if(t > Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]) - { - t = Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]; - } - - i = 0; - while( t > Device_blk.Str.TemperCoolIntDyn[i] ) i++; - - TermoCompDelta = ( Device_blk.Str.ThermoCoolDelta[i] - dThermoCoolDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperCoolIntDyn[i] - t ) ); - } - return TermoCompDelta; + return TermoCompDelta; } // DynamicDeltaCalc /****************************************************************************** ** Function name: clc_ThermoSensors ** -** Descriptions: Procedure of calculating of the normalized temperaturre vector +** Descriptions: Procedure of calculating of the normalized temperaturre vector ** -** parameters: None -** Returned value: None -** +** parameters: None +** Returned value: None +** ******************************************************************************/ -void clc_ThermoSensors(void) +void clc_ThermoSensors(void) { - unsigned i; - static int TS_sum = 0; - static int seconds_aver = 0, TenSeconds = 0; - static int Temp_AverPrevDynCalc = -7000; - static int StartRdy = 1; - static int PrevTemp = -7000; + unsigned i; + static int TS_sum = 0; + static int seconds_aver = 0, TenSeconds = 0; + static int Temp_AverPrevDynCalc = -7000; + static int StartRdy = 1; + static int PrevTemp = -7000; - for (i=0; i<2; i++) - { - //e. conversion of temperature values on ADC output //r. �������������� �������� ����������� �� ������ ��� - //e. to range -32768 .. +32767 ( additional code; format 1.15 ) //r. � ��������� -32768 .. +32767 (��������. ���; ������ 1.15) - /* Output.Str.Tmp_Out[i] = mac_r(Device_blk.Str.Tmp_bias[i] << 16, - (Input.StrIn.Tmp_in[i] - 0x8000), - Device_blk.Str.Tmp_scal[i]);*/ - Output.Str.Tmp_Out[i+4] = Input.StrIn.Tmp_in[i]; - } + for (i=0; i<2; i++) { + //e. conversion of temperature values on ADC output //r. преобразование значений температуры на выходе АЦП + //e. to range -32768 .. +32767 ( additional code; format 1.15 ) //r. к диапазону -32768 .. +32767 (дополнит. код; формат 1.15) + /* Output.Str.Tmp_Out[i] = mac_r(Device_blk.Str.Tmp_bias[i] << 16, + (Input.StrIn.Tmp_in[i] - 0x8000), + Device_blk.Str.Tmp_scal[i]);*/ + Output.Str.Tmp_Out[i+4] = Input.StrIn.Tmp_in[i]; + } - if (time_1_Sec == DEVICE_SAMPLE_RATE_uks) //r. ������� 1 ������� - { - seconds_aver++; - } + if (time_1_Sec == DEVICE_SAMPLE_RATE_uks) { //r. истекла 1 секунда + seconds_aver++; + } - if (seconds_aver > TEMP_AVER_PERIOD) //r. ������� TEMP_AVER_PERIOD(4 �������) ������ - { - seconds_aver = 0; - TenSeconds++; - PrevTemp = Temp_Aver; //e. save the previous mean temperature for 1 Sec //r. ���������� ���������� ������� ����������� �� ������� - Temp_Aver = TS_sum / (DEVICE_SAMPLE_RATE_HZ * TEMP_AVER_PERIOD); //e. calculating mean temperature for 1 Sec //r. ��������� ������� ����������� �� ������� + if (seconds_aver > TEMP_AVER_PERIOD) { //r. истекли TEMP_AVER_PERIOD(4 секунды) секунд + seconds_aver = 0; + TenSeconds++; + PrevTemp = Temp_Aver; //e. save the previous mean temperature for 1 Sec //r. запоминаем предыдущую среднюю температуру за секунду + Temp_Aver = TS_sum / (DEVICE_SAMPLE_RATE_HZ * TEMP_AVER_PERIOD); //e. calculating mean temperature for 1 Sec //r. вычисляем среднюю температуру за секунду - if (Temp_Aver > PrevTemp) - { - TempEvolution++; - } - if (Temp_Aver < PrevTemp) - { - TempEvolution--; - } + if (Temp_Aver > PrevTemp) { + TempEvolution++; + } + if (Temp_Aver < PrevTemp) { + TempEvolution--; + } + + TS_sum = 0; //e. reset the sum for calculation of an mean //r. обнуляем сумму для вычисления среднего + } else { + TS_sum += Output.Str.Tmp_Out[TSENS_NUMB]; + } - TS_sum = 0; //e. reset the sum for calculation of an mean //r. �������� ����� ��� ���������� �������� - } - else - { - TS_sum += Output.Str.Tmp_Out[TSENS_NUMB]; - } - - if (TenSeconds == 10) // 10 * TEMP_AVER_PERIOD = 40 - { - TenSeconds = 0; - if (TempEvolution > 0) - { - IsHeating = 1; - } - - if (TempEvolution < 0) - { - IsHeating = 0; - } - TempEvolution = 0; - } + if (TenSeconds == 10) { // 10 * TEMP_AVER_PERIOD = 40 + TenSeconds = 0; + if (TempEvolution > 0) { + IsHeating = 1; + } + + if (TempEvolution < 0) { + IsHeating = 0; + } + TempEvolution = 0; + } - //e. single calculaiton of some device parameters (measurement on the VALID_START_SEC second after start) //r. ����������� ������ ��������� ���������� ������� (��������� �� VALID_START_SEC ������� ����� ������) - if (StartRdy) - { - if (TenSeconds > VALID_START_4SEC) - { + //e. single calculaiton of some device parameters (measurement on the VALID_START_SEC second after start) //r. однократный расчет некоторых параметров прибора (измерение на VALID_START_SEC секунде после старта) + if (StartRdy) { + if (TenSeconds > VALID_START_4SEC) { + + StartRdy = 0; //r. самоблокировка, поэтому больше сюда не заходим + + if ((Device_blk.Str.TermoMode != TERMO_OFF) && \ + (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY) && \ + (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY_NUMB_OFF)) { //r. статическая термокомпенсация включена + //r. расчет статической термокомпенсации числа + StartTermoCompens = StaticTermoCompens(Temp_Aver); //r. стартовая температуры прибора + } + DynamicDeltaCalc(); - StartRdy = 0; //r. ��������������, ������� ������ ���� �� ������� - - if ((Device_blk.Str.TermoMode != TERMO_OFF) && \ - (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY) && \ - (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY_NUMB_OFF)) //r. ����������� ���������������� �������� - { - //r. ������ ����������� ���������������� ����� - StartTermoCompens = StaticTermoCompens(Temp_Aver); //r. ��������� ����������� ������� - } - DynamicDeltaCalc(); - - //r. ������ ������ ��� ������� ������������, ���������� �� ��������� ����������� - // DithFreqRangeCalc(); + //r. расчет границ для частоты вибропривода, зависящего от стартовой температуры + // DithFreqRangeCalc(); + + //r. коэффициенты для полосового фильтра квази ДУП не пересчитываем: считаем, что полоса фильтра заведомо шире + - //r. ������������ ��� ���������� ������� ����� ��� �� �������������: �������, ��� ������ ������� �������� ���� + //r. напряжение сброса при нагревании + WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal); + //e. voltage of reset at cooling //r. напряжение сброса при охлаждении + WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal); + } + } - - //r. ���������� ������ ��� ���������� - WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal); - //e. voltage of reset at cooling //r. ���������� ������ ��� ���������� - WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal); - } - } + if ( abs(Temp_Aver - Temp_AverPrevDynCalc) > Device_blk.Str.DeltaTempRecalc) { + Temp_AverPrevDynCalc = Temp_Aver; + DynamicDeltaCalc(); + }//r. расчет средней за 1 секунду температуры датчиков T4, T5 - if ( abs(Temp_Aver - Temp_AverPrevDynCalc) > Device_blk.Str.DeltaTempRecalc) - { - Temp_AverPrevDynCalc = Temp_Aver; - DynamicDeltaCalc(); - }//r. ������ ������� �� 1 ������� ����������� �������� T4, T5 + // cyclic built-in test + if ( (Output.Str.Tmp_Out[4] < TS_MIN) || (Output.Str.Tmp_Out[4] > TS_MAX) || (Output.Str.Tmp_Out[5] < TS_MIN) || (Output.Str.Tmp_Out[5] > TS_MAX) ) { + Valid_Data |= THERMO_RANGE_ERROR; + } - // cyclic built-in test - if ( (Output.Str.Tmp_Out[4] < TS_MIN) || (Output.Str.Tmp_Out[4] > TS_MAX) || (Output.Str.Tmp_Out[5] < TS_MIN) || (Output.Str.Tmp_Out[5] > TS_MAX) ) - { - Valid_Data |= THERMO_RANGE_ERROR; - } - - if ( abs( Output.Str.Tmp_Out[4] - Output.Str.Tmp_Out[5]) > TS_DIFF_MAX) - { - Valid_Data |= THERMO_DIFF_ERROR; - } + if ( abs( Output.Str.Tmp_Out[4] - Output.Str.Tmp_Out[5]) > TS_DIFF_MAX) { + Valid_Data |= THERMO_DIFF_ERROR; + } } // clc_ThermoSensors /****************************************************************************** ** Function name: clc_PLC ** -** Descriptions: Procedure of initial processing for the CPLC regulator +** Descriptions: Procedure of initial processing for the CPLC regulator ** -** parameters: None -** Returned value: None -** +** parameters: None +** Returned value: None +** ******************************************************************************/ -void DithFreqRangeCalc(void) //r. ������ ������ ������������ ������� ��� ������� ������������, ��������� �� ������� ����������� +void DithFreqRangeCalc(void) //r. расчет границ коэффициента деления для частоты вибропривода, зависящих от текущей температуры { - unsigned int min_level, max_level; - int delta_VB_N; - - delta_VB_N = mult_r(Device_blk.Str.K_vb_tu >> DITH_VBN_SHIFT, (Temp_Aver - Device_blk.Str.TemperNormal)); //r.200; - //r. !!! ������� ������������ � ����������, � ����� ����� - min_level = VB_Nmin0 + delta_VB_N; - max_level = VB_Nmax0 + delta_VB_N; - // maximum saturation for unsigned levels - Max_Saturation(&min_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)-1); // min should be always less then max_level by 1 - Max_Saturation(&max_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)); - Device_blk.Str.VB_Nmin = min_level << DITH_VBN_SHIFT; - Device_blk.Str.VB_Nmax = max_level << DITH_VBN_SHIFT; + unsigned int min_level, max_level; + int delta_VB_N; + + delta_VB_N = mult_r(Device_blk.Str.K_vb_tu >> DITH_VBN_SHIFT, (Temp_Aver - Device_blk.Str.TemperNormal)); //r.200; + //r. !!! сделать суммирование с насыщением, а затем сдвиг + min_level = VB_Nmin0 + delta_VB_N; + max_level = VB_Nmax0 + delta_VB_N; + // maximum saturation for unsigned levels + Max_Saturation(&min_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)-1); // min should be always less then max_level by 1 + Max_Saturation(&max_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)); + Device_blk.Str.VB_Nmin = min_level << DITH_VBN_SHIFT; + Device_blk.Str.VB_Nmax = max_level << DITH_VBN_SHIFT; } // DithFreqRange_calc +