forkd

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Revision:
144:083c667ba848
Parent:
143:2b15794a6cd2
Child:
146:2bea299a7c4f
--- a/SPI.c	Wed Apr 27 06:46:17 2016 +0000
+++ b/SPI.c	Wed Apr 27 14:04:45 2016 +0000
@@ -71,23 +71,7 @@
 
 
 
-void PlcRegul(void)			//Программа расчет напряжения для модулятора
-{
-		int k;
-		int PLC_In;
-
-
-		PLC_In = Gyro.AD_Slow;									//выбираем даные для фильтрации
-//		PLC_In = Gyro.AD_Fast;
-        //или+,или-(знак)
-		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.RgConA&0x2)											// если включон контур регулирования
-	    {	
-	  
+ /*
 	  	    if 		( Gyro.PLC_Delta >	( 100 * 65536)) k=256;
 	  	    else if ( Gyro.PLC_Delta < 	(-100 * 65536)) k=256;
 	  	    
@@ -108,25 +92,42 @@
 	  	    
 	  	    else if ( Gyro.PLC_Delta >  ( 2*65536)) k=6;
 	  	    else if ( Gyro.PLC_Delta < 	(-2*65536)) k=6;
-	  	    	  	    
+	  	 */   	  	
+
+
+
+
+
+
+void PlcRegul(void)			//Программа расчет напряжения для модулятора
+{
+		int k;
+		int PLC_In;
+        int tempDelta;
+        int tempDac;
+        int flagmod;
+        int AD_MAX;
+		PLC_In = Gyro.AD_Slow;									//выбираем даные для фильтрации
+//		PLC_In = Gyro.AD_Fast;
+        //или+,или-(знак)
+		Gyro.PLC_Delta 	  = PLC_In - Gyro.PLC_Old;						// узнаем приращение
+		Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld;			//приращение с учетом знака (и количества) прошлого приращения
+		Gyro.PLC_Old 	  = PLC_In;										// запоминание значения
+		AD_MAX=1941520832;
+		       //15728640
+        tempDelta=AD_MAX-Gyro.AD_Slow;
+	    if(Gyro.RgConA&0x2)											// если включон контур регулирования
+	    {	
+	    
 	  	
-			if 		(Gyro.PLC_Error2Mode > 0)				{Gyro.PLC_Error2Mode --; 						Gyro.PLC_ADC_DOld = 0; } 	// если ошибка(нахожление в двух модовом)
-			else if ( Gyro.PLC_Delta > 	(3000 * 65536)) 	{Spi.DAC_B += 2500;	Gyro.PLC_Error2Mode = 5; 	Gyro.PLC_ADC_DOld = 0;}		// проверка на двух модовость
-			else if ( Gyro.PLC_Delta < 	(-3000 * 65536)) 	{Spi.DAC_B += 2500;	Gyro.PLC_Error2Mode = 5; 	Gyro.PLC_ADC_DOld = 0;}
-	  	    else if (Gyro.PLC_DeltaADD > 0)  
-			{
-	
-//			Gyro.PLC_ADC_DOld =	(Gyro.PLC_DeltaADD /6553600 )+1;
-			Gyro.PLC_ADC_DOld = 1;
-			}
-	  	    else if (Gyro.PLC_DeltaADD < 0)  
-			{
-
-//				Gyro.PLC_ADC_DOld =	(Gyro.PLC_DeltaADD /6553600 )-1;
-				Gyro.PLC_ADC_DOld = -1;
-			}
+			if 		( Gyro.PLC_Error2Mode > 0)				{Gyro.PLC_Error2Mode --; 						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;}		// проверка на двух модовость
+			else if ( Gyro.PLC_Delta < 	(-3500 * 65536)) 	{Spi.DAC_B += 2500;	Gyro.PLC_Error2Mode = 5; 	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_Delta=1114111;//если делта 0 то Spi.DAC_B += 4;
 				Gyro.PLC_ADC_DOld = 1;
 			}
 		}
@@ -135,17 +136,41 @@
 			Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;
 		}
 		
-	
-		Spi.DAC_B += Gyro.PLC_ADC_DOld * /*32*/ k;
 		
-		
+		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*/;
+			tempDac   =  Gyro.PLC_ADC_DOld * tempDac;
+			flagmod=3;
+		}
+		else if(((tempDelta>>18)>30)||((tempDelta>>18)<(-30)))
+		{
+			tempDac=(unsigned int)(tempDelta>>19);
+			Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac+5);
+			tempDac    = Gyro.PLC_ADC_DOld * (tempDac+5);
+			flagmod=2;
+		}
+        else
+        {
+           	tempDac=(unsigned int)(tempDelta>>20);
+           	Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac;
+			tempDac = Gyro.PLC_ADC_DOld * tempDac;
+			flagmod=1;
+		}
+			
+			
 		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;
+
+k=1;
+		
 		if(Gyro.LogPLC==1)
 		{
-		
-		sprintf((Time),"%d %d %d %d\r\n", Spi.DAC_B, Gyro.StrayPLC_flag, temp9,(Gyro.PLC_Delta/65536));//выдаем в терминал для постройки граффика регулировки периметра.
+		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)*/);//выдаем в терминал для постройки граффика регулировки периметра.
         WriteCon(Time);
         }