Dmitry Kovalev
/
LGstaandart
forkd
Fork of LG2 by
Diff: tabel.txt
- Revision:
- 209:224e7331a061
- Parent:
- 187:6bfb02c2831c
diff -r 19150d2b528f -r 224e7331a061 tabel.txt --- a/tabel.txt Tue Feb 07 10:11:35 2017 +0000 +++ b/tabel.txt Thu Apr 13 14:14:45 2017 +0000 @@ -151,4 +151,355 @@ | Gyro.In2 | ток в канале 2 | unsigned int | ----------------------------- | Spi.ADC4_Accum - накопленные | | | | | ----------------------------- | данные за такт виброподвеса | | | | | | | -|------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------| \ No newline at end of file +|------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------| + + + + + + + + + + + + + + + +/* + +void PlcRegul(void) + //Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.) +{ + + int templm=0; + int PLC_In; + int tempDac; + if(start<=5) + { + if(ttt) + {// +25 С° + templm = (Gyro.TermoNKU-Gyro.Termo); //дельта + if(templm>0) Gyro.Ktermo=1; + else Gyro.Ktermo=0; + Spi.DAC_B+=templm; + ttt=0; + } + } + + if(!(Gyro.PinReg & PinRegBitL) && (start>0)) start--; + + else if((start==0)) + { + + PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации + Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; //узнаем приращение + Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения + Gyro.PLC_Old = PLC_In; //запоминание значения + if(Gyro.flagGph_W) + { + AD_MAX=0; + Gyro.flagGph_W--; + Gyro.PLC_Error2Mode=3; + } //если изменился коэфициент усиления ФД //3600 (размер моды порядка 3000) + if((Gyro.PLC_Lern < 150) && (Gyro.PLC_Error2Mode != 0)) + { //пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. + + if(Gyro.Ktermo)Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 + else Spi.DAC_B -= 0x3c; + if(AD_MAX < PLC_In){AD_MAX = PLC_In;} //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. + else if ((AD_MAX>PLC_In)&&(AD_MAX>1550800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. + if (r>10) + { + Gyro.PLC_Lern=151; + Gyro.PLC_Error2Mode=3; + } //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска + Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. + } //работает только первые ~30-40 секунд (37 сек). + if (Gyro.PLC_Lern<160) Gyro.PLC_Lern++; + + if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. + else l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) + if((l > 300)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 2107200;k=15;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m + if ((k == 15)&&(Gyro.PLC_Lern > 150)) Spi.DAC_B += 75; //после уменьшения максимальной амплитуды двигаем шевелем цап + else if((k == 1)&&(Gyro.PLC_Lern > 150)) {Spi.DAC_B -= 75; k=0;l=0;} //для быстрог поиска новог максимума. + if(k>0)k--; + + Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами. + + if(Gyro.ModJump==1) { ///прыжок с моды на моду. (-->) + Gyro.OldCuruAngle = Gyro.CuruAngle; + Gyro.ModJump=0; + Spi.DAC_B += 4300; + Gyro.PLC_Error2Mode=1; + Gyro.StopCuruAngle=2; + } + + if(Gyro.ModJump==2) { ///прыжок с моды на моду. (<--) + Gyro.OldCuruAngle = Gyro.CuruAngle; + Gyro.ModJump=0; + Spi.DAC_B -= 5250; + Gyro.PLC_Error2Mode=1; + Gyro.StopCuruAngle=2; + } + + if(Gyro.RgConA&0x8) { // если контур регулирования замкнут + if ( Gyro.PLC_Error2Mode > 0) { Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0;} // если ошибка(нахожление в двух модовом) + else if ( Gyro.PLC_DeltaADD > 0) { Gyro.PLC_ADC_DOld = 1;} + else if ( Gyro.PLC_DeltaADD < 0) { Gyro.PLC_ADC_DOld = -1;} + else { Gyro.PLC_ADC_DOld = 1;} + } + else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} + + ///прыжок с моды на моду. + + + + + + tempADC5=0x7fff-Spi.ADC5; + // контур замкнут включен лазер + if((Gyro.RgConA&0x8) && (tempADC5>1000)) + { + if(Gyro.PlC_MaxD>(50<<17)) { // 3 режим регулирования + tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); + if(tempDac>600) tempDac=600; //ограничение на регулирование если очень большая разница амплитуд + Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) + tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи + flagmod=3; + } + else if(Gyro.PlC_MaxD>(12<<17)) { // 2 режим регулирования + tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); + Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac); + tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи + flagmod=2; + } + else if(Gyro.PlC_MaxD<(2<<17)) { //режим если дельта равна 0; + tempDac=2; + Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; + flagmod=0; + } + else { + tempDac=2; // 1 режим регулирования + Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; + tempDac = Gyro.PLC_ADC_DOld * tempDac; + flagmod=1; + } + } + + + if ( Spi.DAC_B < 15300 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} //проверка на переваливание за границу. + else if ( Spi.DAC_B > 53000) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} + +} + if(Gyro.StopCuruAngle) {Gyro.CuruAngle = Gyro.OldCuruAngle; Gyro.StopCuruAngle--;} + /////////////////////// + //////////лог////////// + /////////////////////// + if(Gyro.LogPLC==1) { + + sprintf((Time),"%d %d %d %d %d %d %d %d %d \r\n",Gyro.CuruAngle, Gyro.Frq, Gyro.MaxAmp, Spi.DAC_B, tempDac, flagmod, AD_MAX, PLC_In, Gyro.Termo);//выдаем в терминал для постройки граффика регулировки периметра. + Gyro.CuruAngle=0; + Gyro.tempdelta=0; + Gyro.tempdelta2=0; + WriteCon(Time); + + } +} + + + +*/ + + + + +void CalcAmpD(void) +{ + // GyroP.Str.wall++; + // if(GyroP.Str.wall>16) + // { + // GyroP.Str.wall=0; + // klk++; + // if(klk>32) klk = 0; + // } + unsigned int Nmax=0; + Gyro.AmpPerDel = ModArrayTriangle[klk]; + + tempi++; + srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин. + Gyro.AmpT = (rand() %8-4);// ОШУМЛЕНИЕ amp + + Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1); + Gyro.AmpN1=(unsigned int)((Nmax*((100-Gyro.AmpPer)+Gyro.AmpPerDel+Gyro.AmpT))/(Gyro.Frq>>16)); //левая граница амплитуды + Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды + + LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро + // LPC_TIM1->MR0 +=(Gyro.AmpT<<5); +} +. + + + +/* +void Calc2AmpN(void)//расчет точек старта и стопа импульса вибропривода и расчет частоты ошумления. +{ + Gyro.AmpSC=0; + static int PeriodCount = 0; + unsigned int Nmax=0; + Gyro.AmpSC = Gyro.MaxAmp - OldMaxAmp ; + if(Gyro.AmpSC<0) Gyro.AmpSC=Gyro.AmpSC*(-1); + OldMaxAmp=Gyro.MaxAmp; + + if(Gyro.AmpSC <55)countA++; + if(countA >2) + { + countA=0; + srand(Global_Time); + if(Cheng_AMP_Flag) + { + Cheng_AMP_Flag=0; + Gyro.AmpPerDel = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp + Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1); + Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/(Gyro.Frq>>16)); //левая граница амплитуды + Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды + } + else + { + Cheng_AMP_Flag=1; + Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1); + Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer))/(Gyro.Frq>>16)); //левая граница амплитуды + Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды + } + } //8046 + + LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро +}*/ +/* +void CalcAmpN(void)//расчет точек старта и стопа импульса вибропривода и расчет частоты ошумления. +{ + Gyro.AmpSC=0; + static int PeriodCount = 0; + unsigned int Nmax=0; + Gyro.AmpSC = Gyro.MaxAmp - OldMaxAmp ; + if(Gyro.AmpSC<0) Gyro.AmpSC=Gyro.AmpSC*(-1); + OldMaxAmp=Gyro.MaxAmp; + + if(Gyro.AmpSC <5)countA++; + if(countA >3) + { + countA=0; + + Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1); + Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/(Gyro.Frq>>16)); //левая граница амплитуды + Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды + Cheng_AMP_Flag=1; + + tempDP=Gyro.AmpPerDel; + srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин. + if(Gyro.flag==1) Gyro.AmpPerDel = 1; + else Gyro.AmpPerDel = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp + } //8046 + + LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро +} + +*/ + +/* +void CalcAmpD(void) +{ + unsigned int Nmax=0; + countA++; + if( countA>1) + { + countA=0; + + Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1); + Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer-Gyro.AmpPerDel))/(Gyro.Frq>>16)); //левая граница амплитуды + Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды + Cheng_AMP_Flag=1; + + // if(Gyro.flag==1) Gyro.AmpPerDel = 1; + + + switch(Znak) { + case 0: + Gyro.AmpPerDel++; + if (Gyro.AmpPerDel>10){Znak=1; fnoize++;} + break; + + case 1: + Gyro.AmpPerDel--; + if (Gyro.AmpPerDel<1)Znak=0; + if (fnoize>6)Znak=2; + break; + + case 2: + Gyro.AmpPerDel++; + if (Gyro.AmpPerDel>7){Znak=3; fnoize++;} + break; + + case 3: + Gyro.AmpPerDel--; + if (Gyro.AmpPerDel<1)Znak=2; + if (fnoize>12){Znak=4;} + break; + + case 4: + Gyro.AmpPerDel++; + if (Gyro.AmpPerDel>15){Znak=5; fnoize++;} + break; + + case 5: + Gyro.AmpPerDel--; + if (Gyro.AmpPerDel<1)Znak=4; + if (fnoize>18){Znak=6;} + break; + + case 6: + Gyro.AmpPerDel++; + if (Gyro.AmpPerDel>6){Znak=7;fnoize++;} + break; + + case 7: + Gyro.AmpPerDel--; + if (Gyro.AmpPerDel<1)Znak=6; + if (fnoize>24){Znak=0;fnoize=0;} + break; + } + } + LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро +} +*/ + + + + int Mrand(void) + { + int b=0; + z=z*Gyro.AD_Slow; + b = ((z>>10) & 0xf)+20; + /* sprintf((Time),"%d\r\n", b); + WriteCon(Time);*/ + return b; + } + + + +/*дол лучших времен +unsigned long mwc() +{ +static unsigned long x3456789, +y=362436069, +z=77465321, +c=13579; +unsigned long long t; +tС6905990LL*x+c; +x=y; +y=z; +c=(t>>32); +return z=(t&0xffffffff); +} +*/