forkd

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Committer:
Kovalev_D
Date:
Wed Feb 03 10:44:42 2016 +0300
Revision:
23:12e6183f04d4
[thyz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kovalev_D 23:12e6183f04d4 1 #include "ThermoCalc.h"
Kovalev_D 23:12e6183f04d4 2 #include "CyclesSync.h"
Kovalev_D 23:12e6183f04d4 3 #include "CntrlGLD.h"
Kovalev_D 23:12e6183f04d4 4 #include "InputOutput.h"
Kovalev_D 23:12e6183f04d4 5 #include "mathDSp.h"
Kovalev_D 23:12e6183f04d4 6
Kovalev_D 23:12e6183f04d4 7 #define debug
Kovalev_D 23:12e6183f04d4 8 #define TEMP_AVER_PERIOD 4 // e. number of seconds for average
Kovalev_D 23:12e6183f04d4 9 int TermoCompens_Sum = 0;
Kovalev_D 23:12e6183f04d4 10 unsigned int IsHeating;
Kovalev_D 23:12e6183f04d4 11 //int Tmp_Out[NUM_OF_THERMOSENS];
Kovalev_D 23:12e6183f04d4 12 int dThermoHeatDeltaPer_dTermo[TERMO_FUNC_SIZE];
Kovalev_D 23:12e6183f04d4 13 int dThermoCoolDeltaPer_dTermo[TERMO_FUNC_SIZE];
Kovalev_D 23:12e6183f04d4 14 int dFuncPer_dTermo[TERMO_FUNC_SIZE];
Kovalev_D 23:12e6183f04d4 15 int TermoCompDelta;
Kovalev_D 23:12e6183f04d4 16 int Temp_Aver; //e. the mean temperature for 1 Sec for T4 sensor //r. ñðåäíÿÿ òåìïåðàòóðà çà 1 ñåêóíäó äëÿ äàò÷èêà T4
Kovalev_D 23:12e6183f04d4 17 int TempEvolution = 0;
Kovalev_D 23:12e6183f04d4 18 int StartTermoCompens = 0; //e. initial thermocompensation (in XXX seconds after start ) //r. íà÷àëüíàÿ òåðìîêîìïåíñàöèÿ (÷åðåç ÕÕÕ ñåêóíä ïîñëå ñòàðòà)
Kovalev_D 23:12e6183f04d4 19
Kovalev_D 23:12e6183f04d4 20 extern int WP_reset_heating; //e. voltage of reset at heating //r. íàïðÿæåíèå ñáðîñà ïðè íàãðåâàíèè
Kovalev_D 23:12e6183f04d4 21 extern int WP_reset_cooling; //e. voltage of reset at cooling //r. íàïðÿæåíèå ñáðîñà ïðè îõëàæäåíèè
Kovalev_D 23:12e6183f04d4 22
Kovalev_D 23:12e6183f04d4 23 __inline Max_Saturation(unsigned *lvl, unsigned limit)
Kovalev_D 23:12e6183f04d4 24 {
Kovalev_D 23:12e6183f04d4 25 if (*lvl>limit) *lvl = limit;
Kovalev_D 23:12e6183f04d4 26 }
Kovalev_D 23:12e6183f04d4 27
Kovalev_D 23:12e6183f04d4 28 /*{
Kovalev_D 23:12e6183f04d4 29 switch (Device_blk.Str.TermoMode) //e. selecting thermocompensation mode //r. âûáîð ðåæèìà òåðìîêîìïåíñàöèè
Kovalev_D 23:12e6183f04d4 30 {
Kovalev_D 23:12e6183f04d4 31 case TERMO_ON:
Kovalev_D 23:12e6183f04d4 32 case TERMO_ON_NUMB_OFF:
Kovalev_D 23:12e6183f04d4 33
Kovalev_D 23:12e6183f04d4 34 TermoCompens_Sum += StartTermoCompens + DynamicDeltaCalc(); //e. accumulation of the value of thermocompensation from request to request //r. íàêîïëåíèå âåëè÷èíû òåðìîêîìïåíñàöèè îò çàïðîñà äî çàïðîñà
Kovalev_D 23:12e6183f04d4 35
Kovalev_D 23:12e6183f04d4 36 break;
Kovalev_D 23:12e6183f04d4 37
Kovalev_D 23:12e6183f04d4 38 case TERMO_ON_STATIC_ONLY:
Kovalev_D 23:12e6183f04d4 39 case TERMO_ON_STATIC_ONLY_NUMB_OFF:
Kovalev_D 23:12e6183f04d4 40 #if !defined debug_SOI
Kovalev_D 23:12e6183f04d4 41 TermoCompens_Sum += StartTermoCompens; //e. accumulation of the value of thermocompensation from request to request //r. íàêîïëåíèå âåëè÷èíû òåðìîêîìïåíñàöèè îò çàïðîñà äî çàïðîñà
Kovalev_D 23:12e6183f04d4 42 #endif
Kovalev_D 23:12e6183f04d4 43 break;
Kovalev_D 23:12e6183f04d4 44
Kovalev_D 23:12e6183f04d4 45 case TERMO_ON_DYNAMIC_ONLY:
Kovalev_D 23:12e6183f04d4 46 case TERMO_ON_DYNAMIC_ONLY_NUMB_OFF:
Kovalev_D 23:12e6183f04d4 47 #if !defined debug_SOI
Kovalev_D 23:12e6183f04d4 48 TermoCompens_Sum += DynamicTermoCompens(); //e. accumulation of the value of thermocompensation from request to request //r. íàêîïëåíèå âåëè÷èíû òåðìîêîìïåíñàöèè îò çàïðîñà äî çàïðîñà
Kovalev_D 23:12e6183f04d4 49 #endif
Kovalev_D 23:12e6183f04d4 50 break;
Kovalev_D 23:12e6183f04d4 51
Kovalev_D 23:12e6183f04d4 52 case TERMO_OFF:
Kovalev_D 23:12e6183f04d4 53 default:
Kovalev_D 23:12e6183f04d4 54 TermoCompens_Sum = 0; //e. thermocompensation is disable, therefore its part is equal to zero //r. òåðìîêîìïåíñàöèÿ âûêëþ÷åíà, ïîýòîìó åå âêëàä ðàâåí íóëþ
Kovalev_D 23:12e6183f04d4 55
Kovalev_D 23:12e6183f04d4 56 } //of thermomode switch
Kovalev_D 23:12e6183f04d4 57 } */
Kovalev_D 23:12e6183f04d4 58 /******************************************************************************
Kovalev_D 23:12e6183f04d4 59 ** Function name: StaticTermoCompens
Kovalev_D 23:12e6183f04d4 60 **
Kovalev_D 23:12e6183f04d4 61 ** Descriptions: Procedure of
Kovalev_D 23:12e6183f04d4 62 **
Kovalev_D 23:12e6183f04d4 63 ** parameters: None
Kovalev_D 23:12e6183f04d4 64 ** Returned value: None
Kovalev_D 23:12e6183f04d4 65 **
Kovalev_D 23:12e6183f04d4 66 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 67 int StaticTermoCompens(int temperature) //r. ðàñ÷åò ñòàòè÷åñêîé ñîñòàâëÿþùåé òåðìîêîìïåíñàöèè çà îäèí ïåðèîä ïðèáîðà (100 ìêñ)
Kovalev_D 23:12e6183f04d4 68 {
Kovalev_D 23:12e6183f04d4 69
Kovalev_D 23:12e6183f04d4 70 float TermoCompens_Curr; //r. âåëè÷èíà òåðìîêîìïåíñàöèè çà îäèí ïåðèîä ïðèáîðà (100 ìêñ)
Kovalev_D 23:12e6183f04d4 71
Kovalev_D 23:12e6183f04d4 72 int i, t;
Kovalev_D 23:12e6183f04d4 73
Kovalev_D 23:12e6183f04d4 74 //r. èñïîëüçóåì òîëüêî òåðìîäàò÷èê TSENS_NUMB
Kovalev_D 23:12e6183f04d4 75 //r. äëÿ íîâûõ òåðìîäàò÷èêîâ: T4, äëÿ ñòàðûõ: T1
Kovalev_D 23:12e6183f04d4 76 //r. è èñïîëüçóåì êóñî÷íî-íåïðåðûâíóþ òåðìîêîìïåíñàöèþ
Kovalev_D 23:12e6183f04d4 77
Kovalev_D 23:12e6183f04d4 78 //r. Tmp_Out[TSENS_NUMB] = 8960; //-2560; //5120; //8000; // -2600; //-5000;
Kovalev_D 23:12e6183f04d4 79
Kovalev_D 23:12e6183f04d4 80 t = temperature;
Kovalev_D 23:12e6183f04d4 81 if(t > Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1])
Kovalev_D 23:12e6183f04d4 82 {
Kovalev_D 23:12e6183f04d4 83 t = Device_blk.Str.TemperInt[TERMO_FUNC_SIZE - 1];
Kovalev_D 23:12e6183f04d4 84 }
Kovalev_D 23:12e6183f04d4 85
Kovalev_D 23:12e6183f04d4 86 i = 0;
Kovalev_D 23:12e6183f04d4 87 while( t > Device_blk.Str.TemperInt[i] ) i++;
Kovalev_D 23:12e6183f04d4 88
Kovalev_D 23:12e6183f04d4 89 //r. Tmp_Out[5] = i;
Kovalev_D 23:12e6183f04d4 90 TermoCompens_Curr = Device_blk.Str.TermoFunc[i] - dFuncPer_dTermo[i] * (float)( Device_blk.Str.TemperInt[i] - t );
Kovalev_D 23:12e6183f04d4 91
Kovalev_D 23:12e6183f04d4 92 //r. Îòëàäêà
Kovalev_D 23:12e6183f04d4 93 //r. TermoCompens_Curr = 1.111111125; // îòëàäêà
Kovalev_D 23:12e6183f04d4 94 //r.TermoCompens_Curr = // 0.25; // çà 1 ñåê íàêàïëèâàåòñÿ 2500 èìïóëüñîâ
Kovalev_D 23:12e6183f04d4 95 /*r.
Kovalev_D 23:12e6183f04d4 96 //0.000100; // êîýôô., ïðè êîòîðîì çà 1 ñåê íàêàïëèâàåòñÿ 1 èìïóëüñ
Kovalev_D 23:12e6183f04d4 97 //1.0001; // êîýôô., ïðè êîòîðîì çà 1 ñåê íàêàïëèâàåòñÿ 10001 èìïóëüñ
Kovalev_D 23:12e6183f04d4 98 // 0.000125; // êîýôô., ïðè êîòîðîì çà 1 ñåê íàêàïëèâàåòñÿ 1.25 èìïóëüñà (çà 100 âûâîäèòñÿ 122 èìï.???)
Kovalev_D 23:12e6183f04d4 99 // 0.000105; // çà 100 ñåê ä.íàêàïëèâàòüñÿ 105 èìï., íàêàïë. 103???
Kovalev_D 23:12e6183f04d4 100 */
Kovalev_D 23:12e6183f04d4 101
Kovalev_D 23:12e6183f04d4 102 // TermoCompens_Curr = LONG_2_FRACT_14_18(TermoCompens_Curr); //r. TermoCompens_Curr ïåðåâîäèì â ôîðìàò 14.18
Kovalev_D 23:12e6183f04d4 103
Kovalev_D 23:12e6183f04d4 104 return TermoCompens_Curr;
Kovalev_D 23:12e6183f04d4 105 } // StaticTermoCompens
Kovalev_D 23:12e6183f04d4 106
Kovalev_D 23:12e6183f04d4 107 /******************************************************************************
Kovalev_D 23:12e6183f04d4 108 ** Function name: DynamicDeltaCalc
Kovalev_D 23:12e6183f04d4 109 **
Kovalev_D 23:12e6183f04d4 110 ** Descriptions: Procedure of
Kovalev_D 23:12e6183f04d4 111 **
Kovalev_D 23:12e6183f04d4 112 ** parameters: None
Kovalev_D 23:12e6183f04d4 113 ** Returned value: Thermocompensation addition
Kovalev_D 23:12e6183f04d4 114 **
Kovalev_D 23:12e6183f04d4 115 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 116 int DynamicDeltaCalc() //e. calculation the addition termocompensation for 1 reset //r. ðàñ÷åò äîáàâêè òåðìîêîìïåíñàöèè íà îäíî îáíóëåíèå
Kovalev_D 23:12e6183f04d4 117 {
Kovalev_D 23:12e6183f04d4 118
Kovalev_D 23:12e6183f04d4 119 int i, t;
Kovalev_D 23:12e6183f04d4 120
Kovalev_D 23:12e6183f04d4 121 t = Temp_Aver;
Kovalev_D 23:12e6183f04d4 122
Kovalev_D 23:12e6183f04d4 123 if (IsHeating)
Kovalev_D 23:12e6183f04d4 124 {
Kovalev_D 23:12e6183f04d4 125 if(t > Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1])
Kovalev_D 23:12e6183f04d4 126 {
Kovalev_D 23:12e6183f04d4 127 t = Device_blk.Str.TemperIntDyn[TERMO_FUNC_SIZE - 1];
Kovalev_D 23:12e6183f04d4 128 }
Kovalev_D 23:12e6183f04d4 129
Kovalev_D 23:12e6183f04d4 130 i = 0;
Kovalev_D 23:12e6183f04d4 131 while( t > Device_blk.Str.TemperIntDyn[i] ) i++;
Kovalev_D 23:12e6183f04d4 132
Kovalev_D 23:12e6183f04d4 133 TermoCompDelta = ( Device_blk.Str.ThermoHeatDelta[i] - dThermoHeatDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperIntDyn[i] - t ) );
Kovalev_D 23:12e6183f04d4 134 }
Kovalev_D 23:12e6183f04d4 135 else
Kovalev_D 23:12e6183f04d4 136 {
Kovalev_D 23:12e6183f04d4 137 if(t > Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1])
Kovalev_D 23:12e6183f04d4 138 {
Kovalev_D 23:12e6183f04d4 139 t = Device_blk.Str.TemperCoolIntDyn[TERMO_FUNC_SIZE - 1];
Kovalev_D 23:12e6183f04d4 140 }
Kovalev_D 23:12e6183f04d4 141
Kovalev_D 23:12e6183f04d4 142 i = 0;
Kovalev_D 23:12e6183f04d4 143 while( t > Device_blk.Str.TemperCoolIntDyn[i] ) i++;
Kovalev_D 23:12e6183f04d4 144
Kovalev_D 23:12e6183f04d4 145 TermoCompDelta = ( Device_blk.Str.ThermoCoolDelta[i] - dThermoCoolDeltaPer_dTermo[i] * (float)( Device_blk.Str.TemperCoolIntDyn[i] - t ) );
Kovalev_D 23:12e6183f04d4 146 }
Kovalev_D 23:12e6183f04d4 147 return TermoCompDelta;
Kovalev_D 23:12e6183f04d4 148
Kovalev_D 23:12e6183f04d4 149 } // DynamicDeltaCalc
Kovalev_D 23:12e6183f04d4 150
Kovalev_D 23:12e6183f04d4 151 /******************************************************************************
Kovalev_D 23:12e6183f04d4 152 ** Function name: clc_ThermoSensors
Kovalev_D 23:12e6183f04d4 153 **
Kovalev_D 23:12e6183f04d4 154 ** Descriptions: Procedure of calculating of the normalized temperaturre vector
Kovalev_D 23:12e6183f04d4 155 **
Kovalev_D 23:12e6183f04d4 156 ** parameters: None
Kovalev_D 23:12e6183f04d4 157 ** Returned value: None
Kovalev_D 23:12e6183f04d4 158 **
Kovalev_D 23:12e6183f04d4 159 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 160 void clc_ThermoSensors(void)
Kovalev_D 23:12e6183f04d4 161 {
Kovalev_D 23:12e6183f04d4 162 unsigned i;
Kovalev_D 23:12e6183f04d4 163 static int TS_sum = 0;
Kovalev_D 23:12e6183f04d4 164 static int seconds_aver = 0, TenSeconds = 0;
Kovalev_D 23:12e6183f04d4 165 static int Temp_AverPrevDynCalc = -7000;
Kovalev_D 23:12e6183f04d4 166 static int StartRdy = 1;
Kovalev_D 23:12e6183f04d4 167 static int PrevTemp = -7000;
Kovalev_D 23:12e6183f04d4 168
Kovalev_D 23:12e6183f04d4 169 for (i=0; i<2; i++)
Kovalev_D 23:12e6183f04d4 170 {
Kovalev_D 23:12e6183f04d4 171 //e. conversion of temperature values on ADC output //r. ïðåîáðàçîâàíèå çíà÷åíèé òåìïåðàòóðû íà âûõîäå ÀÖÏ
Kovalev_D 23:12e6183f04d4 172 //e. to range -32768 .. +32767 ( additional code; format 1.15 ) //r. ê äèàïàçîíó -32768 .. +32767 (äîïîëíèò. êîä; ôîðìàò 1.15)
Kovalev_D 23:12e6183f04d4 173 /* Output.Str.Tmp_Out[i] = mac_r(Device_blk.Str.Tmp_bias[i] << 16,
Kovalev_D 23:12e6183f04d4 174 (Input.StrIn.Tmp_in[i] - 0x8000),
Kovalev_D 23:12e6183f04d4 175 Device_blk.Str.Tmp_scal[i]);*/
Kovalev_D 23:12e6183f04d4 176 Output.Str.Tmp_Out[i+4] = Input.StrIn.Tmp_in[i];
Kovalev_D 23:12e6183f04d4 177 }
Kovalev_D 23:12e6183f04d4 178
Kovalev_D 23:12e6183f04d4 179 if (time_1_Sec == DEVICE_SAMPLE_RATE_uks) //r. èñòåêëà 1 ñåêóíäà
Kovalev_D 23:12e6183f04d4 180 {
Kovalev_D 23:12e6183f04d4 181 seconds_aver++;
Kovalev_D 23:12e6183f04d4 182 }
Kovalev_D 23:12e6183f04d4 183
Kovalev_D 23:12e6183f04d4 184 if (seconds_aver > TEMP_AVER_PERIOD) //r. èñòåêëè TEMP_AVER_PERIOD(4 ñåêóíäû) ñåêóíä
Kovalev_D 23:12e6183f04d4 185 {
Kovalev_D 23:12e6183f04d4 186 seconds_aver = 0;
Kovalev_D 23:12e6183f04d4 187 TenSeconds++;
Kovalev_D 23:12e6183f04d4 188 PrevTemp = Temp_Aver; //e. save the previous mean temperature for 1 Sec //r. çàïîìèíàåì ïðåäûäóùóþ ñðåäíþþ òåìïåðàòóðó çà ñåêóíäó
Kovalev_D 23:12e6183f04d4 189 Temp_Aver = TS_sum / (DEVICE_SAMPLE_RATE_HZ * TEMP_AVER_PERIOD); //e. calculating mean temperature for 1 Sec //r. âû÷èñëÿåì ñðåäíþþ òåìïåðàòóðó çà ñåêóíäó
Kovalev_D 23:12e6183f04d4 190
Kovalev_D 23:12e6183f04d4 191 if (Temp_Aver > PrevTemp)
Kovalev_D 23:12e6183f04d4 192 {
Kovalev_D 23:12e6183f04d4 193 TempEvolution++;
Kovalev_D 23:12e6183f04d4 194 }
Kovalev_D 23:12e6183f04d4 195 if (Temp_Aver < PrevTemp)
Kovalev_D 23:12e6183f04d4 196 {
Kovalev_D 23:12e6183f04d4 197 TempEvolution--;
Kovalev_D 23:12e6183f04d4 198 }
Kovalev_D 23:12e6183f04d4 199
Kovalev_D 23:12e6183f04d4 200 TS_sum = 0; //e. reset the sum for calculation of an mean //r. îáíóëÿåì ñóììó äëÿ âû÷èñëåíèÿ ñðåäíåãî
Kovalev_D 23:12e6183f04d4 201 }
Kovalev_D 23:12e6183f04d4 202 else
Kovalev_D 23:12e6183f04d4 203 {
Kovalev_D 23:12e6183f04d4 204 TS_sum += Output.Str.Tmp_Out[TSENS_NUMB];
Kovalev_D 23:12e6183f04d4 205 }
Kovalev_D 23:12e6183f04d4 206
Kovalev_D 23:12e6183f04d4 207 if (TenSeconds == 10) // 10 * TEMP_AVER_PERIOD = 40
Kovalev_D 23:12e6183f04d4 208 {
Kovalev_D 23:12e6183f04d4 209 TenSeconds = 0;
Kovalev_D 23:12e6183f04d4 210 if (TempEvolution > 0)
Kovalev_D 23:12e6183f04d4 211 {
Kovalev_D 23:12e6183f04d4 212 IsHeating = 1;
Kovalev_D 23:12e6183f04d4 213 }
Kovalev_D 23:12e6183f04d4 214
Kovalev_D 23:12e6183f04d4 215 if (TempEvolution < 0)
Kovalev_D 23:12e6183f04d4 216 {
Kovalev_D 23:12e6183f04d4 217 IsHeating = 0;
Kovalev_D 23:12e6183f04d4 218 }
Kovalev_D 23:12e6183f04d4 219 TempEvolution = 0;
Kovalev_D 23:12e6183f04d4 220 }
Kovalev_D 23:12e6183f04d4 221
Kovalev_D 23:12e6183f04d4 222 //e. single calculaiton of some device parameters (measurement on the VALID_START_SEC second after start) //r. îäíîêðàòíûé ðàñ÷åò íåêîòîðûõ ïàðàìåòðîâ ïðèáîðà (èçìåðåíèå íà VALID_START_SEC ñåêóíäå ïîñëå ñòàðòà)
Kovalev_D 23:12e6183f04d4 223 if (StartRdy)
Kovalev_D 23:12e6183f04d4 224 {
Kovalev_D 23:12e6183f04d4 225 if (TenSeconds > VALID_START_4SEC)
Kovalev_D 23:12e6183f04d4 226 {
Kovalev_D 23:12e6183f04d4 227
Kovalev_D 23:12e6183f04d4 228 StartRdy = 0; //r. ñàìîáëîêèðîâêà, ïîýòîìó áîëüøå ñþäà íå çàõîäèì
Kovalev_D 23:12e6183f04d4 229
Kovalev_D 23:12e6183f04d4 230 if ((Device_blk.Str.TermoMode != TERMO_OFF) && \
Kovalev_D 23:12e6183f04d4 231 (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY) && \
Kovalev_D 23:12e6183f04d4 232 (Device_blk.Str.TermoMode != TERMO_ON_DYNAMIC_ONLY_NUMB_OFF)) //r. ñòàòè÷åñêàÿ òåðìîêîìïåíñàöèÿ âêëþ÷åíà
Kovalev_D 23:12e6183f04d4 233 {
Kovalev_D 23:12e6183f04d4 234 //r. ðàñ÷åò ñòàòè÷åñêîé òåðìîêîìïåíñàöèè ÷èñëà
Kovalev_D 23:12e6183f04d4 235 StartTermoCompens = StaticTermoCompens(Temp_Aver); //r. ñòàðòîâàÿ òåìïåðàòóðû ïðèáîðà
Kovalev_D 23:12e6183f04d4 236 }
Kovalev_D 23:12e6183f04d4 237 DynamicDeltaCalc();
Kovalev_D 23:12e6183f04d4 238
Kovalev_D 23:12e6183f04d4 239 //r. ðàñ÷åò ãðàíèö äëÿ ÷àñòîòû âèáðîïðèâîäà, çàâèñÿùåãî îò ñòàðòîâîé òåìïåðàòóðû
Kovalev_D 23:12e6183f04d4 240 // DithFreqRangeCalc();
Kovalev_D 23:12e6183f04d4 241
Kovalev_D 23:12e6183f04d4 242 //r. êîýôôèöèåíòû äëÿ ïîëîñîâîãî ôèëüòðà êâàçè ÄÓÏ íå ïåðåñ÷èòûâàåì: ñ÷èòàåì, ÷òî ïîëîñà ôèëüòðà çàâåäîìî øèðå
Kovalev_D 23:12e6183f04d4 243
Kovalev_D 23:12e6183f04d4 244
Kovalev_D 23:12e6183f04d4 245 //r. íàïðÿæåíèå ñáðîñà ïðè íàãðåâàíèè
Kovalev_D 23:12e6183f04d4 246 WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal);
Kovalev_D 23:12e6183f04d4 247 //e. voltage of reset at cooling //r. íàïðÿæåíèå ñáðîñà ïðè îõëàæäåíèè
Kovalev_D 23:12e6183f04d4 248 WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal);
Kovalev_D 23:12e6183f04d4 249 }
Kovalev_D 23:12e6183f04d4 250 }
Kovalev_D 23:12e6183f04d4 251
Kovalev_D 23:12e6183f04d4 252 if ( abs(Temp_Aver - Temp_AverPrevDynCalc) > Device_blk.Str.DeltaTempRecalc)
Kovalev_D 23:12e6183f04d4 253 {
Kovalev_D 23:12e6183f04d4 254 Temp_AverPrevDynCalc = Temp_Aver;
Kovalev_D 23:12e6183f04d4 255 DynamicDeltaCalc();
Kovalev_D 23:12e6183f04d4 256 }//r. ðàñ÷åò ñðåäíåé çà 1 ñåêóíäó òåìïåðàòóðû äàò÷èêîâ T4, T5
Kovalev_D 23:12e6183f04d4 257
Kovalev_D 23:12e6183f04d4 258 // cyclic built-in test
Kovalev_D 23:12e6183f04d4 259 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) )
Kovalev_D 23:12e6183f04d4 260 {
Kovalev_D 23:12e6183f04d4 261 Valid_Data |= THERMO_RANGE_ERROR;
Kovalev_D 23:12e6183f04d4 262 }
Kovalev_D 23:12e6183f04d4 263
Kovalev_D 23:12e6183f04d4 264 if ( abs( Output.Str.Tmp_Out[4] - Output.Str.Tmp_Out[5]) > TS_DIFF_MAX)
Kovalev_D 23:12e6183f04d4 265 {
Kovalev_D 23:12e6183f04d4 266 Valid_Data |= THERMO_DIFF_ERROR;
Kovalev_D 23:12e6183f04d4 267 }
Kovalev_D 23:12e6183f04d4 268 } // clc_ThermoSensors
Kovalev_D 23:12e6183f04d4 269
Kovalev_D 23:12e6183f04d4 270
Kovalev_D 23:12e6183f04d4 271 /******************************************************************************
Kovalev_D 23:12e6183f04d4 272 ** Function name: clc_PLC
Kovalev_D 23:12e6183f04d4 273 **
Kovalev_D 23:12e6183f04d4 274 ** Descriptions: Procedure of initial processing for the CPLC regulator
Kovalev_D 23:12e6183f04d4 275 **
Kovalev_D 23:12e6183f04d4 276 ** parameters: None
Kovalev_D 23:12e6183f04d4 277 ** Returned value: None
Kovalev_D 23:12e6183f04d4 278 **
Kovalev_D 23:12e6183f04d4 279 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 280 void DithFreqRangeCalc(void) //r. ðàñ÷åò ãðàíèö êîýôôèöèåíòà äåëåíèÿ äëÿ ÷àñòîòû âèáðîïðèâîäà, çàâèñÿùèõ îò òåêóùåé òåìïåðàòóðû
Kovalev_D 23:12e6183f04d4 281 {
Kovalev_D 23:12e6183f04d4 282
Kovalev_D 23:12e6183f04d4 283 unsigned int min_level, max_level;
Kovalev_D 23:12e6183f04d4 284 int delta_VB_N;
Kovalev_D 23:12e6183f04d4 285
Kovalev_D 23:12e6183f04d4 286 delta_VB_N = mult_r(Device_blk.Str.K_vb_tu >> DITH_VBN_SHIFT, (Temp_Aver - Device_blk.Str.TemperNormal)); //r.200;
Kovalev_D 23:12e6183f04d4 287 //r. !!! ñäåëàòü ñóììèðîâàíèå ñ íàñûùåíèåì, à çàòåì ñäâèã
Kovalev_D 23:12e6183f04d4 288 min_level = VB_Nmin0 + delta_VB_N;
Kovalev_D 23:12e6183f04d4 289 max_level = VB_Nmax0 + delta_VB_N;
Kovalev_D 23:12e6183f04d4 290 // maximum saturation for unsigned levels
Kovalev_D 23:12e6183f04d4 291 Max_Saturation(&min_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT)-1); // min should be always less then max_level by 1
Kovalev_D 23:12e6183f04d4 292 Max_Saturation(&max_level, ((unsigned int)0xFFFF >> DITH_VBN_SHIFT));
Kovalev_D 23:12e6183f04d4 293 Device_blk.Str.VB_Nmin = min_level << DITH_VBN_SHIFT;
Kovalev_D 23:12e6183f04d4 294 Device_blk.Str.VB_Nmax = max_level << DITH_VBN_SHIFT;
Kovalev_D 23:12e6183f04d4 295
Kovalev_D 23:12e6183f04d4 296 } // DithFreqRange_calc