Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LG2 by
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 00091 00092 // TermoCompens_Curr = LONG_2_FRACT_14_18(TermoCompens_Curr); //r. TermoCompens_Curr переводим в формат 14.18 00093 00094 return TermoCompens_Curr;*/ 00095 } // StaticTermoCompens 00096 00097 /****************************************************************************** 00098 ** Function name: DynamicDeltaCalc 00099 ** 00100 ** Descriptions: Procedure of 00101 ** 00102 ** parameters: None 00103 ** Returned value: Thermocompensation addition 00104 ** 00105 ******************************************************************************/ 00106 int DynamicDeltaCalc() //e. calculation the addition termocompensation for 1 reset //r. расчет добавки термокомпенсации на одно обнуление 00107 { 00108 /* 00109 int i, t; 00110 00111 t = Temp_Aver; 00112 00113 if (IsHeating) { 00114 if(t > Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]) { 00115 t = Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1]; 00116 } 00117 00118 i = 0; 00119 while( t > Device_blk.Str.TemperIntDyn[i] ) i++; 00120 00121 TermoCompDelta = ( Device_blk.Str.ThermoHeatDelta[i] - dThermoHeatDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperIntDyn[i] - t ) ); 00122 } else { 00123 if(t > Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]) { 00124 t = Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1]; 00125 } 00126 00127 i = 0; 00128 while( t > Device_blk.Str.TemperCoolIntDyn[i] ) i++; 00129 00130 TermoCompDelta = ( Device_blk.Str.ThermoCoolDelta[i] - dThermoCoolDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperCoolIntDyn[i] - t ) ); 00131 } 00132 return TermoCompDelta; 00133 */ 00134 } // DynamicDeltaCalc 00135 00136 /****************************************************************************** 00137 ** Function name: clc_ThermoSensors 00138 ** 00139 ** Descriptions: Procedure of calculating of the normalized temperaturre vector 00140 ** 00141 ** parameters: None 00142 ** Returned value: None 00143 ** 00144 ******************************************************************************/ 00145 void clc_ThermoSensors(void) 00146 {/* 00147 unsigned i; 00148 static int TS_sum = 0; 00149 static int seconds_aver = 0, TenSeconds = 0; 00150 static int Temp_AverPrevDynCalc = -7000; 00151 static int StartRdy = 1; 00152 static int PrevTemp = -7000; 00153 00154 for (i=0; i<2; i++) { 00155 //e. conversion of temperature values on ADC output //r. преобразование значений температуры на выходе АЦП 00156 //e. to range -32768 .. +32767 ( additional code; format 1.15 ) //r. к диапазону -32768 .. +32767 (дополнит. код; формат 1.15) 00157 00158 Output.Str.Tmp_Out[i+4] = Input.StrIn.Tmp_in[i]; 00159 } 00160 00161 if (time_1_Sec == DEVICE_SAMPLE_RATE_uks) { //r. истекла 1 секунда 00162 seconds_aver++; 00163 } 00164 00165 if (seconds_aver > TEMP_AVER_PERIOD) { //r. истекли TEMP_AVER_PERIOD(4 секунды) секунд 00166 seconds_aver = 0; 00167 TenSeconds++; 00168 PrevTemp = Temp_Aver; //e. save the previous mean temperature for 1 Sec //r. запоминаем предыдущую среднюю температуру за секунду 00169 Temp_Aver = TS_sum / (DEVICE_SAMPLE_RATE_HZ * TEMP_AVER_PERIOD); //e. calculating mean temperature for 1 Sec //r. вычисляем среднюю температуру за секунду 00170 00171 if (Temp_Aver > PrevTemp) { 00172 TempEvolution++; 00173 } 00174 if (Temp_Aver < PrevTemp) { 00175 TempEvolution--; 00176 } 00177 00178 TS_sum = 0; //e. reset the sum for calculation of an mean //r. обнуляем сумму для вычисления среднего 00179 } else { 00180 TS_sum += Output.Str.Tmp_Out[TSENS_NUMB]; 00181 } 00182 00183 if (TenSeconds == 10) { // 10 * TEMP_AVER_PERIOD = 40 00184 TenSeconds = 0; 00185 if (TempEvolution > 0) { 00186 IsHeating = 1; 00187 } 00188 00189 if (TempEvolution < 0) { 00190 IsHeating = 0; 00191 } 00192 TempEvolution = 0; 00193 } 00194 00195 //e. single calculaiton of some device parameters (measurement on the VALID_START_SEC second after start) //r. однократный расчет некоторых параметров прибора (измерение на VALID_START_SEC секунде после старта) 00196 if (StartRdy) { 00197 if (TenSeconds > VALID_START_4SEC) { 00198 00199 StartRdy = 0; //r. самоблокировка, поэтому больше сюда не заходим 00200 00201 if ((Device_blk.Str.TermoMode != TERMO_OFF) && \ 00202 (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY) && \ 00203 (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY_NUMB_OFF)) { //r. статическая термокомпенсация включена 00204 //r. расчет статической термокомпенсации числа 00205 StartTermoCompens = StaticTermoCompens(Temp_Aver); //r. стартовая температуры прибора 00206 } 00207 DynamicDeltaCalc(); 00208 00209 //r. расчет границ для частоты вибропривода, зависящего от стартовой температуры 00210 // DithFreqRangeCalc(); 00211 00212 //r. коэффициенты для полосового фильтра квази ДУП не пересчитываем: считаем, что полоса фильтра заведомо шире 00213 00214 00215 //r. напряжение сброса при нагревании 00216 WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal); 00217 //e. voltage of reset at cooling //r. напряжение сброса при охлаждении 00218 WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal); 00219 } 00220 } 00221 00222 if ( abs(Temp_Aver - Temp_AverPrevDynCalc) > Device_blk.Str.DeltaTempRecalc) { 00223 Temp_AverPrevDynCalc = Temp_Aver; 00224 DynamicDeltaCalc(); 00225 }//r. расчет средней за 1 секунду температуры датчиков T4, T5 00226 00227 // cyclic built-in test 00228 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) ) { 00229 Valid_Data |= THERMO_RANGE_ERROR; 00230 } 00231 00232 if ( abs( Output.Str.Tmp_Out[4] - Output.Str.Tmp_Out[5]) > TS_DIFF_MAX) { 00233 Valid_Data |= THERMO_DIFF_ERROR; 00234 }*/ 00235 } // clc_ThermoSensors 00236 00237 00238 /****************************************************************************** 00239 ** Function name: clc_PLC 00240 ** 00241 ** Descriptions: Procedure of initial processing for the CPLC regulator 00242 ** 00243 ** parameters: None 00244 ** Returned value: None 00245 ** 00246 ******************************************************************************/ 00247 void DithFreqRangeCalc(void) //r. расчет границ коэффициента деления для частоты вибропривода, зависящих от текущей температуры 00248 {/* 00249 00250 unsigned int min_level, max_level; 00251 int delta_VB_N; 00252 00253 delta_VB_N = mult_r(Device_blk.Str.K_vb_tu >> DITH_VBN_SHIFT, (Temp_Aver - Device_blk.Str.TemperNormal)); //r.200; 00254 //r. !!! сделать суммирование с насыщением, а затем сдвиг 00255 min_level = VB_Nmin0 + delta_VB_N; 00256 max_level = VB_Nmax0 + delta_VB_N; 00257 // maximum saturation for unsigned levels 00258 Max_Saturation(&min_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)-1); // min should be always less then max_level by 1 00259 Max_Saturation(&max_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)); 00260 Device_blk.Str.VB_Nmin = min_level << DITH_VBN_SHIFT; 00261 Device_blk.Str.VB_Nmax = max_level << DITH_VBN_SHIFT; 00262 */ 00263 } // DithFreqRange_calc 00264 00265
Generated on Thu Jul 14 2022 02:34:42 by
 1.7.2
 1.7.2 
    