Dmitry Kovalev / Mbed 2 deprecated LGstaandart

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ThermoCalc.c Source File

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