![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
fork
Fork of LG by
Diff: SPI.c
- Revision:
- 202:c03b7b128e11
- Parent:
- 201:76f4123bf22a
diff -r 76f4123bf22a -r c03b7b128e11 SPI.c --- a/SPI.c Wed Nov 02 14:05:24 2016 +0000 +++ b/SPI.c Fri Nov 18 06:07:37 2016 +0000 @@ -2,16 +2,15 @@ struct SPI Spi; //unsigned int Temp_AMP; unsigned int Temp_AMP64P; -int ttt=1; +int TempShift=1; unsigned int Count_AMP, ADD_AMP, Cur_Amp; -int Znak_Amp; int AD_Regul = 0; int temp9,tempADC5; int AD_MAX=0; -int k=0,l=0,r=0,n=0;//счетчики для регулировки периметра +int k=0,l=0,r=0;//счетчики для регулировки периметра int flagmod=0,Bdelta; int start=1; -int dispersion=0,side=1,tempstrafe=15000; +int flagPLC=0,templm=0; unsigned int Temp_ADC_2; unsigned int Temp_ADC_3; unsigned int Temp_ADC_4; @@ -19,7 +18,7 @@ unsigned int TempA; unsigned int TempTermLM; -int ADC5Old,ADCDIF=0; +int ADC5Old,ADCDIF=0,ADCDIFconsol=0; int DACModReg; int SinPls=0,SinMns=0; unsigned int ADC5New; @@ -47,7 +46,6 @@ unsigned int TypeMod=0; unsigned int ModArraySin [64] = {50,55,59,64,68,73,77,81,85,88,91,94,96,98,99,99,100,99,99,98,96,94,91,88,85,81,77,73,68,64,59,55,50,45,41,36,32,27,23,19,16,12,9,7,4,2,1,1,0,1,1,2,4,7,9,12,16,19,23,27,32,36,41,45}; unsigned int ModArrayTriangle [64]; -unsigned int ModArraySaw [64]; unsigned int Mod=0; void InitMOD(void) @@ -57,48 +55,53 @@ if(i<32) { ModArrayTriangle[i]=Mod; Mod+=3;} else { ModArrayTriangle[i]=Mod; Mod-=3;} } - - for (int i = 0; i < 64; i++ ) - { - ModArraySaw[i]=Mod; - Mod+=2; - } } void Modulator(void) { switch(TypeMod) { case 0: LPC_DAC->DACR = (ModArraySin [CountV64]*Gyro.ModAmp); break; - case 1: LPC_DAC->DACR = (ModArraySaw [CountV64]*Gyro.ModAmp); break; case 2: LPC_DAC->DACR = (ModArrayTriangle [CountV64]*Gyro.ModAmp); break; } } void PLCRegul(void) { - - if (CountV64 == 63) - { - for (int i = 0; i < 32; i++ ) - { - SinPls+= BuffADC_64Point[i]; - } - for (int i = 32; i < 64; i++ ) - { - SinMns+= BuffADC_64Point[i]; - } - ADCDIF = SinPls - SinMns; - - /* if(ADCDIF>0) Spi.DAC_B-=3; - else Spi.DAC_B+=3;*/ - Spi.DAC_B -= ADCDIF>>7; - if ( Spi.DAC_B < 15300 ) Spi.DAC_B = 32000; //проверка на переваливание за границу. - else if ( Spi.DAC_B > 53000 ) Spi.DAC_B = 32000; - - /*sprintf((Time),"%d %d %d %d %d \r\n", SinPls, SinMns, Gyro.Start, Gyro.Termo, Spi.DAC_B);//выдаем в терминал для постройки граффика регулировки периметра. - WriteCon(Time);*/ - SinPls=0; - SinMns=0; + if(Gyro.Start==200) + {// +25 С° + if(flagPLC==0) + { //Spi.DAC_B=32767; + templm = (Gyro.TermoNKU-Gyro.Termo); //дельта температуры от нку + Spi.DAC_B+=templm; //сдвиг начальной точки цап + flagPLC=1;//выставка флага для начала регулирования + } + } + if(Gyro.LogPLC)//Gyro.LogPLC=1-без выдачи, 2 - с выдачей, 0 - дисперсионка. + { + if(flagPLC) + { + if (CountV64 == 63) //прошло 2 такта виброподвеса 200Hz + { + for (int i = 0; i < 31; i++ )//считаем сумму амплитуд по положительной полуволне + { + SinPls+= BuffADC_64Point[i]; + } + for (int i = 32; i < 63; i++ ) + { + SinMns+= BuffADC_64Point[i];//по отрицательной полуволне + } + ADCDIF = SinPls - SinMns; // разница между полуволнами +/* if(ADCDIF>0) Spi.DAC_B-=3; +else Spi.DAC_B+=3;*/ + Spi.DAC_B -= ADCDIF>>9;// регулировка периметра в зависимости от величины разници двух полуволн. + ADCDIFconsol+=ADCDIF>>9; + + if ( Spi.DAC_B < 15300 ) Spi.DAC_B = 32000; //проверка на переваливание за границу. + else if ( Spi.DAC_B > 53000 ) Spi.DAC_B = 32000; + SinPls=0; + SinMns=0; + } } + } } @@ -138,16 +141,16 @@ void SPI_Exchange(void) // новая функция чтения, в нецй не должно быть ничего лишнего { unsigned int DummySPI; - /* - if(Gyro.Start>2000) DummySPI = LPC_SSP0->DR;*/ - //unsigned int ADC5Dif; - + + // BackLightON ADC5New = LPC_SSP0->DR;// Чтение АЦП //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; + + Spi.ADC5_Accum += ADC5New; @@ -155,6 +158,7 @@ DummySPI = LPC_SSP0->DR; //если буфер SPI не пуст.//очистить буфер. } DAC_OutPut(); + if (CountV31 == 0) { // просто фильтруем по 32 точкам. // выставояем бит, что есть новы данные Spi.ADC1 = Spi.ADC1_Accum >> 5; // подгоотавливаем данные (в той эе сетке) те ADC1 0..65535 @@ -172,8 +176,33 @@ BuffADC_64Point[CountV64]=ADC5New; Buff_ADC_5[CountV255] = (0x7fff-ADC5New)<<2; PLCRegul(); + // BackLightOFF } + +void ShowMod(void)//технологическая функция для просмотра в ориджине мод на всем диапазпне цап +{ + + ////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////смотрим все моды///////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + if( (Gyro.PLC_Lern<60000)&&(Gyro.PLC_Error2Mode >1))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. + { + Gyro.PLC_Error2Mode--; + Gyro.PLC_Lern++; + Spi.DAC_B += 40; + } + else {Gyro.LogPLC=1;} + + sprintf((Time),"%d %d %d %d \r\n", Gyro.CuruAngle, Spi.DAC_B, Gyro.AD_Slow, Gyro.Termo); + Gyro.CuruAngle=0; + WriteCon(Time); +} + + + +/* void ShowMod(void)//технологическая функция для просмотра в ориджине мод на всем диапазпне цап { @@ -199,9 +228,7 @@ Gyro.CuruAngle=0; WriteCon(Time); } - - - +*/ void PlcRegul(void) @@ -213,13 +240,13 @@ int tempDac; if(start<=5) { - if(ttt) + if(TempShift) {// +25 С° templm = (Gyro.TermoNKU-Gyro.Termo); //дельта if(templm>0) Gyro.Ktermo=1; else Gyro.Ktermo=0; Spi.DAC_B+=templm; - ttt=0; + TempShift=0; } } @@ -333,13 +360,13 @@ //////////лог////////// /////////////////////// if(Gyro.LogPLC==1) { - // LoopOn + sprintf((Time),"%d %d %d %d %d %d %d %d %d \r\n",Gyro.CuruAngle, Gyro.Frq, Gyro.MaxAmp, Spi.DAC_B, tempDac, flagmod, AD_MAX, PLC_In, Gyro.Termo);//выдаем в терминал для постройки граффика регулировки периметра. Gyro.CuruAngle=0; Gyro.tempdelta=0; Gyro.tempdelta2=0; WriteCon(Time); - // LoopOff + // } } @@ -445,8 +472,10 @@ */ void DAC_OutPut(void)//выдача в цапы -{ - Modulator(); +{ + if(Gyro.LogPLC) Modulator(); + + LPC_SSP0->DR=0x5555; LPC_SSP0->DR=0x5555; LPC_SSP0->DR=0x5555; @@ -454,35 +483,14 @@ 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; -*/ + } + else { //если такт четный. + LPC_SSP0->DR = WRITE_DAC1; //e.команда для ЦАП_1 передавать. + LPC_SSP0->DR = (Spi.DAC_B); + temp9=Spi.DAC_B; } - // LPC_SSP0->DR = Spi.DAC_B; //e. передача 12 бит - - } + + }