forkd

Dependencies:   mbed

Fork of LGstaandart by Dmitry Kovalev

Committer:
igor_v
Date:
Sat Jan 30 13:53:19 2016 +0000
Revision:
1:f2adcae3d304
Parent:
0:8ad47e2b6f00
Child:
21:bc8c1cec3da6
123

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igor_v 0:8ad47e2b6f00 1 /****************************************Copyright (c)****************************************************
igor_v 0:8ad47e2b6f00 2 **--------------File Info---------------------------------------------------------------------------------
igor_v 0:8ad47e2b6f00 3 ** File name: PLC_reg.c
igor_v 0:8ad47e2b6f00 4 ** Last modified Date: 2011-09-26
igor_v 0:8ad47e2b6f00 5 ** Last Version: V1.00
igor_v 0:8ad47e2b6f00 6 ** Descriptions: Routines for system of perimeter regulating unit
igor_v 0:8ad47e2b6f00 7 **
igor_v 0:8ad47e2b6f00 8 **--------------------------------------------------------------------------------------------------------
igor_v 0:8ad47e2b6f00 9 ** Created by: Electrooptica Incorp.
igor_v 0:8ad47e2b6f00 10 ** Created date: 2011-09-26
igor_v 0:8ad47e2b6f00 11 ** Version: V1.00
igor_v 0:8ad47e2b6f00 12 ** Descriptions:
igor_v 0:8ad47e2b6f00 13 **
igor_v 0:8ad47e2b6f00 14 **--------------------------------------------------------------------------------------------------------
igor_v 0:8ad47e2b6f00 15 *********************************************************************************************************/
igor_v 1:f2adcae3d304 16 #include "Global.h"
igor_v 1:f2adcae3d304 17
igor_v 0:8ad47e2b6f00 18
igor_v 1:f2adcae3d304 19
igor_v 1:f2adcae3d304 20 #define CONFIG_HFO_REG //r. �������� ����������� �������� ������� ��� �� ������������ �� ����� ���������
igor_v 0:8ad47e2b6f00 21 #define WP_TRANSITION_ENA //
igor_v 0:8ad47e2b6f00 22
igor_v 1:f2adcae3d304 23 //e.--- constants for the CPLC regulator ------------------------------------------------------- //r.--- ��������� ��� ������� ��� -------------------------------------------------------
igor_v 0:8ad47e2b6f00 24
igor_v 0:8ad47e2b6f00 25 #define PLC_SHIFT (6)
igor_v 1:f2adcae3d304 26 #define PLC_PHASE_DET_SHIFT (18) //e. 18 - for analog output //r. 18 - ��� �����������
igor_v 0:8ad47e2b6f00 27
igor_v 1:f2adcae3d304 28 #define PLC_RESET_THRESHOLD (-3276) //e. correspond to the voltage +1.2 Volts //r. ������������� ���������� +1.2 ������
igor_v 0:8ad47e2b6f00 29 #define WP_REG32MAX_SATURATION (32767 << PLC_SHIFT)
igor_v 0:8ad47e2b6f00 30 #define WP_REG32MIN_NEW_SATURATION (PLC_RESET_THRESHOLD << PLC_SHIFT)
igor_v 1:f2adcae3d304 31 #define WP_TMP_THRESHOLD (7) //e. temperature threshold, defining heats up or cool down the device //r. ������������� �����, ������������ ����������� ��� ����������� ������
igor_v 0:8ad47e2b6f00 32
igor_v 0:8ad47e2b6f00 33
igor_v 0:8ad47e2b6f00 34 #define debugPLC
igor_v 0:8ad47e2b6f00 35
igor_v 0:8ad47e2b6f00 36 int WP_reg32;
igor_v 1:f2adcae3d304 37 int WP_Phase_Det; //e. output of the phase detector of the CPLC (in a digital kind)//r. ����� �������� ��������� ��� (� �������� ����)
igor_v 1:f2adcae3d304 38 int WP_reset_heating; //e. voltage of reset at heating //r. ���������� ������ ��� ����������
igor_v 1:f2adcae3d304 39 int WP_reset_cooling; //e. voltage of reset at cooling //r. ���������� ������ ��� ����������
igor_v 0:8ad47e2b6f00 40 int MaxDelayPLC;
igor_v 0:8ad47e2b6f00 41 int sin_func[100];
igor_v 0:8ad47e2b6f00 42
igor_v 0:8ad47e2b6f00 43 int phase_Digital;
igor_v 0:8ad47e2b6f00 44
igor_v 0:8ad47e2b6f00 45 int WP_PhaseDetectorRate(int PhaseDetInput, int IntegrateTime);
igor_v 0:8ad47e2b6f00 46
igor_v 0:8ad47e2b6f00 47 /******************************************************************************
igor_v 0:8ad47e2b6f00 48 ** Function name: init_PLC
igor_v 0:8ad47e2b6f00 49 **
igor_v 0:8ad47e2b6f00 50 ** Descriptions: Initialization procedure for PLC regulator
igor_v 0:8ad47e2b6f00 51 **
igor_v 0:8ad47e2b6f00 52 ** Parameters: None
igor_v 0:8ad47e2b6f00 53 ** Returned value: None
igor_v 0:8ad47e2b6f00 54 **
igor_v 0:8ad47e2b6f00 55 ******************************************************************************/
igor_v 0:8ad47e2b6f00 56 void init_PLC(void)
igor_v 0:8ad47e2b6f00 57 {
igor_v 0:8ad47e2b6f00 58 int i;
igor_v 1:f2adcae3d304 59 //( 1,2 ������)
igor_v 1:f2adcae3d304 60 if (Device_blk.Str.WP_reset < PLC_RESET_THRESHOLD) //e. ���������� ����� ������ �� ����������� �� ������ ��������� 1,2 ������.
igor_v 1:f2adcae3d304 61 //(�������� �������� ���������� ��� (����� ������)) < (-3276).
igor_v 0:8ad47e2b6f00 62 {
igor_v 0:8ad47e2b6f00 63 Device_blk.Str.WP_reset = PLC_RESET_THRESHOLD + 1;//(-3275)
igor_v 0:8ad47e2b6f00 64 }
igor_v 1:f2adcae3d304 65 //���������� �� ��� = (���. �������� �� ����������� + ���. �������� �� �����������)/2
igor_v 0:8ad47e2b6f00 66 Output.Str.WP_reg = (Device_blk.Str.WP_rup + Device_blk.Str.WP_rdw) >> 1; //e. WP_reg start voltage is (WP_rup - WP_rdw)/2
igor_v 0:8ad47e2b6f00 67
igor_v 1:f2adcae3d304 68 // ���������� �� ��� << 6
igor_v 0:8ad47e2b6f00 69 WP_reg32 = Output.Str.WP_reg<<PLC_SHIFT;
igor_v 0:8ad47e2b6f00 70
igor_v 1:f2adcae3d304 71 if ((Device_blk.Str.PI_b3>100)||(Device_blk.Str.PI_b3<10)) //e. ���� ��������� ������� ���������� ��� ������ 1kHz ��� ������ 100Hz
igor_v 1:f2adcae3d304 72 Device_blk.Str.PI_b3 = 40; //e. ���������� ������� � 250Hz (������� �����������)
igor_v 0:8ad47e2b6f00 73
igor_v 1:f2adcae3d304 74 for (i = 0; i<Device_blk.Str.PI_b3; i++) //e. ������������ ��� �������
igor_v 0:8ad47e2b6f00 75 {
igor_v 1:f2adcae3d304 76 float temp = sin((float)i*2.0*PI/(float)Device_blk.Str.PI_b3); /// ���������� �������� ������
igor_v 1:f2adcae3d304 77 /// ��� ������� ���������� ��� (PI_b3),
igor_v 1:f2adcae3d304 78 sin_func[i] = (int)(temp*32767); /// � ���������� ���� �������� ��� ���.
igor_v 0:8ad47e2b6f00 79 if (sin_func[i] < 0)
igor_v 0:8ad47e2b6f00 80 sin_func[i] += 65536;
igor_v 0:8ad47e2b6f00 81 }
igor_v 0:8ad47e2b6f00 82
igor_v 0:8ad47e2b6f00 83 //e. calculation of filter coefficients for PLC
igor_v 0:8ad47e2b6f00 84 // 250 Hz 10 KHz
igor_v 1:f2adcae3d304 85 init_BandPass( 1.0/(float)Device_blk.Str.PI_b3, 10.0/(float)(DEVICE_SAMPLE_RATE_HZ), PLC); //��������� ������ ��� ��������� ������� ��������� ����������
igor_v 1:f2adcae3d304 86 //� ����������� ������������(aPLC[0-2] � bPLC[0-2])
igor_v 1:f2adcae3d304 87 //(����������� ��� ��� ����������� ����� ��� ��������� �������� ������� ����������.)
igor_v 0:8ad47e2b6f00 88
igor_v 0:8ad47e2b6f00 89 Device_blk.Str.WP_scl <<= 1; //e. during fist 10 seconds after start we state Device_blk.Str.WP_scl = 2*Device_blk.Str.WP_scl
igor_v 1:f2adcae3d304 90 // ������ 10 ������ �������� � ������������ �������� * 2
igor_v 0:8ad47e2b6f00 91
igor_v 0:8ad47e2b6f00 92 MaxDelayPLC = Device_blk.Str.PI_b3>>1; //e. max expected delay for phase detector output
igor_v 0:8ad47e2b6f00 93 } // init_PLC
igor_v 0:8ad47e2b6f00 94
igor_v 0:8ad47e2b6f00 95 /******************************************************************************
igor_v 0:8ad47e2b6f00 96 ** Function name: PLC_MeanderDelay
igor_v 0:8ad47e2b6f00 97 **
igor_v 0:8ad47e2b6f00 98 ** Descriptions: Outgoing of the delayed meander signal for the PLC regulator
igor_v 0:8ad47e2b6f00 99 **
igor_v 0:8ad47e2b6f00 100 ** parameters: Input value
igor_v 0:8ad47e2b6f00 101 ** Returned value: Delayed value
igor_v 0:8ad47e2b6f00 102 **
igor_v 0:8ad47e2b6f00 103 ******************************************************************************/
igor_v 0:8ad47e2b6f00 104 int PLC_MeanderDelay(int flag)
igor_v 0:8ad47e2b6f00 105 {
igor_v 0:8ad47e2b6f00 106 static int poz_counter = 0, neg_counter = 0, flg_delay;
igor_v 0:8ad47e2b6f00 107
igor_v 0:8ad47e2b6f00 108 if (Device_blk.Str.WP_ref == 0)
igor_v 0:8ad47e2b6f00 109 {
igor_v 0:8ad47e2b6f00 110 return (flag);
igor_v 0:8ad47e2b6f00 111 }
igor_v 0:8ad47e2b6f00 112
igor_v 1:f2adcae3d304 113 //e. check whether delay exceeds the greatest possible value //r. �������� �� ����������� �� �������� ����������� ���������
igor_v 0:8ad47e2b6f00 114 if (Device_blk.Str.WP_ref > MaxDelayPLC) { Device_blk.Str.WP_ref = MaxDelayPLC; }
igor_v 0:8ad47e2b6f00 115
igor_v 1:f2adcae3d304 116 if (flag) //e. outgoing poz_sin_flag flag, which delayed by the WP_ref //r. ������������ ������������ �� �������� WP_ref ����� poz_sin_flag
igor_v 0:8ad47e2b6f00 117 {
igor_v 0:8ad47e2b6f00 118 neg_counter = 0;
igor_v 0:8ad47e2b6f00 119 poz_counter++;
igor_v 0:8ad47e2b6f00 120 }
igor_v 0:8ad47e2b6f00 121 else
igor_v 0:8ad47e2b6f00 122 {
igor_v 0:8ad47e2b6f00 123 poz_counter = 0;
igor_v 0:8ad47e2b6f00 124 neg_counter++;
igor_v 0:8ad47e2b6f00 125 }
igor_v 0:8ad47e2b6f00 126 if (poz_counter == Device_blk.Str.WP_ref) { flg_delay = 0; }
igor_v 0:8ad47e2b6f00 127 if (neg_counter == Device_blk.Str.WP_ref) { flg_delay = 1; }
igor_v 0:8ad47e2b6f00 128 return (flg_delay);
igor_v 0:8ad47e2b6f00 129 }
igor_v 0:8ad47e2b6f00 130 /******************************************************************************
igor_v 0:8ad47e2b6f00 131 ** Function name: clc_PLC
igor_v 0:8ad47e2b6f00 132 **
igor_v 0:8ad47e2b6f00 133 ** Descriptions: Procedure of initial processing for the CPLC regulator
igor_v 0:8ad47e2b6f00 134 **
igor_v 0:8ad47e2b6f00 135 ** parameters: None
igor_v 0:8ad47e2b6f00 136 ** Returned value: None
igor_v 0:8ad47e2b6f00 137 **
igor_v 0:8ad47e2b6f00 138 ******************************************************************************/
igor_v 0:8ad47e2b6f00 139 void clc_PLC(void)
igor_v 0:8ad47e2b6f00 140 {
igor_v 0:8ad47e2b6f00 141 static int is_zeroing = 0;
igor_v 0:8ad47e2b6f00 142 static int zero_delay = 0;
igor_v 0:8ad47e2b6f00 143 // static int WP_DelaySin_Array[21] = {0};
igor_v 0:8ad47e2b6f00 144 // int phase_Digital;
igor_v 0:8ad47e2b6f00 145 int poz_sin_flag;
igor_v 0:8ad47e2b6f00 146 int poz_sin_flag_delayed;
igor_v 0:8ad47e2b6f00 147
igor_v 0:8ad47e2b6f00 148
igor_v 0:8ad47e2b6f00 149 static int plc_reset32;
igor_v 0:8ad47e2b6f00 150 static enum
igor_v 1:f2adcae3d304 151 { //r. ��������� ��������� �������� ��� ��������� ���
igor_v 1:f2adcae3d304 152 FINISHED, //r. �������� ������� ��������
igor_v 1:f2adcae3d304 153 TRANS_HEATING, //r. ������� ����������� ��� ����������
igor_v 1:f2adcae3d304 154 TRANS_COOLING //r. ������� ����������� ��� ����������
igor_v 0:8ad47e2b6f00 155 } plc_transiton = FINISHED;
igor_v 0:8ad47e2b6f00 156
igor_v 0:8ad47e2b6f00 157 // int i;
igor_v 0:8ad47e2b6f00 158
igor_v 0:8ad47e2b6f00 159 if (Output.Str.WP_sin >= 32768)
igor_v 0:8ad47e2b6f00 160 {
igor_v 0:8ad47e2b6f00 161 poz_sin_flag = 0;
igor_v 0:8ad47e2b6f00 162 }
igor_v 0:8ad47e2b6f00 163 else
igor_v 0:8ad47e2b6f00 164 {
igor_v 0:8ad47e2b6f00 165 poz_sin_flag = 1;
igor_v 0:8ad47e2b6f00 166 }
igor_v 0:8ad47e2b6f00 167
igor_v 1:f2adcae3d304 168 //r. ��������� ������ ��� ������� ���
igor_v 0:8ad47e2b6f00 169 WP_Phase_Det = PLC_PhaseDetFilt(/*Output.Str.WP_sin*/Input.StrIn.WP_sel);
igor_v 0:8ad47e2b6f00 170
igor_v 0:8ad47e2b6f00 171
igor_v 0:8ad47e2b6f00 172 if (WP_Phase_Det >0)
igor_v 0:8ad47e2b6f00 173 { //r. WP_sel>0
igor_v 0:8ad47e2b6f00 174 phase_Digital = 1;
igor_v 0:8ad47e2b6f00 175 }
igor_v 0:8ad47e2b6f00 176 else
igor_v 0:8ad47e2b6f00 177 {
igor_v 0:8ad47e2b6f00 178 phase_Digital = -1;
igor_v 0:8ad47e2b6f00 179 }
igor_v 0:8ad47e2b6f00 180 // from this WP_Phase_Det - modulated signal like LIM_DIG
igor_v 0:8ad47e2b6f00 181
igor_v 0:8ad47e2b6f00 182 poz_sin_flag_delayed = PLC_MeanderDelay(poz_sin_flag);
igor_v 0:8ad47e2b6f00 183
igor_v 0:8ad47e2b6f00 184 if(poz_sin_flag_delayed)
igor_v 0:8ad47e2b6f00 185 {
igor_v 0:8ad47e2b6f00 186 WP_Phase_Det = -WP_Phase_Det;
igor_v 0:8ad47e2b6f00 187 phase_Digital = -phase_Digital;
igor_v 0:8ad47e2b6f00 188 }
igor_v 0:8ad47e2b6f00 189 // from this WP_Phase_Det - demodulated signal like LIDEM_DIG
igor_v 0:8ad47e2b6f00 190
igor_v 1:f2adcae3d304 191 if (!is_zeroing) //r. �� ���� ��������� ���������
igor_v 1:f2adcae3d304 192 { //r. ��� ���������
igor_v 1:f2adcae3d304 193 if ((WP_reg32 > (Device_blk.Str.WP_rup << PLC_SHIFT)) && IsHeating) //r. ���������� ����������
igor_v 0:8ad47e2b6f00 194 {
igor_v 0:8ad47e2b6f00 195 is_zeroing = 1;
igor_v 1:f2adcae3d304 196 //r. ���������� ������ ��� ����������
igor_v 0:8ad47e2b6f00 197 WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal);
igor_v 0:8ad47e2b6f00 198 plc_transiton = TRANS_HEATING;
igor_v 0:8ad47e2b6f00 199 plc_reset32 = WP_reset_heating << PLC_SHIFT;;
igor_v 0:8ad47e2b6f00 200
igor_v 1:f2adcae3d304 201 Device_blk.Str.HF_scl = Device_blk.Str.HF_scl_2; //r. �������� ����������� �������� ������� ��� �� ������������ �� ����� ���������
igor_v 0:8ad47e2b6f00 202 }
igor_v 1:f2adcae3d304 203 else if ((WP_reg32 < (Device_blk.Str.WP_rdw << PLC_SHIFT)) && !IsHeating) //r. ����������
igor_v 0:8ad47e2b6f00 204 {
igor_v 0:8ad47e2b6f00 205 is_zeroing = 1;
igor_v 1:f2adcae3d304 206 //r. ���������� ������ ��� ����������
igor_v 0:8ad47e2b6f00 207 WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal);
igor_v 0:8ad47e2b6f00 208
igor_v 0:8ad47e2b6f00 209 plc_transiton = TRANS_COOLING;
igor_v 0:8ad47e2b6f00 210 plc_reset32 = WP_reset_cooling << PLC_SHIFT;
igor_v 0:8ad47e2b6f00 211
igor_v 1:f2adcae3d304 212 Device_blk.Str.HF_scl = Device_blk.Str.HF_scl_2; //r. �������� ����������� �������� ������� ��� �� ������������ �� ����� ���������
igor_v 0:8ad47e2b6f00 213 }
igor_v 1:f2adcae3d304 214 else //r. ������ �� ���������, ������� ������ �������
igor_v 0:8ad47e2b6f00 215 WP_reg32 = L_mac(WP_reg32, phase_Digital, Device_blk.Str.WP_scl ); // WP_reg32 += phase_Digital * Device_blk.Str.WP_scl;
igor_v 0:8ad47e2b6f00 216
igor_v 0:8ad47e2b6f00 217 }
igor_v 1:f2adcae3d304 218 else //r. ���� ���������� (1) - ����� ���������
igor_v 0:8ad47e2b6f00 219 {
igor_v 0:8ad47e2b6f00 220
igor_v 0:8ad47e2b6f00 221 if (plc_transiton != FINISHED)
igor_v 0:8ad47e2b6f00 222 {
igor_v 0:8ad47e2b6f00 223 if (plc_transiton == TRANS_HEATING)
igor_v 0:8ad47e2b6f00 224 {
igor_v 0:8ad47e2b6f00 225
igor_v 0:8ad47e2b6f00 226 WP_reg32 = L_sub(WP_reg32, Device_blk.Str.WP_transition_step); // WP_reg32 -= Device_blk.Str.WP_transition_step;
igor_v 0:8ad47e2b6f00 227 if (WP_reg32 < plc_reset32)
igor_v 0:8ad47e2b6f00 228 {
igor_v 0:8ad47e2b6f00 229 zero_delay = 0;
igor_v 0:8ad47e2b6f00 230 plc_transiton = FINISHED; //r.false;
igor_v 0:8ad47e2b6f00 231 WP_reg32 = plc_reset32;
igor_v 0:8ad47e2b6f00 232 }
igor_v 0:8ad47e2b6f00 233 }
igor_v 0:8ad47e2b6f00 234 else // plc_transiton == TRANS_COOLING
igor_v 0:8ad47e2b6f00 235 {
igor_v 0:8ad47e2b6f00 236 WP_reg32 = L_add(WP_reg32, Device_blk.Str.WP_transition_step); // WP_reg32 += Device_blk.Str.WP_transition_step;
igor_v 0:8ad47e2b6f00 237 if (WP_reg32 > plc_reset32)
igor_v 0:8ad47e2b6f00 238 {
igor_v 0:8ad47e2b6f00 239 zero_delay = 0;
igor_v 0:8ad47e2b6f00 240 plc_transiton = FINISHED; //r.false;
igor_v 0:8ad47e2b6f00 241 WP_reg32 = plc_reset32;
igor_v 0:8ad47e2b6f00 242 }
igor_v 0:8ad47e2b6f00 243 }
igor_v 0:8ad47e2b6f00 244 }
igor_v 0:8ad47e2b6f00 245 else
igor_v 0:8ad47e2b6f00 246
igor_v 0:8ad47e2b6f00 247 if (zero_delay < Device_blk.Str.WP_mdy)
igor_v 0:8ad47e2b6f00 248 {
igor_v 0:8ad47e2b6f00 249 zero_delay++;
igor_v 0:8ad47e2b6f00 250 }
igor_v 1:f2adcae3d304 251 else //e. resetting was completed //r. ��������� �����������
igor_v 0:8ad47e2b6f00 252 {
igor_v 0:8ad47e2b6f00 253 is_zeroing = 0;
igor_v 1:f2adcae3d304 254 //e. save the temperature for further comparison //r. ���������� ����������� ��� ����������� ���������
igor_v 0:8ad47e2b6f00 255 // TempOfReset = Temp_Aver; //r.x. Temp5_Aver; //r. Tmp_Out[TSENS_NUMB]; // T4;
igor_v 1:f2adcae3d304 256 //r.x Zero_Numb_dbg++; // ��� ����� ������������ ����� ���������
igor_v 0:8ad47e2b6f00 257
igor_v 1:f2adcae3d304 258 // DithFreqRangeCalc(); //e. calculation of range of the division factor for the dither drive frequency, depending on current temperature //r. ������ ������ ������������ ������� ��� ������� ������������, ��������� �� ������� �����������
igor_v 0:8ad47e2b6f00 259 }
igor_v 0:8ad47e2b6f00 260 }
igor_v 0:8ad47e2b6f00 261
igor_v 1:f2adcae3d304 262 Saturation(WP_reg32, WP_REG32MAX_SATURATION, WP_REG32MIN_NEW_SATURATION); //e. the minimum corresponds to a small negative number, appropriate to PLC_RESET_THRESHOLD //r. ������� ������������� ���������� �������������� �����, �����-�� PLC_RESET_THRESHOLD
igor_v 0:8ad47e2b6f00 263
igor_v 0:8ad47e2b6f00 264
igor_v 1:f2adcae3d304 265 if ( loop_is_closed(WP_REG_ON) ) //e. the regulator loop is closed //r. ������ �������
igor_v 0:8ad47e2b6f00 266 {
igor_v 1:f2adcae3d304 267 Output.Str.WP_reg = (int)(WP_reg32 >> PLC_SHIFT); //e. we use as controlling - voltages of the integrator //r. ���������� ��� ����������� - ���������� �����������
igor_v 0:8ad47e2b6f00 268
igor_v 0:8ad47e2b6f00 269 }
igor_v 1:f2adcae3d304 270 else //e. the regulator loop is open //r. ������ ���������
igor_v 0:8ad47e2b6f00 271 {
igor_v 1:f2adcae3d304 272 WP_reg32 = Output.Str.WP_reg << PLC_SHIFT; //e. set the previous value of the WP_reg //r. ����������� ���������� �������� WP_reg
igor_v 0:8ad47e2b6f00 273
igor_v 0:8ad47e2b6f00 274 }
igor_v 0:8ad47e2b6f00 275
igor_v 1:f2adcae3d304 276 //e. integartion of output of the PD of the CPLC regulator for the technological output on the Rate command //r. �������������� ������ �� ������� ��� ��� ���������������� ������ �� ������� Rate
igor_v 0:8ad47e2b6f00 277
igor_v 0:8ad47e2b6f00 278 Output.Str.WP_pll = WP_PhaseDetectorRate( WP_Phase_Det, time_1_Sec);
igor_v 0:8ad47e2b6f00 279
igor_v 0:8ad47e2b6f00 280 } // clc_PLC
igor_v 0:8ad47e2b6f00 281
igor_v 0:8ad47e2b6f00 282 /******************************************************************************
igor_v 0:8ad47e2b6f00 283 ** Function name: Signal_2_Oscill
igor_v 0:8ad47e2b6f00 284 **
igor_v 0:8ad47e2b6f00 285 ** Descriptions: Procedure of analog worm output
igor_v 0:8ad47e2b6f00 286 **
igor_v 0:8ad47e2b6f00 287 ** parameters: Type of output
igor_v 0:8ad47e2b6f00 288 ** Returned value: code to DAC
igor_v 0:8ad47e2b6f00 289 **
igor_v 0:8ad47e2b6f00 290 ******************************************************************************/
igor_v 1:f2adcae3d304 291 int Signal_2_Oscill() //e. the signal for the control by scope on DAC output (was DS) //r. ������ ��� �������� ������������� �� ������ ��� (������ ���)
igor_v 0:8ad47e2b6f00 292 {
igor_v 0:8ad47e2b6f00 293 // Scope_Mode var not used now, reserved for future applications
igor_v 0:8ad47e2b6f00 294 return (-WP_Phase_Det << 2);
igor_v 0:8ad47e2b6f00 295 } // Signal_2_Oscill
igor_v 0:8ad47e2b6f00 296
igor_v 0:8ad47e2b6f00 297 /******************************************************************************
igor_v 0:8ad47e2b6f00 298 ** Function name: clc_WP_sin
igor_v 0:8ad47e2b6f00 299 **
igor_v 0:8ad47e2b6f00 300 ** Descriptions: Procedure of scan signal generating
igor_v 0:8ad47e2b6f00 301 **
igor_v 0:8ad47e2b6f00 302 ** parameters: None
igor_v 0:8ad47e2b6f00 303 ** Returned value: Current code for scan signal DAC of PLC
igor_v 0:8ad47e2b6f00 304 **
igor_v 0:8ad47e2b6f00 305 ******************************************************************************/
igor_v 0:8ad47e2b6f00 306 int clc_WP_sin(void)
igor_v 0:8ad47e2b6f00 307 {
igor_v 0:8ad47e2b6f00 308 static int index = 0;
igor_v 0:8ad47e2b6f00 309 index++;
igor_v 0:8ad47e2b6f00 310
igor_v 0:8ad47e2b6f00 311 if (index >= 40/*Device_blk.Str.PI_b3*/)
igor_v 0:8ad47e2b6f00 312 index = 0;
igor_v 0:8ad47e2b6f00 313 /* if (index > 20)
igor_v 0:8ad47e2b6f00 314 LPC_GPIO0->FIOSET = (1<<26);
igor_v 0:8ad47e2b6f00 315 else
igor_v 0:8ad47e2b6f00 316 LPC_GPIO0->FIOCLR = (1<<26); */
igor_v 0:8ad47e2b6f00 317 DAC_Output(sin_func[index]); //output to DAC
igor_v 0:8ad47e2b6f00 318
igor_v 0:8ad47e2b6f00 319 return (sin_func[index]);
igor_v 0:8ad47e2b6f00 320 } // clc_WP_sin
igor_v 0:8ad47e2b6f00 321
igor_v 0:8ad47e2b6f00 322 /******************************************************************************
igor_v 0:8ad47e2b6f00 323 ** Function name: WP_PhaseDetectorRate
igor_v 0:8ad47e2b6f00 324 **
igor_v 0:8ad47e2b6f00 325 ** Descriptions: Integartion of output of the PD of the CPLC regulator
igor_v 0:8ad47e2b6f00 326 for the technological output on the Rate command
igor_v 0:8ad47e2b6f00 327 **
igor_v 0:8ad47e2b6f00 328 ** Parameters: Current PD magnitude, period of integration
igor_v 0:8ad47e2b6f00 329 ** Returned value: Integrated magnitude of PD
igor_v 0:8ad47e2b6f00 330 **
igor_v 0:8ad47e2b6f00 331 ******************************************************************************/
igor_v 0:8ad47e2b6f00 332 int WP_PhaseDetectorRate(int PhaseDetInput, int IntegrateTime)
igor_v 0:8ad47e2b6f00 333 {
igor_v 0:8ad47e2b6f00 334
igor_v 0:8ad47e2b6f00 335 static int SampleAndHoldOut = 0;
igor_v 0:8ad47e2b6f00 336 static int WP_PhasDet_integr = 0;//, WP_PhasDetector = 0;
igor_v 0:8ad47e2b6f00 337
igor_v 0:8ad47e2b6f00 338 if (IntegrateTime == DEVICE_SAMPLE_RATE_uks)
igor_v 0:8ad47e2b6f00 339 {
igor_v 0:8ad47e2b6f00 340 SampleAndHoldOut = (int)(WP_PhasDet_integr >> PLC_PHASE_DET_SHIFT);
igor_v 0:8ad47e2b6f00 341 WP_PhasDet_integr = 0;
igor_v 0:8ad47e2b6f00 342 }
igor_v 0:8ad47e2b6f00 343 else
igor_v 0:8ad47e2b6f00 344 {
igor_v 0:8ad47e2b6f00 345 WP_PhasDet_integr += PhaseDetInput;
igor_v 0:8ad47e2b6f00 346 }
igor_v 0:8ad47e2b6f00 347 return (SampleAndHoldOut);
igor_v 0:8ad47e2b6f00 348 } // WP_PhaseDetectorRate
igor_v 0:8ad47e2b6f00 349
igor_v 0:8ad47e2b6f00 350
igor_v 0:8ad47e2b6f00 351