fork

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
191:40028201ddad
Parent:
190:289514f730ee
Child:
192:d32c8cf7bcd9
--- a/SPI.c	Tue Aug 23 14:03:16 2016 +0000
+++ b/SPI.c	Mon Aug 29 11:58:52 2016 +0000
@@ -10,7 +10,7 @@
 int AD_MAX=0;
 int k=0,l=0,r=0;//счетчики для регулировки периметра
 int flagmod=0,Bdelta;
-
+int start=10;
 unsigned int Temp_ADC_2;
 unsigned int Temp_ADC_3;
 unsigned int Temp_ADC_4;
@@ -113,53 +113,52 @@
 
 
 
-void PlcRegul(void)			//Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.)
+void PlcRegul(void)																//Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.)
 {
     //LoopOn
     int PLC_In;
     int tempDac;
-
-  if(!(Gyro.PinReg & PinRegBitL))  PLC_In = Gyro.AD_Slow;	//выбираем даные для фильтрации
-  										
-   // PLC_In = (unsigned int)(PLC_In>>1);	
-    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.PinReg & PinRegBitL)) && (Gyro.PLC_Lern < 150) && (Gyro.PLC_Error2Mode != 0)) {     		//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды.
-        //Gyro.PLC_Lern++;                                          		//инкрементируем счетчик поиска максимальной амплитуды
-        Spi.DAC_B += 0x3c;                                        		//добовляем в значение цапа 60
-        if(AD_MAX < PLC_In){AD_MAX = PLC_In;}    	 	                 //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду.      
-        else if ((AD_MAX>PLC_In)&&(AD_MAX>1500800000)) r++;    	         //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик.
-        if      (r>10){Gyro.PLC_Lern=150;Gyro.PLC_Error2Mode=8;}         //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска
-                         
-        Gyro.CuruAngle = 0;   //не считаем угол пока ищем максивальную амплитуду.
-    } //работает только первые ~30-40 секунд (37 сек).
-    
-    if (Gyro.PLC_Lern<250) Gyro.PLC_Lern++;          
-   // if (Gyro.PLC_Lern<20)AD_MAX=0;
-    
-    if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;}                      //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды.                  
-    else l++;                                   
-    if((l == 40)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m 
-                                                                             //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной)
-    if     ((k == 30)&&(Gyro.PLC_Lern > 59))  Spi.DAC_B += 200;                    //после уменьшения максимальной амплитуды двигаем шевелем цап 
-    else if((k ==  1)&&(Gyro.PLC_Lern > 59)) {Spi.DAC_B -= 200; k=0;l=0;}          //для быстрог поиска новог максимума.
-    if(k>0)k--;
+    if(!(Gyro.PinReg & PinRegBitL) && (start>0)) start--; 
+  if((start==0)){
+     if(!(Gyro.PinReg & PinRegBitL))  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) для определения максимальной амплитуды.
+        	Spi.DAC_B += 0x3c;         			                               	//добовляем в значение цапа 60
+        	if(AD_MAX < PLC_In){AD_MAX = PLC_In;}    	 	          		    //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду.      
+        	else if ((AD_MAX>PLC_In)&&(AD_MAX>1500800000)) r++;    	      		//если текущая амплитуда меньше максимально найденной то инкрементируем счетчик.
+        	if (r>10){
+        		Gyro.PLC_Lern=150;
+        		Gyro.PLC_Error2Mode=3;
+        		}		       													//если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска
+         Gyro.CuruAngle = 0;   													//не считаем угол пока ищем максивальную амплитуду.
+        } 																		//работает только первые ~30-40 секунд (37 сек).
+     if (Gyro.PLC_Lern<250) Gyro.PLC_Lern++;  
+     if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;}                      			//обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды.                  
+     else l++;                                   								//инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной)
+     if((l == 40)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 5107200;k=30;l=0;} 	//если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m 
+     if     ((k == 30)&&(Gyro.PLC_Lern > 59))  Spi.DAC_B += 200;                //после уменьшения максимальной амплитуды двигаем шевелем цап 
+     else if((k ==  1)&&(Gyro.PLC_Lern > 59))  {Spi.DAC_B -= 200; k=0;l=0;}      //для быстрог поиска новог максимума.
+     if(k>0)k--;
                                                           
-    Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In);              //ищем разницу между желаемой и действительной амплитудами.  
+     Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In);              					//ищем разницу между желаемой и действительной амплитудами.  
  
   
-    if(Gyro.RgConA&0x8) {	       // если  контур регулирования замкнут
-         /*			else if ( Gyro.PLC_Delta > 	(3500 * 65536)) 	{Spi.DAC_B += 2500;	Gyro.PLC_Error2Mode = 5; 	Gyro.PLC_ADC_DOld = 0;}		// проверка на двух модовость
-        			else if ( Gyro.PLC_Delta < 	(-3500 * 65536)) 	{Spi.DAC_B += 2500;	Gyro.PLC_Error2Mode = 5; 	Gyro.PLC_ADC_DOld = 0;}		// проверка на двух модовость*/
-        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;}
+    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;}///прыжок с моды на моду.
+    else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;}
+    
+    ///прыжок с моды на моду.
 /*
     if(Gyro.ModJump==1) {            ///прыжок с моды на моду. (-->)   
        Gyro.ModJump=0;
@@ -172,49 +171,42 @@
        Spi.DAC_B -= 12500;
        Gyro.PLC_Error2Mode=4;
     } */
-    /*if (Bdelta>20)
-    {AD_MAX=1510800000;}*/ 
-    tempADC5=0x7fff-Spi.ADC5;
+    
+    
     
-    if((Gyro.RgConA&0x8) && (tempADC5>1000) && (!(Gyro.PinReg & PinRegBitL))) {
-   		      if(Gyro.PlC_MaxD>(50<<17)) {							// 3 режим регулирования
+    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;  Bdelta++; } //ограничение на регулирование если очень большая разница амплитуд
-       		  Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac;      //новое значение в цап (±1 * значение регулировки)
-      		  tempDac   =  Gyro.PLC_ADC_DOld * tempDac;      //используется только для выдачи
+     		  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 режим регулирования
+		    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);     //используется только для выдачи
+      		  tempDac    = Gyro.PLC_ADC_DOld * (tempDac);     					//используется только для выдачи
       		  flagmod=2;
    		    } 
-   		    else if(Gyro.PlC_MaxD<(2<<17)) {                     //режим если дельта равна 0;Gyro.ModJump
+   		    else if(Gyro.PlC_MaxD<(2<<17)) {                     				//режим если дельта равна 0;Gyro.ModJump
       		  tempDac=2;
       		  Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac;
               flagmod=0;
             } 
             else {
-     		  tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); 			// 1 режим регулирования
+     		  tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); 						// 1 режим регулирования
     		  Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac;
               tempDac = Gyro.PLC_ADC_DOld * tempDac;
               flagmod=1;
-         }
-   }
- /*
-    if(flagmod==3) {k++;         	//если максимальный режим регулирования //инкрементируем счетчик большого понижения амплитуды
-      if(k>100){k=0;AD_MAX -= 6107200;} //если счетчик бльше 50 //обнуляем счетчик //уменьшаем максимальную амплитуду.   
-    }
-    else k=0;						//если это не серия максимальных регулировок обнуляем счетчик.
-
-    */
-    
+         	}
+  	 	}    
  if      ( Spi.DAC_B <  1000 )	{Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;}            //проверка на переваливание за границу.  
  else if ( Spi.DAC_B > 63000 ) 	{Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;}
        
-
+}
 
     ///////////////////////
     //////////лог//////////
@@ -287,7 +279,7 @@
  }
 
 
-*/
+*//*
 void PlcRegul_old(void)  // на всякий случай
 {
     int Delta;
@@ -324,7 +316,7 @@
 }
 
 
-
+*/
 
 void DAC_OutPut(void)//выдача в цапы
 {