Dmitry Kovalev
/
LG
n
Fork of LG by
Embed:
(wiki syntax)
Show/hide line numbers
ThermoCalc.c
00001 #include "Global.h" 00002 00003 #define debug 00004 #define TEMP_AVER_PERIOD 4 // e. number of seconds for average 00005 int TermoCompens_Sum = 0; 00006 unsigned int IsHeating; 00007 //int Tmp_Out[NUM_OF_THERMOSENS]; 00008 int dThermoHeatDeltaPer_dTermo[TERMO_FUNC_SIZE]; 00009 int dThermoCoolDeltaPer_dTermo[TERMO_FUNC_SIZE]; 00010 int dFuncPer_dTermo[TERMO_FUNC_SIZE]; 00011 int TermoCompDelta; 00012 int Temp_Aver; //e. the mean temperature for 1 Sec for T4 sensor //r. средняя температура за 1 секунду для датчика T4 00013 int TempEvolution = 0; 00014 int StartTermoCompens = 0; //e. initial thermocompensation (in XXX seconds after start ) //r. начальная термокомпенсация (через ХХХ секунд после старта) 00015 00016 extern int WP_reset_heating; //e. voltage of reset at heating //r. напряжение сброса при нагревании 00017 extern int WP_reset_cooling; //e. voltage of reset at cooling //r. напряжение сброса при охлаждении 00018 00019 __inline Max_Saturation(unsigned *lvl, unsigned limit) 00020 { 00021 if (*lvl>limit) *lvl = limit; 00022 } 00023 00024 /*{ 00025 switch (Device_blk.Str.TermoMode) //e. selecting thermocompensation mode //r. выбор режима термокомпенсации 00026 { 00027 case TERMO_ON: 00028 case TERMO_ON_NUMB_OFF: 00029 00030 TermoCompens_Sum += StartTermoCompens + DynamicDeltaCalc(); //e. accumulation of the value of thermocompensation from request to request //r. накопление величины термокомпенсации от запроса до запроса 00031 00032 break; 00033 00034 case TERMO_ON_STATIC_ONLY: 00035 case TERMO_ON_STATIC_ONLY_NUMB_OFF: 00036 #if !defined debug_SOI 00037 TermoCompens_Sum += StartTermoCompens; //e. accumulation of the value of thermocompensation from request to request //r. накопление величины термокомпенсации от запроса до запроса 00038 #endif 00039 break; 00040 00041 case TERMO_ON_DYNAMIC_ONLY: 00042 case TERMO_ON_DYNAMIC_ONLY_NUMB_OFF: 00043 #if !defined debug_SOI 00044 TermoCompens_Sum += DynamicTermoCompens(); //e. accumulation of the value of thermocompensation from request to request //r. накопление величины термокомпенсации от запроса до запроса 00045 #endif 00046 break; 00047 00048 case TERMO_OFF: 00049 default: 00050 TermoCompens_Sum = 0; //e. thermocompensation is disable, therefore its part is equal to zero //r. термокомпенсация выключена, поэтому ее вклад равен нулю 00051 00052 } //of thermomode switch 00053 } */ 00054 /****************************************************************************** 00055 ** Function name: StaticTermoCompens 00056 ** 00057 ** Descriptions: Procedure of 00058 ** 00059 ** parameters: None 00060 ** Returned value: None 00061 ** 00062 ******************************************************************************/ 00063 int StaticTermoCompens(int temperature) //r. расчет статической составляющей термокомпенсации за один период прибора (100 мкс) 00064 { 00065 00066 float TermoCompens_Curr; //r. величина термокомпенсации за один период прибора (100 мкс) 00067 00068 int i, t; 00069 00070 //r. используем только термодатчик TSENS_NUMB 00071 //r. для новых термодатчиков: T4, для старых: T1 00072 //r. и используем кусочно-непрерывную термокомпенсацию 00073 00074 //r. Tmp_Out[TSENS_NUMB] = 8960; //-2560; //5120; //8000; // -2600; //-5000; 00075 00076 t = temperature; 00077 if(t > Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1]) { 00078 t = Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1]; 00079 } 00080 00081 i = 0; 00082 while( t > Device_blk.Str.TemperInt[i] ) i++; 00083 00084 //r. Tmp_Out[5] = i; 00085 TermoCompens_Curr = Device_blk.Str.TermoFunc[i] - dFuncPer_dTermo[i] * (float)( Device_blk.Str.TemperInt[i] - t ); 00086 00087 //r. Отладка 00088 //r. TermoCompens_Curr = 1.111111125; // отладка 00089 //r.TermoCompens_Curr = // 0.25; // за 1 сек накапливается 2500 импульсов 00090 /*r. 00091 //0.000100; // коэфф., при котором за 1 сек накапливается 1 импульс 00092 //1.0001; // коэфф., при котором за 1 сек накапливается 10001 импульс 00093 // 0.000125; // коэфф., при котором за 1 сек накапливается 1.25 импульса (за 100 выводится 122 имп.???) 00094 // 0.000105; // за 100 сек д.накапливаться 105 имп., накапл. 103??? 00095 */ 00096 00097 // TermoCompens_Curr = LONG_2_FRACT_14_18(TermoCompens_Curr); //r. TermoCompens_Curr переводим в формат 14.18 00098 00099 return TermoCompens_Curr; 00100 } // StaticTermoCompens 00101 00102 /****************************************************************************** 00103 ** Function name: DynamicDeltaCalc 00104 ** 00105 ** Descriptions: Procedure of 00106 ** 00107 ** parameters: None 00108 ** Returned value: Thermocompensation addition 00109 ** 00110 ******************************************************************************/ 00111 int DynamicDeltaCalc() //e. calculation the addition termocompensation for 1 reset //r. расчет добавки термокомпенсации на одно обнуление 00112 { 00113 00114 int i, t; 00115 00116 t = Temp_Aver; 00117 00118 if (IsHeating) { 00119 if(t > Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]) { 00120 t = Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]; 00121 } 00122 00123 i = 0; 00124 while( t > Device_blk.Str.TemperIntDyn[i] ) i++; 00125 00126 TermoCompDelta = ( Device_blk.Str.ThermoHeatDelta[i] - dThermoHeatDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperIntDyn[i] - t ) ); 00127 } else { 00128 if(t > Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]) { 00129 t = Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]; 00130 } 00131 00132 i = 0; 00133 while( t > Device_blk.Str.TemperCoolIntDyn[i] ) i++; 00134 00135 TermoCompDelta = ( Device_blk.Str.ThermoCoolDelta[i] - dThermoCoolDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperCoolIntDyn[i] - t ) ); 00136 } 00137 return TermoCompDelta; 00138 00139 } // DynamicDeltaCalc 00140 00141 /****************************************************************************** 00142 ** Function name: clc_ThermoSensors 00143 ** 00144 ** Descriptions: Procedure of calculating of the normalized temperaturre vector 00145 ** 00146 ** parameters: None 00147 ** Returned value: None 00148 ** 00149 ******************************************************************************/ 00150 void clc_ThermoSensors(void) 00151 { 00152 unsigned i; 00153 static int TS_sum = 0; 00154 static int seconds_aver = 0, TenSeconds = 0; 00155 static int Temp_AverPrevDynCalc = -7000; 00156 static int StartRdy = 1; 00157 static int PrevTemp = -7000; 00158 00159 for (i=0; i<2; i++) { 00160 //e. conversion of temperature values on ADC output //r. преобразование значений температуры на выходе АЦП 00161 //e. to range -32768 .. +32767 ( additional code; format 1.15 ) //r. к диапазону -32768 .. +32767 (дополнит. код; формат 1.15) 00162 /* Output.Str.Tmp_Out[i] = mac_r(Device_blk.Str.Tmp_bias[i] << 16, 00163 (Input.StrIn.Tmp_in[i] - 0x8000), 00164 Device_blk.Str.Tmp_scal[i]);*/ 00165 Output.Str.Tmp_Out[i+4] = Input.StrIn.Tmp_in[i]; 00166 } 00167 00168 if (time_1_Sec == DEVICE_SAMPLE_RATE_uks) { //r. истекла 1 секунда 00169 seconds_aver++; 00170 } 00171 00172 if (seconds_aver > TEMP_AVER_PERIOD) { //r. истекли TEMP_AVER_PERIOD(4 секунды) секунд 00173 seconds_aver = 0; 00174 TenSeconds++; 00175 PrevTemp = Temp_Aver; //e. save the previous mean temperature for 1 Sec //r. запоминаем предыдущую среднюю температуру за секунду 00176 Temp_Aver = TS_sum / (DEVICE_SAMPLE_RATE_HZ * TEMP_AVER_PERIOD); //e. calculating mean temperature for 1 Sec //r. вычисляем среднюю температуру за секунду 00177 00178 if (Temp_Aver > PrevTemp) { 00179 TempEvolution++; 00180 } 00181 if (Temp_Aver < PrevTemp) { 00182 TempEvolution--; 00183 } 00184 00185 TS_sum = 0; //e. reset the sum for calculation of an mean //r. обнуляем сумму для вычисления среднего 00186 } else { 00187 TS_sum += Output.Str.Tmp_Out[TSENS_NUMB]; 00188 } 00189 00190 if (TenSeconds == 10) { // 10 * TEMP_AVER_PERIOD = 40 00191 TenSeconds = 0; 00192 if (TempEvolution > 0) { 00193 IsHeating = 1; 00194 } 00195 00196 if (TempEvolution < 0) { 00197 IsHeating = 0; 00198 } 00199 TempEvolution = 0; 00200 } 00201 00202 //e. single calculaiton of some device parameters (measurement on the VALID_START_SEC second after start) //r. однократный расчет некоторых параметров прибора (измерение на VALID_START_SEC секунде после старта) 00203 if (StartRdy) { 00204 if (TenSeconds > VALID_START_4SEC) { 00205 00206 StartRdy = 0; //r. самоблокировка, поэтому больше сюда не заходим 00207 00208 if ((Device_blk.Str.TermoMode != TERMO_OFF) && \ 00209 (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY) && \ 00210 (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY_NUMB_OFF)) { //r. статическая термокомпенсация включена 00211 //r. расчет статической термокомпенсации числа 00212 StartTermoCompens = StaticTermoCompens(Temp_Aver); //r. стартовая температуры прибора 00213 } 00214 DynamicDeltaCalc(); 00215 00216 //r. расчет границ для частоты вибропривода, зависящего от стартовой температуры 00217 // DithFreqRangeCalc(); 00218 00219 //r. коэффициенты для полосового фильтра квази ДУП не пересчитываем: считаем, что полоса фильтра заведомо шире 00220 00221 00222 //r. напряжение сброса при нагревании 00223 WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal); 00224 //e. voltage of reset at cooling //r. напряжение сброса при охлаждении 00225 WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal); 00226 } 00227 } 00228 00229 if ( abs(Temp_Aver - Temp_AverPrevDynCalc) > Device_blk.Str.DeltaTempRecalc) { 00230 Temp_AverPrevDynCalc = Temp_Aver; 00231 DynamicDeltaCalc(); 00232 }//r. расчет средней за 1 секунду температуры датчиков T4, T5 00233 00234 // cyclic built-in test 00235 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) ) { 00236 Valid_Data |= THERMO_RANGE_ERROR; 00237 } 00238 00239 if ( abs( Output.Str.Tmp_Out[4] - Output.Str.Tmp_Out[5]) > TS_DIFF_MAX) { 00240 Valid_Data |= THERMO_DIFF_ERROR; 00241 } 00242 } // clc_ThermoSensors 00243 00244 00245 /****************************************************************************** 00246 ** Function name: clc_PLC 00247 ** 00248 ** Descriptions: Procedure of initial processing for the CPLC regulator 00249 ** 00250 ** parameters: None 00251 ** Returned value: None 00252 ** 00253 ******************************************************************************/ 00254 void DithFreqRangeCalc(void) //r. расчет границ коэффициента деления для частоты вибропривода, зависящих от текущей температуры 00255 { 00256 00257 unsigned int min_level, max_level; 00258 int delta_VB_N; 00259 00260 delta_VB_N = mult_r(Device_blk.Str.K_vb_tu >> DITH_VBN_SHIFT, (Temp_Aver - Device_blk.Str.TemperNormal)); //r.200; 00261 //r. !!! сделать суммирование с насыщением, а затем сдвиг 00262 min_level = VB_Nmin0 + delta_VB_N; 00263 max_level = VB_Nmax0 + delta_VB_N; 00264 // maximum saturation for unsigned levels 00265 Max_Saturation(&min_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)-1); // min should be always less then max_level by 1 00266 Max_Saturation(&max_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)); 00267 Device_blk.Str.VB_Nmin = min_level << DITH_VBN_SHIFT; 00268 Device_blk.Str.VB_Nmax = max_level << DITH_VBN_SHIFT; 00269 00270 } // DithFreqRange_calc 00271 00272
Generated on Tue Jul 12 2022 15:16:11 by 1.7.2