fork

Dependencies:   mbed

Fork of LG by igor Apu

SPI.c

Committer:
Kovalev_D
Date:
2016-04-07
Revision:
121:bbae560cdd43
Parent:
116:66f1f0ff2dab
Child:
122:fbacb932a30b

File content as of revision 121:bbae560cdd43:

#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;



unsigned int Temp_ADC_2;
unsigned int Temp_ADC_3;
unsigned int Temp_ADC_4;
unsigned int Temp_ADC_5;


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 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.PLC_NewData = 1;
  	}
  	Spi.ADC_NewData = 1;

}

void PlcRegul(void)			//Программа расчет напряжения для модулятора
{
		int PLC_In;

		PLC_In = Gyro.AD_Slow;
//		PLC_In = Gyro.AD_Fast;
	
		Gyro.PLC_Delta = Gyro.PLC_Old - PLC_In;
 
	    
	    
	    if(Gyro.RgConA&0x2)
	    {
			if 		(Gyro.PLC_Znak > 1)			{Gyro.PLC_Znak --;}
			else if ( Gyro.PLC_Delta > 	(1000 * 65536)) 	{Spi.DAC_B += 2500; 	Gyro.PLC_Znak = 5;}
			else if ( Gyro.PLC_Delta < 	(-1000 * 65536)) 	{Spi.DAC_B += 2500;		Gyro.PLC_Znak = 5;}
	  	    else if ((Gyro.PLC_Delta * Gyro.PLC_Znak) > 0)  
			{
			Gyro.PLC_Znak = 1;
//			Gyro.PLC_Regul -= ((Gyro.PLC_Delta * Gyro.PLC_Znak)/100);	
			Spi.DAC_B  += (((Gyro.PLC_Delta * Gyro.PLC_Znak)/65536))*16;

			}
			else
			{
			Gyro.PLC_Znak = -1;
//			Gyro.PLC_Regul -= ((Gyro.PLC_Delta * Gyro.PLC_Znak)/100);	
			Spi.DAC_B  -= (((Gyro.PLC_Delta * Gyro.PLC_Znak)/65536))*16;
			}
//			Spi.DAC_B  = (Gyro.PLC_Regul + 0x1fffffff)/65536;

		}
 		Gyro.PLC_Old = PLC_In;
}




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 передавать.
        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;
}*/