fork

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
209:224e7331a061
Parent:
187:6bfb02c2831c
--- 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);
+}
+*/