fork

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
150:29c9f7671bac
Parent:
148:7ce8c1fd00f7
Child:
151:d565ce4d58c8
--- a/SPI.c	Tue May 03 05:12:26 2016 +0000
+++ b/SPI.c	Wed May 04 14:01:57 2016 +0000
@@ -8,7 +8,8 @@
 int AD_Regul = 0;
 int temp9;
 int AD_MAX=0;
-
+int k=0,l=0;
+ int flagmod=0;
 unsigned int Temp_ADC_2;
 unsigned int Temp_ADC_3;
 unsigned int Temp_ADC_4;
@@ -50,8 +51,8 @@
 
 		if (Gyro.ADF_Count > 15)					// если прошло 16 тактов виброподвеса
 		{
-			Gyro.AD_Fast = Gyro.ADF_Accum << 12;	//обновляем данные и приводим в один масштаб
-			Gyro.ADF_Count = 0;
+			Gyro.AD_Fast = Gyro.ADF_Accum << 12;	//обновляем данные и приводим в один масштаб 
+			Gyro.ADF_Count = 0;//                                                                   
 			Gyro.ADF_Accum = 0;
 			Gyro.ADF_NewData = 1;
 		}
@@ -130,12 +131,12 @@
 
 void PlcRegul(void)			//Программа расчет напряжения для модулятора
 {
-		int k;
+		
 		int PLC_In;
         int tempDelta;
         int tempDac;
-        int flagmod;
-     
+       
+    LoopOn
 		PLC_In = Gyro.AD_Slow;									//выбираем даные для фильтрации
 //		PLC_In = Gyro.AD_Fast;
         //или+,или-(знак)
@@ -145,9 +146,31 @@
 		//AD_MAX=1943420832;
 		       //15728640
 		//AD_MAX=1943400;       
-		if(AD_MAX<Gyro.AD_Slow)
-		{AD_MAX=Gyro.AD_Slow/*+2621440*10;*/;}
-        tempDelta=AD_MAX-Gyro.AD_Slow;
+		if(AD_MAX < Gyro.AD_Slow) {AD_MAX = Gyro.AD_Slow;l=0;}
+		else l++;
+		if(flagmod>2){
+			k++;
+			  if(k>30)
+			    {
+				 k=0;  //1948558064
+			     AD_MAX -= 13107200; //= 50
+			    }
+			}       //   5242880 = 20 
+			else k=0;
+		if(l>30) {AD_MAX -= 13107200; l=0;}
+        tempDelta=(unsigned int)(AD_MAX-Gyro.AD_Slow);
+        
+    if( (Gyro.PLC_Lern<51)&&(Gyro.PLC_Error2Mode != 0))//пробигаем по нескольким значениям цап(50*0х3с=0хВВ8) для определения максимальной амплитуды.
+    { 
+      Gyro.PLC_Lern++;
+      Spi.DAC_B += 0x1e;
+      if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow;
+      sprintf((Time)," Gyro.AD_Slow=%d Spi.DAC_B=%d AD_MAX=%d\r\n", Gyro.AD_Slow,Spi.DAC_B,AD_MAX);
+      WriteCon(Time);
+    }
+    
+        
+        
 	    if(Gyro.RgConA&0x2)											// если включон контур регулирования
 	    {	
 			if 		( Gyro.PLC_Error2Mode > 0)				{Gyro.PLC_Error2Mode --; 						Gyro.PLC_ADC_DOld = 0;} 	// если ошибка(нахожление в двух модовом)
@@ -160,25 +183,30 @@
 				Gyro.PLC_ADC_DOld = 1;
 			}
 		}
-		else 
-		{
-			Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;
-		}
-		if(((tempDelta>>18)>30)||((tempDelta>>18)<(-30)))
+		else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;}
+		
+		
+		if(((tempDelta>>18)>50)||((tempDelta>>18)<(-50)))
 		{   
 		    tempDac=(unsigned int)(tempDelta>>18);
-		    if(tempDac>450) {tempDac=400;}
-			Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac/*Gyro.PLC_Delta>>18*/;
+		    if(tempDac>400) {tempDac=400;}
+			Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac;
 			tempDac   =  Gyro.PLC_ADC_DOld * tempDac;
 			flagmod=3;
 		}
-		else if(((tempDelta>>18)>10)||((tempDelta>>18)<(-10)))
+        else if(((tempDelta>>18)>20)||((tempDelta>>18)<(-20)))
 		{
 			tempDac=(unsigned int)(tempDelta>>18);
-			Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac);
-			tempDac    = Gyro.PLC_ADC_DOld * (tempDac);
+			Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac-5);
+			tempDac    = Gyro.PLC_ADC_DOld * (tempDac-5);
 			flagmod=2;
 		}
+		else if(tempDelta>>18<2)
+		{
+		 tempDac=5;
+		 Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac;
+		 flagmod=1;
+		}
         else
         {
            	tempDac=(unsigned int)(tempDelta>>19);
@@ -190,15 +218,13 @@
 			
 		if ( Spi.DAC_B < 1000 ) 	{Spi.DAC_B = 32000;  Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;}
 		if ( Spi.DAC_B > 63000 ) 	{Spi.DAC_B = 32000;  Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;}
-
-k=1;
 		
 		if(Gyro.LogPLC==1)
 		{
-		sprintf((Time),"%d %d %d %d %d\r\n", Spi.DAC_B, temp9,tempDelta>>18,tempDac,flagmod/*(Gyro.PLC_ADC_DOld * Gyro.PLC_Delta>>18)*/);//выдаем в терминал для постройки граффика регулировки периметра.
+		sprintf((Time),"%d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9,tempDelta>>18,flagmod,tempDac,AD_MAX, Gyro.AD_Slow, k/*(Gyro.PLC_ADC_DOld * Gyro.PLC_Delta>>18)*/);//выдаем в терминал для постройки граффика регулировки периметра.
         WriteCon(Time);
         }
- 
+LoopOff
  }