fork

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
172:ef7bf1663645
Parent:
171:d227a6045305
Child:
174:daffcc97d532
--- a/SPI.c	Thu Jun 09 10:19:23 2016 +0000
+++ b/SPI.c	Fri Jun 17 13:54:50 2016 +0000
@@ -35,7 +35,7 @@
     Gyro.In2   	= Spi.ADC3;
     Gyro.DeltaT = Spi.ADC4;
     
-    TempA = (0x7fff - Spi.ADC5) << 1;  		// перевернем знак  и умножим на два (было 32000...0 стало 0 ...64000)
+    TempA = (0xffff - Spi.ADC5);  		// перевернем знак  и умножим на два (было 32000...0 стало 0 ...32000 /*сдвиг(<<1) стало 0 ...64000*/)
     TempTermLM = Spi.ADC1; 
     
     Gyro.ADF_Accum += TempA;
@@ -45,13 +45,13 @@
     Gyro.ADS_Count ++;
 
     if (Gyro.ADF_Count > 15) {				// если прошло 16 тактов виброподвеса
-        Gyro.AD_Fast = Gyro.ADF_Accum << 12;	//обновляем данные и приводим в один масштаб
+        Gyro.AD_Fast = Gyro.ADF_Accum << 11;	//обновляем данные и приводим в один масштаб
         Gyro.ADF_Count = 0;//
         Gyro.ADF_Accum = 0;
         Gyro.ADF_NewData = 1;
     }
     if (Gyro.ADS_Count > 255) {				// если прошло 256 тактов виброподвеса
-        Gyro.AD_Slow = Gyro.ADS_Accum << 8;		//обновляем данные и приводим в один масштаб
+        Gyro.AD_Slow = Gyro.ADS_Accum << 7;		//обновляем данные и приводим в один масштаб
         Gyro.TermLM = Gyro.ADS_AccumTermLM << 3;
         Gyro.ADS_Count = 0;
         Gyro.ADS_Accum = 0;
@@ -125,33 +125,41 @@
     int tempDac;
 
 
-    PLC_In = Gyro.AD_Slow;											//выбираем даные для фильтрации
+    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;										// запоминание значения
     
-    
-    //                                                                                                   3600 (размер моды порядка 3000)
+    if(Gyro.flagGph_W){
+    //Gyro.flagGph_W=0; 
+    AD_MAX=0; 
+    //Gyro.PLC_Lern =0; 
+    //Gyro.PLC_Error2Mode=150; 
+    Gyro.flagGph_W--; 
+  //  r=0;
+    }
+    //                                                                                         3600 (размер моды порядка 3000)
     if((Gyro.PLC_Lern < 150) && (Gyro.PLC_Error2Mode != 0)) {     		//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды.
         Gyro.PLC_Lern++;                                          		//инкрементируем счетчик поиска максимальной амплитуды
         Spi.DAC_B += 0x3c;                                        		//добовляем в значение цапа 60
-        if     (AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow;    	 	//если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду.      
-        else if ((AD_MAX>Gyro.AD_Slow)&&(AD_MAX>1930000000)) r++;    	//если текущая амплитуда меньше максимально найденной то инкрементируем счетчик.
+        if(AD_MAX < PLC_In){AD_MAX = PLC_In;}    	 	//если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду.      
+        else if ((AD_MAX>PLC_In)&&(AD_MAX>1502800000)) r++;    	//если текущая амплитуда меньше максимально найденной то инкрементируем счетчик.
         if      (r>5){Gyro.PLC_Lern=150;Gyro.PLC_Error2Mode=5;}         //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска
                          
         Gyro.CuruAngle = 0;   //не считаем угол пока ищем максивальную амплитуду.
     } //работает только первые ~30-40 секунд (37 сек).
 
 
-
-    if(AD_MAX < Gyro.AD_Slow) { AD_MAX = Gyro.AD_Slow; l=0; }                      //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды.                                                          *
-    else if((l == 150)&&(Gyro.PLC_Error2Mode == 0)) { AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). 
+    
+    if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;}                      //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды.                                                          *
+    else if((l == 150)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). 
     else if(Gyro.PLC_Error2Mode == 0) l++;                                        //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной)
     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-Gyro.AD_Slow);              //ищем разницу между желаемой и действительной амплитудами.  
+    Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In);              //ищем разницу между желаемой и действительной амплитудами.  
  
   
     if(Gyro.RgConA&0x8) {	       // если  контур регулирования замкнут
@@ -176,26 +184,26 @@
        Gyro.PLC_Error2Mode=4;
     } 
     if(Gyro.RgConA&0x8) {
-   		      if(Gyro.PlC_MaxD>(50<<18)) {							// 3 режим регулирования
-      		  tempDac=(unsigned int)(Gyro.PlC_MaxD>>18);
+   		      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<<18)) {					// 2 режим регулирования
-      		  tempDac=(unsigned int)(Gyro.PlC_MaxD>>18);
+		    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<<18)) {                     //режим если дельта равна 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>>19); 			// 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;
@@ -218,7 +226,7 @@
     //////////лог//////////
     ///////////////////////
     if(Gyro.LogPLC==1) {
-        sprintf((Time),"%d %d %d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, r, tempDac, flagmod, AD_MAX, Gyro.AD_Slow, Gyro.CuruAngle, Gyro.TermLM, (Gyro.Frq>>16) );//выдаем в терминал для постройки граффика регулировки периметра.
+        sprintf((Time),"%d %d %d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, r, tempDac, flagmod, AD_MAX, PLC_In, Gyro.CuruAngle, Gyro.TermLM, (Gyro.Frq>>16) );//выдаем в терминал для постройки граффика регулировки периметра.
         WriteCon(Time);
     }
 }