![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
forkd
Fork of LGstaandart by
Diff: PLC_reg.c
- Revision:
- 1:f2adcae3d304
- Parent:
- 0:8ad47e2b6f00
- Child:
- 21:bc8c1cec3da6
diff -r 8ad47e2b6f00 -r f2adcae3d304 PLC_reg.c --- a/PLC_reg.c Sat Jan 30 13:00:39 2016 +0000 +++ b/PLC_reg.c Sat Jan 30 13:53:19 2016 +0000 @@ -13,33 +13,30 @@ ** **-------------------------------------------------------------------------------------------------------- *********************************************************************************************************/ -#include "mathDSP.h" -#include "CyclesSync.h" -#include "ThermoCalc.h" -#include "CntrlGLD.h" -#include "InputOutput.h" -#include <math.h> +#include "Global.h" + -#define CONFIG_HFO_REG //r. èçìåíÿåì êîýôôèöèåíò ïåðåäà÷è êîíòóðà ÃÂ× îò íîìèíàëüíîãî íà âðåìÿ îáíóëåíèÿ + +#define CONFIG_HFO_REG //r. �������� ����������� �������� ������� ��� �� ������������ �� ����� ��������� #define WP_TRANSITION_ENA // - //e.--- constants for the CPLC regulator ------------------------------------------------------- //r.--- êîíñòàíòû äëÿ êîíòóðà ÑÐÏ ------------------------------------------------------- + //e.--- constants for the CPLC regulator ------------------------------------------------------- //r.--- ��������� ��� ������� ��� ------------------------------------------------------- #define PLC_SHIFT (6) -#define PLC_PHASE_DET_SHIFT (18) //e. 18 - for analog output //r. 18 - äëÿ àíàëîãîâîãî +#define PLC_PHASE_DET_SHIFT (18) //e. 18 - for analog output //r. 18 - ��� ����������� -#define PLC_RESET_THRESHOLD (-3276) //e. correspond to the voltage +1.2 Volts //r. ñîîòâåòñòâóåò íàïðÿæåíèþ +1.2 âîëüòà +#define PLC_RESET_THRESHOLD (-3276) //e. correspond to the voltage +1.2 Volts //r. ������������� ���������� +1.2 ������ #define WP_REG32MAX_SATURATION (32767 << PLC_SHIFT) #define WP_REG32MIN_NEW_SATURATION (PLC_RESET_THRESHOLD << PLC_SHIFT) -#define WP_TMP_THRESHOLD (7) //e. temperature threshold, defining heats up or cool down the device //r. òåìïåðàòóðíûé ïîðîã, îïðåäåëÿþùèé íàãðåâàåòñÿ èëè îõëàæäàåòñÿ ïðèáîð +#define WP_TMP_THRESHOLD (7) //e. temperature threshold, defining heats up or cool down the device //r. ������������� �����, ������������ ����������� ��� ����������� ������ #define debugPLC int WP_reg32; - int WP_Phase_Det; //e. output of the phase detector of the CPLC (in a digital kind)//r. âûõîä ôàçîâîãî äåòåêòîðà ÑÐÏ (â öèôðîâîì âèäå) - int WP_reset_heating; //e. voltage of reset at heating //r. íàïðÿæåíèå ñáðîñà ïðè íàãðåâàíèè - int WP_reset_cooling; //e. voltage of reset at cooling //r. íàïðÿæåíèå ñáðîñà ïðè îõëàæäåíèè + int WP_Phase_Det; //e. output of the phase detector of the CPLC (in a digital kind)//r. ����� �������� ��������� ��� (� �������� ����) + int WP_reset_heating; //e. voltage of reset at heating //r. ���������� ������ ��� ���������� + int WP_reset_cooling; //e. voltage of reset at cooling //r. ���������� ������ ��� ���������� int MaxDelayPLC; int sin_func[100]; @@ -59,38 +56,38 @@ void init_PLC(void) { int i; - //( 1,2 âîëüòà) - if (Device_blk.Str.WP_reset < PLC_RESET_THRESHOLD) //e. íàïðÿæåíèå ïîñëå ñáðîñà íà íàãðåâàòåëå íå äîëæíî ïðåâûøàòü 1,2 âîëüòà. - //(èñõîäíîå çíà÷åíèå ðåãóëÿòîðà ÑÐÏ (ïîñëå ñáðîñà)) < (-3276). + //( 1,2 ������) + if (Device_blk.Str.WP_reset < PLC_RESET_THRESHOLD) //e. ���������� ����� ������ �� ����������� �� ������ ��������� 1,2 ������. + //(�������� �������� ���������� ��� (����� ������)) < (-3276). { Device_blk.Str.WP_reset = PLC_RESET_THRESHOLD + 1;//(-3275) } -//íàïðÿæåíèå íà ÑÐÏ = (ìèí. çíà÷åíèå íà íàãðåâàòåëå + ìàõ. çíà÷åíèå íà íàãðåâàòåëå)/2 +//���������� �� ��� = (���. �������� �� ����������� + ���. �������� �� �����������)/2 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 - // íàïðÿæåíèå íà ÑÐÏ << 6 + // ���������� �� ��� << 6 WP_reg32 = Output.Str.WP_reg<<PLC_SHIFT; - if ((Device_blk.Str.PI_b3>100)||(Device_blk.Str.PI_b3<10)) //e. Åñëè òðåáóåìàÿ ÷àñòîòà ìîäóëÿòîðà ÑÐÏ áîëüøå 1kHz èëè ìåíüøå 100Hz - Device_blk.Str.PI_b3 = 40; //e. Óñòàíîâèòü ÷àñòîòó â 250Hz (÷àñòîòà äðåáåçäåíèÿ) + if ((Device_blk.Str.PI_b3>100)||(Device_blk.Str.PI_b3<10)) //e. ���� ��������� ������� ���������� ��� ������ 1kHz ��� ������ 100Hz + Device_blk.Str.PI_b3 = 40; //e. ���������� ������� � 250Hz (������� �����������) - for (i = 0; i<Device_blk.Str.PI_b3; i++) //e. Ñêàíèðîâàíèå ÑÐÏ ñèãíàëà + for (i = 0; i<Device_blk.Str.PI_b3; i++) //e. ������������ ��� ������� { - float temp = sin((float)i*2.0*PI/(float)Device_blk.Str.PI_b3); /// âû÷èñëåíèå çíà÷åíèé ñèíóñà - /// äëÿ ÷àñòîòû ìîäóëÿòîðà ñðï (PI_b3), - sin_func[i] = (int)(temp*32767); /// è êàëèáðîâêà ýòèõ çíà÷åíèé äëÿ ÀÖÏ. + float temp = sin((float)i*2.0*PI/(float)Device_blk.Str.PI_b3); /// ���������� �������� ������ + /// ��� ������� ���������� ��� (PI_b3), + sin_func[i] = (int)(temp*32767); /// � ���������� ���� �������� ��� ���. if (sin_func[i] < 0) sin_func[i] += 65536; } //e. calculation of filter coefficients for PLC // 250 Hz 10 KHz - init_BandPass( 1.0/(float)Device_blk.Str.PI_b3, 10.0/(float)(DEVICE_SAMPLE_RATE_HZ), PLC); //ïîëîñîôîé ôèëüòð äëÿ âûäåëåíèÿ ÷àñòîòû êîëåáàíèÿ ìîäóëÿòîðà - //è îïðåäåëåíèå êîýôèöèåíòîâ(aPLC[0-2] è bPLC[0-2]) - //(äðåáåçäåíèå ñðï äëÿ îïðåäåëåíèÿ ãðåòü èëè îõëîæäàòü îñíîâíîé ýëåìåíò óïðàâëåíèÿ.) + init_BandPass( 1.0/(float)Device_blk.Str.PI_b3, 10.0/(float)(DEVICE_SAMPLE_RATE_HZ), PLC); //��������� ������ ��� ��������� ������� ��������� ���������� + //� ����������� ������������(aPLC[0-2] � bPLC[0-2]) + //(����������� ��� ��� ����������� ����� ��� ��������� �������� ������� ����������.) 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 - // ïåðâûå 10 ñåêóíä ðàáîòàòü ñ êîýôèöèåíòîì ïåðåäà÷è * 2 + // ������ 10 ������ �������� � ������������ �������� * 2 MaxDelayPLC = Device_blk.Str.PI_b3>>1; //e. max expected delay for phase detector output } // init_PLC @@ -113,10 +110,10 @@ return (flag); } - //e. check whether delay exceeds the greatest possible value //r. ïðîâåðêà íå ïðåâîñõîäèò ëè çàäåðæêà ìàêñèìàëüíî âîçìîæíóþ + //e. check whether delay exceeds the greatest possible value //r. �������� �� ����������� �� �������� ����������� ��������� if (Device_blk.Str.WP_ref > MaxDelayPLC) { Device_blk.Str.WP_ref = MaxDelayPLC; } - if (flag) //e. outgoing poz_sin_flag flag, which delayed by the WP_ref //r. ôîðìèðîâàíèå çàäåðæàííîãî íà âåëè÷èíó WP_ref ôëàãà poz_sin_flag + if (flag) //e. outgoing poz_sin_flag flag, which delayed by the WP_ref //r. ������������ ������������ �� �������� WP_ref ����� poz_sin_flag { neg_counter = 0; poz_counter++; @@ -151,10 +148,10 @@ static int plc_reset32; static enum - { //r. ñîñòîÿíèå ëèíåéíîãî ïåðåõîäà ïðè îáíóëåíèè ÑÐÏ - FINISHED, //r. ëèíåéíûé ïåðåõîä çàâåðøåí - TRANS_HEATING, //r. ïåðåõîä âûïîëíÿåòñÿ ïðè íàãðåâàíèè - TRANS_COOLING //r. ïåðåõîä âûïîëíÿåòñÿ ïðè îõëàæäåíèè + { //r. ��������� ��������� �������� ��� ��������� ��� + FINISHED, //r. �������� ������� �������� + TRANS_HEATING, //r. ������� ����������� ��� ���������� + TRANS_COOLING //r. ������� ����������� ��� ���������� } plc_transiton = FINISHED; // int i; @@ -168,7 +165,7 @@ poz_sin_flag = 1; } - //r. ïîëîñîâîé ôèëüòð äëÿ êîíòóðà ÑÐÏ + //r. ��������� ������ ��� ������� ��� WP_Phase_Det = PLC_PhaseDetFilt(/*Output.Str.WP_sin*/Input.StrIn.WP_sel); @@ -191,34 +188,34 @@ } // from this WP_Phase_Det - demodulated signal like LIDEM_DIG - if (!is_zeroing) //r. Íå ïîðà âûïîëíÿòü îáíóëåíèå - { //r. íåò îáíóëåíèÿ - if ((WP_reg32 > (Device_blk.Str.WP_rup << PLC_SHIFT)) && IsHeating) //r. ïðîèñõîäèò íàãðåâàíèå + if (!is_zeroing) //r. �� ���� ��������� ��������� + { //r. ��� ��������� + if ((WP_reg32 > (Device_blk.Str.WP_rup << PLC_SHIFT)) && IsHeating) //r. ���������� ���������� { is_zeroing = 1; - //r. íàïðÿæåíèå ñáðîñà ïðè íàãðåâàíèè + //r. ���������� ������ ��� ���������� WP_reset_heating = CPL_reset_calc(Device_blk.Str.WP_reset, Device_blk.Str.K_WP_rst_heating, Temp_Aver, Device_blk.Str.TemperNormal); plc_transiton = TRANS_HEATING; plc_reset32 = WP_reset_heating << PLC_SHIFT;; - Device_blk.Str.HF_scl = Device_blk.Str.HF_scl_2; //r. èçìåíÿåì êîýôôèöèåíò ïåðåäà÷è êîíòóðà ÃÂ× îò íîìèíàëüíîãî íà âðåìÿ îáíóëåíèÿ + Device_blk.Str.HF_scl = Device_blk.Str.HF_scl_2; //r. �������� ����������� �������� ������� ��� �� ������������ �� ����� ��������� } - else if ((WP_reg32 < (Device_blk.Str.WP_rdw << PLC_SHIFT)) && !IsHeating) //r. îõëàæäåíèå + else if ((WP_reg32 < (Device_blk.Str.WP_rdw << PLC_SHIFT)) && !IsHeating) //r. ���������� { is_zeroing = 1; - //r. íàïðÿæåíèå ñáðîñà ïðè îõëàæäåíèè + //r. ���������� ������ ��� ���������� WP_reset_cooling = CPL_reset_calc(Device_blk.Str.WP_reset2, Device_blk.Str.K_WP_rst_cooling, Temp_Aver, Device_blk.Str.TemperNormal); plc_transiton = TRANS_COOLING; plc_reset32 = WP_reset_cooling << PLC_SHIFT; - Device_blk.Str.HF_scl = Device_blk.Str.HF_scl_2; //r. èçìåíÿåì êîýôôèöèåíò ïåðåäà÷è êîíòóðà ÃÂ× îò íîìèíàëüíîãî íà âðåìÿ îáíóëåíèÿ + Device_blk.Str.HF_scl = Device_blk.Str.HF_scl_2; //r. �������� ����������� �������� ������� ��� �� ������������ �� ����� ��������� } - else //r. ïîðîãè íå ïðåâûøåíû, îáû÷íàÿ ðàáîòà êîíòóðà + else //r. ������ �� ���������, ������� ������ ������� WP_reg32 = L_mac(WP_reg32, phase_Digital, Device_blk.Str.WP_scl ); // WP_reg32 += phase_Digital * Device_blk.Str.WP_scl; } - else //r. ôëàã óñòàíîâëåí (1) - ðåæèì îáíóëåíèÿ + else //r. ���� ���������� (1) - ����� ��������� { if (plc_transiton != FINISHED) @@ -251,32 +248,32 @@ { zero_delay++; } - else //e. resetting was completed //r. îáíóëåíèå çàêîí÷èëîñü + else //e. resetting was completed //r. ��������� ����������� { is_zeroing = 0; - //e. save the temperature for further comparison //r. çàïîìèíàåì òåìïåðàòóðó äëÿ äàëüíåéøåãî ñðàâíåíèÿ + //e. save the temperature for further comparison //r. ���������� ����������� ��� ����������� ��������� // TempOfReset = Temp_Aver; //r.x. Temp5_Aver; //r. Tmp_Out[TSENS_NUMB]; // T4; - //r.x Zero_Numb_dbg++; // òàê ìîæíî ïîäñ÷èòûâàòü ÷èñëî îáíóëåíèé + //r.x Zero_Numb_dbg++; // ��� ����� ������������ ����� ��������� - // DithFreqRangeCalc(); //e. calculation of range of the division factor for the dither drive frequency, depending on current temperature //r. ðàñ÷åò ãðàíèö êîýôôèöèåíòà äåëåíèÿ äëÿ ÷àñòîòû âèáðîïðèâîäà, çàâèñÿùèõ îò òåêóùåé òåìïåðàòóðû + // DithFreqRangeCalc(); //e. calculation of range of the division factor for the dither drive frequency, depending on current temperature //r. ������ ������ ������������ ������� ��� ������� ������������, ��������� �� ������� ����������� } } - 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 + 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 - if ( loop_is_closed(WP_REG_ON) ) //e. the regulator loop is closed //r. êîíòóð çàìêíóò + if ( loop_is_closed(WP_REG_ON) ) //e. the regulator loop is closed //r. ������ ������� { - Output.Str.WP_reg = (int)(WP_reg32 >> PLC_SHIFT); //e. we use as controlling - voltages of the integrator //r. èñïîëüçóåì êàê óïðàâëÿþùåå - íàïðÿæåíèÿ èíòåãðàòîðà + Output.Str.WP_reg = (int)(WP_reg32 >> PLC_SHIFT); //e. we use as controlling - voltages of the integrator //r. ���������� ��� ����������� - ���������� ����������� } - else //e. the regulator loop is open //r. êîíòóð ðàçîìêíóò + else //e. the regulator loop is open //r. ������ ��������� { - WP_reg32 = Output.Str.WP_reg << PLC_SHIFT; //e. set the previous value of the WP_reg //r. ïðèñâàèâàåì ïðåäûäóùåå çíà÷åíèå WP_reg + WP_reg32 = Output.Str.WP_reg << PLC_SHIFT; //e. set the previous value of the WP_reg //r. ����������� ���������� �������� WP_reg } - //e. integartion of output of the PD of the CPLC regulator for the technological output on the Rate command //r. èíòåãðèðîâàíèå âûõîäà ÔÄ êîíòóðà ÑÐÏ äëÿ òåõíîëîãè÷åñêîãî âûâîäà ïî êîìàíäå Rate + //e. integartion of output of the PD of the CPLC regulator for the technological output on the Rate command //r. �������������� ������ �� ������� ��� ��� ���������������� ������ �� ������� Rate Output.Str.WP_pll = WP_PhaseDetectorRate( WP_Phase_Det, time_1_Sec); @@ -291,7 +288,7 @@ ** Returned value: code to DAC ** ******************************************************************************/ -int Signal_2_Oscill() //e. the signal for the control by scope on DAC output (was DS) //r. ñèãíàë äëÿ êîíòðîëÿ îñöèëëîãðàôîì íà âûõîäå ÖÀÏ (áûâøèé ÄÓÏ) +int Signal_2_Oscill() //e. the signal for the control by scope on DAC output (was DS) //r. ������ ��� �������� ������������� �� ������ ��� (������ ���) { // Scope_Mode var not used now, reserved for future applications return (-WP_Phase_Det << 2);