forkd

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Revision:
0:8ad47e2b6f00
Child:
1:f2adcae3d304
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SIP.c	Sat Jan 30 13:00:39 2016 +0000
@@ -0,0 +1,263 @@
+#include "mathDSP.h"
+#include "SIP.h"
+#include "CyclesSync.h"
+#include "CntrlGLD.h"
+#include "InputOutput.h"
+#include "ThermoCalc.h"
+#include "el_lin.h"
+
+
+  		 uint32_t	 Old_Cnt_Vib = 0;
+    	 uint32_t	 Old_Cnt = 0;
+		   int32_t	 RefMeand_Cnt_Dif;
+     	 int32_t	 PSdif_sum_Vib_32 = 0;
+       __int64	 PSdif_sum_Vib_64 = 0;
+		   int32_t	 dif_Curr_32_Ext; 		//r. ðàçíîñòü (÷èñëî) äëÿ ðåæèìà âíåøíåé çàùåëêè
+     	 int32_t	 dif_Curr_32_previous; 	//e. Previous (in comparison with Dif_Curr_32) number //r. ïðåäûäóùåå (ïî ñðàâíåíèþ ñ Dif_Curr_32) ÷èñëî
+		   int32_t	temp22=0;
+//+++++++++++++++++++++++++++++++INPUT DATA++++++++++++++++++++++++++++++++++++++++++++++++
+uint32_t	Curr_Cnt_Vib;
+uint32_t 	Cnt_curr;
+
+//+++++++++++++++++++++++++++++++variables for output++++++++++++++++++++++++++++++++++++++
+int32_t	 	Dif_Curr_Vib;	    //e. current difference output for dithering control in LightUp mode and Dither regulator
+int32_t	    Dif_Curr_32;		//e. current difference without dithering for dithering control
+
+#if (defined GLOBALRATE)//íå âõîäèò
+
+//variables for rate mode
+    int32_t	 cntPls_sum_32;
+    ñññ int32_t	 last_Cnt_Plus;
+     int32_t	 dif_sum_32;
+     int32_t	 Cnt_Pls;
+     int32_t	 Cnt_Mns;
+     int32_t	 preLast_Cnt_Plus;
+    // uint32_t   sumCnt_Mns = 0;	   
+     //uint32_t   sumCnt_Pls = 0;
+  extern int32_t dif_cur_test[30];
+  extern   unsigned ii;
+     uint32_t halfPeriod = 0;
+#endif
+
+void ResetBitsOfWord(int * x32, int truncate_bits)
+{
+	int hi_part;
+
+	hi_part = *x32 >> truncate_bits;
+	*x32 -= hi_part << truncate_bits;  //r. îñòàâëÿåì ìëàäøèå 16 áèò
+} 
+/******************************************************************************
+** Function name:		interpolation
+**
+** Descriptions: êîëè÷åñòâî èòåðïîëÿöèé äî ïîÿâëåíèÿ âíåøíåé çàùåëêè		
+**
+** Returned value:	Number in moment of external latch	appearing 	
+** parameters:		y_curr - current number, y_prev - number at one cycle before time
+**					x_interp - moment of external latch appearing,
+					
+** 	Precision of interpolation is 1/8 of impulse (3 digits after point in 14.18 format)
+******************************************************************************/
+int interpolation(int y_curr, int x_interp)
+{
+	__int64 temp,temp3; 
+
+	temp = (__int64)y_curr *(__int64)x_interp;
+	temp /= PrevPeriod;  //	 void ServiceTime(void) ||| PrevPeriod = LPC_PWM1->MR0; ||| (CyclesSync.c)
+
+	temp3 = (__int64)y_curr *(__int64)(x_interp+1);
+	temp3 /= PrevPeriod;
+	temp22 = (int)temp3;
+
+	return ((int)temp);
+} // interpolation
+/******************************************************************************
+** Function name:		clc_Pulses
+**
+** Descriptions: 	Processing of information from SPOI		
+**
+** parameters:	None		
+** Returned value:	None	
+** 
+******************************************************************************/
+
+void clc_Pulses()
+{
+
+#if (!defined GLOBALRATE)
+  static   int32_t	 cntPls_sum_32;
+  static   int32_t	 last_Cnt_Plus;
+  static   int32_t	 dif_sum_32;
+  static   int32_t	 Cnt_Pls;
+  static   int32_t	 Cnt_Mns;
+  static   int32_t	 preLast_Cnt_Plus;
+#endif
+
+    Dif_Curr_Vib = Curr_Cnt_Vib - Old_Cnt_Vib; //Âû÷èñëåíèå ïðèðàùåíèÿ òåêóùåãî ñ÷åò÷èêà èìïóëüñîâ.
+
+   	Old_Cnt_Vib = Curr_Cnt_Vib;				         //ñîõðàíåíèå òåêóùåãî ñ÷åò÷èêà èìïóëüñîâ äëÿ ñëåäóþùåãî öèêëà èçìåðåíèé
+
+	  
+		Cnt_Overload(Dif_Curr_Vib, INT32MAX_DIV2, INT32MIN_DIV2);  //ïðîâåðêà íà ïåðåïîëíåíèå (Dif_Curr_Vib).
+   //                Uin           UpSat          DwnSat
+	 
+	//#define	Cnt_Overload(Uin, UpSat, DwnSat)	
+/*  if (Uin > UpSat) 
+	
+       {
+				 Uin -= INT32_MAX; 	
+			 }
+	  if (Uin < DwnSat) 
+		    {
+		     Uin += INT32_MAX;
+	      }	*/
+	
+	
+		Dif_Curr_32 = VibroReduce(Dif_Curr_Vib << SHIFT_TO_FRACT); // Òî÷íîñòü ôèëüòðàöèè 1/(2^18)					
+	 
+	 
+	 
+	 
+   switch (RgConB) //r. äîïîëíèòåëüíûé ðåãèñòð óïðàâëåíèÿ
+  	{
+   		case RATE_VIBRO_1:                                              //r. ðàçíîñòü âèáðîñ÷åò÷èêîâ ïîñëå ôèëüòðà ñêîëüçÿùíãî ñðåäíåãî
+		
+			if (Latch_Rdy)	 //e. latch has arrived
+			{	
+				//dif_Curr_32_Ext ðàçíîñòü (÷èñëî) äëÿ ðåæèìà âíåøíåé çàùåëêè
+			  dif_Curr_32_Ext = interpolation(Dif_Curr_32, LatchPhase );  //èíòåðïîëÿöèÿ
+				Output.Str.Tmp_Out[2] = (int)((Curr_Cnt_Vib>>16)& 0xffff); 
+				Output.Str.Tmp_Out[3] = (int)(Curr_Cnt_Vib & 0xffff); 
+			                                                                //r. äîáàâëÿåì ê íàêîïëåííîé ñóììå èíòåðïîëèðîâàííûé îòñ÷åò âíåøíåé çàùåëêè
+				PSdif_sum_Vib_32 += dif_Curr_32_Ext; 
+				PSdif_sum_Vib_64 += dif_Curr_32_Ext; //e. receive last data
+				//count--;
+	
+				//r. ïîäãîòîâèòü ÷èñëî äëÿ âûäà÷è
+				Output.Str.BINS_dif = PSdif_sum_Vib_32 - TermoCompens_Sum;	  //r. èç íàêîïëåííîãî ÷èñëà âû÷èòàåì íàêîïëåííóþ òåðìîêîìïåíñàöèîííóþ ñîñòàâëÿþùóþ
+				Output.Str.PS_dif = Output.Str.BINS_dif >> 16;	
+				LatchPhase = INT32_MAX;	//INT32_MAX=2147483647                //in Latch_Event it's indicator of latch appearing
+				Output.Str.SF_dif = PSdif_sum_Vib_64; 
+				TermoCompens_Sum = 0;                                         //r. îáíóëÿåì íàêîïëåííóþ òåðìîêîìïåíñàöèþ äëÿ íà÷àëà íîâîãî öèêëà íàêîïëåíèÿ
+														 				
+					if ((Device_Mode == DM_EXT_LATCH_DELTA_BINS_PULSE)||((Device_Mode == DM_EXT_LATCH_DELTA_SF_PULSE) && Ext_Latch_ResetEnable))
+						  {	 
+							PSdif_sum_Vib_32 = 0;                                   //r. èíèöèàëèçèðîâàòü íîâûé öèêë èçìåðåíèÿ ïî çàùåëêå 
+							PSdif_sum_Vib_64 = 0;					
+						  }
+					else
+							ResetBitsOfWord(&PSdif_sum_Vib_32, 16);	  
+							
+				 dif_Curr_32_Ext = Dif_Curr_32 - temp22;//dif_Curr_32_Ext;
+
+				PSdif_sum_Vib_32 +=  dif_Curr_32_Ext; // preserve rest of counters difference for next measure cycle: PSdif_sum_Vib_32 += Dif_Curr_32 - dif_Curr_32_Ext;
+				PSdif_sum_Vib_64 +=  dif_Curr_32_Ext; //ñîõðàíèòü îñòàëüíûå ñ÷åò÷èêè ðàçíèöû äëÿ ñëåäóþùåãî òàêòà öèêëà
+							 
+			}
+			else //r. çàùåëêè íà íàñòîÿùèé ìîìåíò íå áûëî 
+			{	
+				//r. ïðîäîëæàåì íàêàïëèâàòü ñóììó èç âíóòðåííèõ îòñ÷åòîâ
+				PSdif_sum_Vib_32 += Dif_Curr_32; // PSdif_sum_Vib_32 += Dif_Curr_32 ;			
+				PSdif_sum_Vib_64 += Dif_Curr_32;	 //e. sum for scale factor measurement mode
+			} 
+
+			dif_Curr_32_previous = Dif_Curr_32; //r. çàïîìèíàåì ïðåäûäóùåå ÷èñëî 
+	   break;
+
+  	 case RATE_REPER_OR_REFMEANDR:
+
+	 	if (data_Rdy & HALF_PERIOD)			   //e. calculate Cnt_Mns or Cnt_Pls
+		{
+		  RefMeand_Cnt_Dif = Cnt_curr - Old_Cnt;
+		  Old_Cnt = Cnt_curr;
+		//  LPC_GPIO2->FIOCLR = 0x10;
+		  Cnt_Overload(RefMeand_Cnt_Dif, INT32MAX_DIV2, INT32MIN_DIV2);
+
+		  	if (LPC_QEI->STAT)						//e. "+" direction //r. ñòàëè âðàùàòüñÿ â "+" ñòîðîíó
+			    {
+	  	  	 	//sumCnt_Mns += -RefMeand_Cnt_Dif;    //e. accumulation during 1 sec
+			    	Cnt_Mns = RefMeand_Cnt_Dif;
+		      }
+	 		    else
+			        {	
+				         //r. ñòàëè âðàùàòüñÿ â "-" ñòîðîíó
+	  		         //sumCnt_Pls += RefMeand_Cnt_Dif;		//e. accumulation during 1 sec
+				         Cnt_Pls = -RefMeand_Cnt_Dif;
+			        }
+
+		    //	UART1_SendByte((dif_sum_32>>8) & 0xff);
+	    	//	UART1_SendByte((dif_sum_32) & 0xff);
+		 
+		   if (data_Rdy & WHOLE_PERIOD)		   //e. period of vibro elapsed
+		      {
+		     	  // LPC_GPIO2->FIOSET = 0x10;
+		      	last_Cnt_Plus = Cnt_Pls;	
+		      	dif_sum_32 += Cnt_Pls - Cnt_Mns;
+		      }
+		   data_Rdy &= ~RESET_PERIOD;
+		 }
+			if (Latch_Rdy)			   //e it's time for output 
+		    {
+					LatchPhase = INT32_MAX;
+
+					Output.Str.Tmp_Out[2] = (int)((Curr_Cnt_Vib>>16)& 0xffff); 
+					Output.Str.Tmp_Out[3] = (int)(Curr_Cnt_Vib & 0xffff); 
+
+					cntPls_sum_32 += last_Cnt_Plus - preLast_Cnt_Plus;
+       
+					Output.Str.Cnt_Dif = dif_sum_32;            
+					Output.Str.Cnt_Dif += cntPls_sum_32 >> 1;            
+			
+					dif_sum_32 = 0;				                    //r. è ñáðîñèòü ðåãèñòðû íàêîïëåíèÿ
+					ResetBitsOfWord(&cntPls_sum_32, 1); 			//r. îñòàâëÿåì ìëàäøèé ðàçðÿä, ÷òîáû íå òåðÿëàñü òî÷íîñòü ïðè ñóììèðîâàíèè
+					preLast_Cnt_Plus = last_Cnt_Plus;					//r. òåêóùèé ïîñëåäíèé îòñ÷åò ñòàë ïðåäûäóùèì
+		
+					Output.Str.Cnt_Mns = Cnt_Mns;//sumCnt_Mns;	   //e. rewrite accumulated data to output
+					Output.Str.Cnt_Pls = Cnt_Pls;//sumCnt_Pls;	   
+
+		  //sumCnt_Mns = 0;	   //e. prepare for new accumulation
+		  //sumCnt_Pls = 0;
+	   	}		 
+	 break; // RATE_REPER_OR_REFMEANDR  
+   }	 
+    //e. WP_scope1, WP_scope2 - variables for control in the Rate3 mode //r. WP_scope1, WP_scope2 - ïåðåìåííûå äëÿ êîíòðîëÿ â ðåæèìå rate3
+ 	Output.Str.WP_scope1 = Dif_Curr_Vib;  
+ 	Output.Str.WP_scope2 = (Dif_Curr_32 >> (SHIFT_TO_FRACT-2)); //r. 2 äðîáíûõ ðàçðÿäà îñòàâëÿåì äëÿ áîëüøåé íàãëÿäíîñòè ïðè àíàëèçå ñèãíàëà rate3
+}
+		// clc_Pulses
+
+
+ /******************************************************************************
+** Function name:		SOI_Init
+**
+** Descriptions:		Quadrature encoder initialization.
+**
+** parameters:			None
+** Returned value:		None
+** 
+******************************************************************************/
+void SOI_Init(void)
+{
+  LPC_SC->PCONP |= (1<<18);//0x00040000;		âêëþ÷åíèå êâàäðàòóðíîãî ýíêîäåðà.
+  LPC_SC->PCLKSEL1 |= 0x00000001;	   // âûáîð ÷àñòîòû äëÿ êâ.ý. CLK=100MHz
+  LPC_PINCON->PINSEL3 &= ~0x4100;
+  LPC_PINCON->PINSEL3 |= 0x4100;	  //P1.20, p1.23 óñòàíîâèòü êàê âõîäû êâ.ý
+  LPC_PINCON->PINMODE3 |= 0x3C300;	  //P1.20, p1.23, p1.24 ??are pulled-down??(ïðèòÿíóòü ê ïèòàíèþ)????
+
+  LPC_QEI->MAXPOS = MAX_QEI_CNT;	//LPC_QEI->"ðåãèñòîð ìàêñèìàëüíîãî ïîëîæåíèÿ" = 2147483646
+  LPC_QEI->FILTER = 2;		   // ôèëüòð( ?? )
+  LPC_QEI->CON = 0xF;				//ñáðîñèòü â íîëü âñå ñ÷åò÷èêè êâ.ý. (ñêîðîñòü, íàïðàâëåíèå, ïîçèöèþ è òä)
+  LPC_QEI->CONF = (0<<2) |(0<<1);	//Quadrature inputs, no inverting,only A pulses are counted 
+
+  LPC_QEI->CLR = 0x1fff; 			 //r. ñáðîñèòü âñå ïðåðûâàíèÿ
+  LPC_QEI->IEC = 0x1fff;			 //r. çàïðåòèòü ïðåðûâàíèå ïðè èçìåíåíèè íàïðàâëåíèÿ
+  
+  NVIC_SetPriority(QEI_IRQn, 0);
+  NVIC_EnableIRQ(QEI_IRQn);
+  return;
+ }
+
+
+/******************************************************************************
+**                            End Of File
+******************************************************************************/
+