Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LG by
Diff: SPI.c
- Revision:
- 202:c03b7b128e11
- Parent:
- 201:76f4123bf22a
--- 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 бит - - } + + }