n

Dependencies:   mbed

Fork of LG by igor Apu

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     /*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