Dmitry Kovalev
/
LGfiltr
forkd
Fork of LGstaandart by
PLC_reg.c@1:f2adcae3d304, 2016-01-30 (annotated)
- 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?
User | Revision | Line number | New 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 |