fork

Dependencies:   mbed

Fork of LG by igor Apu

SPI.c

Committer:
Kovalev_D
Date:
2016-05-04
Revision:
150:29c9f7671bac
Parent:
148:7ce8c1fd00f7
Child:
151:d565ce4d58c8

File content as of revision 150:29c9f7671bac:

#include "Global.h"
struct SPI Spi;
//unsigned int Temp_AMP;
unsigned int Temp_AMP64P;

unsigned int Count_AMP, ADD_AMP, Cur_Amp;
int Znak_Amp;
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;
unsigned int Temp_ADC_5;
unsigned int TempA;

unsigned int Buff_ADC_1		[32];
unsigned int Buff_ADC_2		[32];
unsigned int Buff_ADC_3	   	[32];
unsigned int Buff_ADC_4		[32];

unsigned int Buff_ADC_5		[256];
unsigned int Buff_AMP		[256];
unsigned int Buff_AMP64P	[256];
unsigned int SinPLC[64]= {1023,  1016,	 1006,	993,	976,	954,	904,	874,	841, 806, 768,   728,
                          687,  645,   601,		557,	500,	379, 	337,	296,	256, 219, 183,   150,
                          120,   93,    69,		 48,	 31,	 18,	  8,	0,		8,	 18,	31,   48,
                          69,   93,   120,    150,  183,  219,  256,  296,  337,	379,		468, 512,  557,
                          601,	 645,	  687,	  728,  768,  806,  841,  874,  904,		954,	976, 993, 1006,
                          1016,	1023
                         };



void ADS_Acum(void)
{
	// можно апихнкть в функцию
		Spi.ADC_NewData = 0;	
		Gyro.Termo 	= Spi.ADC1;
		Gyro.In1   	= Spi.ADC2;
		Gyro.In2   	= Spi.ADC3;
		Gyro.DeltaT = Spi.ADC4;
		TempA = (0x7fff - Spi.ADC5) << 1;  		// перевернем знак  и умножим на два (было 32000...0 стало 0 ...64000)

		Gyro.ADF_Accum += TempA;
		Gyro.ADS_Accum += TempA;
		Gyro.ADF_Count ++;
		Gyro.ADS_Count ++;

		if (Gyro.ADF_Count > 15)					// если прошло 16 тактов виброподвеса
		{
			Gyro.AD_Fast = Gyro.ADF_Accum << 12;	//обновляем данные и приводим в один масштаб 
			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.ADS_Count = 0;
			Gyro.ADS_Accum = 0;
			Gyro.ADS_NewData = 1;
		}
}

void SPI_Exchange(void)  // новая функция чтения, в нецй не должно быть ничего лишнего
	{
	unsigned int DummySPI;
	Spi.ADC5_Accum += LPC_SSP0->DR;		// Чтение АЦП
    Spi.ADC4_Accum += LPC_SSP0->DR;
    Spi.ADC3_Accum += LPC_SSP0->DR;
    Spi.ADC2_Accum += LPC_SSP0->DR;
    Spi.ADC1_Accum += LPC_SSP0->DR;
    while (LPC_SSP0->SR & RX_SSP_notEMPT) 	{DummySPI = LPC_SSP0->DR;} 		                //если буфер SPI не пуст.//очистить буфер. 
   
   
    DAC_OutPut();
    
  	if (CountV31 == 0)							// просто фильтруем по 32 точкам. 
  	{
  							// выставояем бит, что есть новы данные
		Spi.ADC1 = Spi.ADC1_Accum >> 5;			// подгоотавливаем данные (в той эе сетке) те 	 ADC1  0..65535
		Spi.ADC2 = Spi.ADC2_Accum >> 5;
		Spi.ADC3 = Spi.ADC3_Accum >> 5;
		Spi.ADC4 = Spi.ADC4_Accum >> 5;
		Spi.ADC5 = Spi.ADC5_Accum >> 5;
  		Spi.ADC1_Accum  = 0;				    // сбрасывкем аккамулятор
    	Spi.ADC2_Accum  = 0;		
    	Spi.ADC3_Accum  = 0;		
    	Spi.ADC4_Accum  = 0;		
    	Spi.ADC5_Accum  = 0;		
  		Spi.ADC_NewData = 1;
  	}


}





 /*
	  	    if 		( Gyro.PLC_Delta >	( 100 * 65536)) k=256;
	  	    else if ( Gyro.PLC_Delta < 	(-100 * 65536)) k=256;
	  	    
	  	    else if ( Gyro.PLC_Delta >	( 55 * 65536)) k=64;
	  	    else if ( Gyro.PLC_Delta < 	(-55 * 65536)) k=64;
	  	    
	  	    else if ( Gyro.PLC_Delta >	( 40 * 65536)) k=30;
	  	    else if ( Gyro.PLC_Delta < 	(-40 * 65536)) k=30;
	  	    
	  	    else if ( Gyro.PLC_Delta >  ( 25 * 65536)) k=20;
	  	    else if ( Gyro.PLC_Delta < 	(-25 * 65536)) k=20;
	  	    
	  	    else if ( Gyro.PLC_Delta >  ( 15*65536)) k=16;
	  	    else if ( Gyro.PLC_Delta < 	(-15*65536)) k=16;

	  	    else if ( Gyro.PLC_Delta >  ( 5*65536)) k=12;
	  	    else if ( Gyro.PLC_Delta < 	(-5*65536)) k=12;
	  	    
	  	    else if ( Gyro.PLC_Delta >  ( 2*65536)) k=6;
	  	    else if ( Gyro.PLC_Delta < 	(-2*65536)) k=6;
	  	 */   	  	






void PlcRegul(void)			//Программа расчет напряжения для модулятора
{
		
		int PLC_In;
        int tempDelta;
        int tempDac;
       
    LoopOn
		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=1943420832;
		       //15728640
		//AD_MAX=1943400;       
		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;} 	// если ошибка(нахожление в двух модовом)
			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_ADC_DOld = 1;
			}
		}
		else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;}
		
		
		if(((tempDelta>>18)>50)||((tempDelta>>18)<(-50)))
		{   
		    tempDac=(unsigned int)(tempDelta>>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)>20)||((tempDelta>>18)<(-20)))
		{
			tempDac=(unsigned int)(tempDelta>>18);
			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);
           	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;}
		
		if(Gyro.LogPLC==1)
		{
		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
 }





/*
void PlcRegul(void)			//Программа расчет напряжения для модулятора
{
		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_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;
			}
			else
			{
				Gyro.PLC_ADC_DOld = 1;
			}
		}
		else 
		{
			Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;
		}
		
	
		Spi.DAC_B += Gyro.PLC_ADC_DOld * 16;
		
		
		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;}
		
		if(Gyro.LogPLC==1)
		{
		
		sprintf((Time),"%d %d %d\r\n", Spi.DAC_B, Gyro.StrayPLC_flag, temp9);//выдаем в терминал для постройки граффика регулировки периметра.
        WriteCon(Time);
        }
 
 }


*/

void PlcRegul_old(void)  // на всяни	й случай
{
	int Delta;
	 	
	ADD_AMP+=Spi.ADC5;
    Count_AMP++; 
     if(Count_AMP>=(32*32+8)) 
     {
		Delta = ADD_AMP - Cur_Amp;
		
	    if(Gyro.RgConA&0x2)
	    {
			if 		(Znak_Amp > 1)			{Znak_Amp --;}
			else if ( Delta > 30000000 ) 	{AD_Regul += 5000000; Znak_Amp = 5;}
			else if ( Delta < (-3000000)) 	{AD_Regul += 5000000;	Znak_Amp = 5;}
	  	    else if ((Delta * Znak_Amp) > 0)  
			{
			Znak_Amp = 1;
			AD_Regul -= (Delta * Znak_Amp * 10);	
			}
			else
			{
			Znak_Amp = -1;
			AD_Regul -= (Delta * Znak_Amp * 10);	
			}
			
		Spi.DAC_B  = (AD_Regul + 0x1fffffff)/65536;
		}
     	Cur_Amp=ADD_AMP; Count_AMP=0; ADD_AMP=0;
	 }
	 
}




void DAC_OutPut(void)//выдача в цапы
{
	LPC_SSP0->DR=0x5555;
    LPC_SSP0->DR=0x5555;
    LPC_SSP0->DR=0x5555;

    if (CountV31 & 1) {                      	//если нечетный такт то
        LPC_SSP0->DR = WRITE_DAC0;   					//e.команда для ЦАП_0 передавать.
        LPC_SSP0->DR = (Spi.DAC_A);         	//e. передача 12 бит
    }
     else { //если такт четный.
      LPC_SSP0->DR = WRITE_DAC1 ; //e.команда для ЦАП_1 передавать.
        	
		switch( Gyro.StrayPLC_flag) {
			
        case 0://режим без воздействия
        LPC_SSP0->DR = (Spi.DAC_B); 
        temp9=Spi.DAC_B;
        break;
        
        case 1://малое воздействие
        temp9=Spi.DAC_B + Gyro.StrayPLC_Pls;
        LPC_SSP0->DR = temp9;
        break;
        
        case 3://малое воздействие
        temp9=Spi.DAC_B + Gyro.StrayPLC_Mns;
        LPC_SSP0->DR = temp9;
        break;
        
		case 2://большое воздействие
		temp9=Spi.DAC_B + Gyro.StrayPLC_2Mode;
        LPC_SSP0->DR = temp9;//вгоняем в многомодовый режим
        break;
        
    	}  		
     // LPC_SSP0->DR = Spi.DAC_B;        	//e. передача 12 бит
      	 
    }
}






























/*
void SPI_Exchange(void)
{
    unsigned int DummySPI;
  

    Spi.ADC5 = LPC_SSP0->DR;
    Spi.ADC4 = LPC_SSP0->DR;
    Spi.ADC3 = LPC_SSP0->DR;
    Spi.ADC2 = LPC_SSP0->DR;
    Spi.ADC1 = LPC_SSP0->DR;

    Input.ArrayIn[2]= Spi.ADC5;
   
    DAC_OutPut();

//  LPC_DAC->CR = (((SinPLC[CountV64]*35/5)+24300));// модулятор

    while (LPC_SSP0->SR & RX_SSP_notEMPT)  		                //если буфер SPI не пуст.
    DummySPI = LPC_SSP0->DR;	                                //очистить буфер.

    //заполнение буферов еденичных значений АЦП.
    Buff_ADC_1	[CountV31]  = Spi.ADC1;              
    Buff_ADC_2	[CountV31]  = Spi.ADC2;
    Buff_ADC_3	[CountV31]  = Spi.ADC3;
    Buff_ADC_4	[CountV31]  = Spi.ADC4;
    Buff_ADC_5	[CountV255] = Spi.ADC5;    // ампл ацп.

  
   	Temp_AMP64P += Buff_ADC_5[CountV255];
    Temp_AMP64P -= Buff_ADC_5[(CountV255-64) & 0xff];                    // заполнение буфера накопленых приращений за 8 тактов
    Buff_AMP64P[CountV255] = (unsigned int) (Temp_AMP64P);


    Temp_ADC_2 += Buff_ADC_2[CountV31];
    Temp_ADC_2 -= Buff_ADC_2[(CountV31-32) & 0xff];

    Temp_ADC_3 += Buff_ADC_3[CountV31];
    Temp_ADC_3 -= Buff_ADC_3[(CountV31-32) & 0xff];

    Temp_ADC_4 += Buff_ADC_4[CountV31];
    Temp_ADC_4 -= Buff_ADC_4[(CountV31-32) & 0xff];

    Temp_ADC_5 += Buff_ADC_1[CountV255];
    Temp_ADC_5 -= Buff_ADC_1[(CountV255-32) & 0xff];
    Spi.PLC_NewData=1;
}*/