Dmitry Kovalev
/
LGstaandart
forkd
Fork of LG2 by
Diff: SPI.c
- Revision:
- 197:7a05523bf588
- Parent:
- 196:f76dbc081e63
- Child:
- 198:fb22ba6aad54
- Child:
- 201:76f4123bf22a
- Child:
- 205:775d54fdf646
--- a/SPI.c Fri Sep 23 05:34:50 2016 +0000 +++ b/SPI.c Wed Oct 19 10:55:05 2016 +0000 @@ -11,6 +11,7 @@ int k=0,l=0,r=0,n=0;//счетчики для регулировки периметра int flagmod=0,Bdelta; int start=10; +int dispersion=0,side=1,tempstrafe=15000; unsigned int Temp_ADC_2; unsigned int Temp_ADC_3; unsigned int Temp_ADC_4; @@ -18,14 +19,90 @@ unsigned int TempA; unsigned int TempTermLM; +int ADC5Old,ADCDIF=0; +int DACModReg; +int SinPls=0,SinMns=0; +unsigned int ADC5New; 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_ADC_5 [512]; +unsigned int BuffADC_16Point [64]; +unsigned int BuffADC_32Point [64]; +unsigned int BuffADC_64Point [64]; +unsigned int BuffADC_32PointD [64]; +unsigned int Buff_Restored_Mod [64]; + +unsigned int PulseADC_16Point; +unsigned int PulseADC_32Point; +unsigned int PulseADC_64Point; +unsigned int PulseADC_32PointD; + + unsigned int Buff_AMP [256]; unsigned int Buff_AMP64P [256]; +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) +{ + for (int i = 0; i < 64; i++ ) + { + 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 == 0) + { + 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; + // Spi.DAC_B-=ADCDIF>>6; + + if(ADCDIF>0) Spi.DAC_B-=3; + else Spi.DAC_B+=3; + + 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, ADCDIF, ADCDIF>>5, Spi.DAC_B);//выдаем в терминал для постройки граффика регулировки периметра. + WriteCon(Time); + */ + SinPls=0; + SinMns=0; + } +} + void ADS_Acum(void) { @@ -56,25 +133,38 @@ Gyro.ADS_Count = 0; Gyro.ADS_Accum = 0; Gyro.ADS_AccumTermLM=0; - Gyro.ADS_NewData = 1; - + Gyro.ADS_NewData = 1; } } void SPI_Exchange(void) // новая функция чтения, в нецй не должно быть ничего лишнего { unsigned int DummySPI; - Spi.ADC5_Accum += LPC_SSP0->DR; // Чтение АЦП + + //unsigned int ADC5Dif; + + 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; + + + // ADC5Dif = (ADC5New) - (ADC5Old); + // ADC5Old=ADC5New; + + /* +sprintf((Time)," %d\r\n", (Buff_Restored_Mod[CountV64])); +WriteCon(Time); + */ 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; @@ -86,7 +176,52 @@ Spi.ADC4_Accum = 0; Spi.ADC5_Accum = 0; Spi.ADC_NewData = 1; + } + + + + + BuffADC_64Point[CountV64]=ADC5New; + Buff_ADC_5[CountV255] = (0x7fff-ADC5New)<<2; + PLCRegul(); + + + +/* + PulseADC_16Point += Buff_ADC_5[CountV255]; + PulseADC_16Point -= Buff_ADC_5[(CountV255-16)& 0xff]; // заполнение буфера накопленых приращений за 16 тактов + BuffADC_16Point[CountV64] = (Pulse_16Point); + + PulseADC_32Point += Buff_ADC_5[CountV255]; + PulseADC_32Point -= Buff_ADC_5[(CountV255-32)& 0xff ]; // заполнение буфера накопленых приращений за 32 тактов + BuffADC_32Point[CountV64] = (PulseADC_32Point ); + + PulseADC_32PointD += Buff_ADC_5[CountV255]; + PulseADC_32PointD -= Buff_ADC_5[(CountV255-32)& 0xff]; // заполнение буфера накопленых приращений за 32 тактов Двойныз + PulseADC_32PointD += Buff_ADC_5[(CountV255-48)& 0xff]; // + PulseADC_32PointD -= Buff_ADC_5[(CountV255-64)& 0xff]; // + BuffADC_32PointD[CountV64] = PulseADC_32PointD ; + */ + /* PulseADC_64Point += (Buff_ADC_5[CountV255]); + PulseADC_64Point -= Buff_ADC_5[(CountV255-64) & 0xff]; // заполнение буфера накопленых приращений за два 64 тактов + BuffADC_64Point[CountV64] = (PulseADC_64Point);*/ + //ADCDIF += BuffADC_64Point[CountV64]; + /// Buff_Restored_Mod[CountV64] = BuffADC_32PointD[CountV64] - BuffADC_64Point[CountV64]; + + /* if(ADC5Old>3) + { + sprintf((Time),"%d %d \r\n", BuffADC_64Point[CountV64], Buff_Restored_Mod[CountV64]); + WriteCon(Time); + ADC5Old=0; + } + else ADC5Old++; + */ + // BackLightOFF + + // ADCDIF += BuffADC_64Point[CountV64]/*>>5*/; + /* sprintf((Time),"%d %d\r\n", ADC5New, PulseADC_64Point); + WriteCon(Time);*/ } @@ -97,16 +232,24 @@ ////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////смотрим все моды///////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// - if( (Gyro.PLC_Lern<1092)&&(Gyro.PLC_Error2Mode != 0))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. + if(dispersion>5) + { + if( (Gyro.PLC_Lern<60000)&&(Gyro.PLC_Error2Mode >1))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. { Gyro.PLC_Error2Mode--; Gyro.PLC_Lern++; - Spi.DAC_B += 0x3c; - if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; - sprintf((Time),"%d %d %d %d \r\n",Gyro.TermLM, Spi.DAC_B, Gyro.AD_Slow, AD_MAX); - WriteCon(Time); + Spi.DAC_B += tempstrafe*side; + if(side>0)side=(-1); + else side = 1; + tempstrafe-=40; + dispersion=0; } - else {Gyro.ModJump=0;} + else {Gyro.LogPLC=0;} + } + else dispersion++; + sprintf((Time),"%d %d %d %d \r\n", Gyro.CuruAngle, Spi.DAC_B, Gyro.AD_Slow, Gyro.Termo); + Gyro.CuruAngle=0; + WriteCon(Time); } @@ -120,7 +263,7 @@ int templm=0; int PLC_In; int tempDac; - if(0<start<=5) + if(start<=5) { if(ttt) {// +25 С° @@ -136,6 +279,7 @@ else if((start==0)) { + PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; //узнаем приращение Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения @@ -152,26 +296,41 @@ if(Gyro.Ktermo)Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 else Spi.DAC_B -= 0x3c; if(AD_MAX < PLC_In){AD_MAX = PLC_In;} //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. - else if ((AD_MAX>PLC_In)&&(AD_MAX>1500800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. + else if ((AD_MAX>PLC_In)&&(AD_MAX>1550800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. if (r>10) { - Gyro.PLC_Lern=150; + Gyro.PLC_Lern=151; Gyro.PLC_Error2Mode=3; } //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска - Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. - } //работает только первые ~30-40 секунд (37 сек). + Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. + } //работает только первые ~30-40 секунд (37 сек). if (Gyro.PLC_Lern<160) Gyro.PLC_Lern++; if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. else l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) - if((l > 100)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 2107200;k=15;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m - if ((k == 15)&&(Gyro.PLC_Lern > 150)) Spi.DAC_B += 75; //после уменьшения максимальной амплитуды двигаем шевелем цап - else if((k == 1)&&(Gyro.PLC_Lern > 150)) {Spi.DAC_B -= 75; k=0;l=0;} //для быстрог поиска новог максимума. + if((l > 300)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 2107200;k=15;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m + if ((k == 15)&&(Gyro.PLC_Lern > 150)) Spi.DAC_B += 75; //после уменьшения максимальной амплитуды двигаем шевелем цап + else if((k == 1)&&(Gyro.PLC_Lern > 150)) {Spi.DAC_B -= 75; k=0;l=0;} //для быстрог поиска новог максимума. if(k>0)k--; Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами. - + if(Gyro.ModJump==1) { ///прыжок с моды на моду. (-->) + Gyro.OldCuruAngle = Gyro.CuruAngle; + Gyro.ModJump=0; + Spi.DAC_B += 4300; + Gyro.PLC_Error2Mode=1; + Gyro.StopCuruAngle=2; + } + + if(Gyro.ModJump==2) { ///прыжок с моды на моду. (<--) + Gyro.OldCuruAngle = Gyro.CuruAngle; + Gyro.ModJump=0; + Spi.DAC_B -= 5250; + Gyro.PLC_Error2Mode=1; + Gyro.StopCuruAngle=2; + } + if(Gyro.RgConA&0x8) { // если контур регулирования замкнут if ( Gyro.PLC_Error2Mode > 0) { Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0;} // если ошибка(нахожление в двух модовом) else if ( Gyro.PLC_DeltaADD > 0) { Gyro.PLC_ADC_DOld = 1;} @@ -181,70 +340,58 @@ else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} ///прыжок с моды на моду. -/* - if(Gyro.ModJump==1) { ///прыжок с моды на моду. (-->) - Gyro.ModJump=0; - Spi.DAC_B += 12500; - Gyro.PLC_Error2Mode=4; - } - if(Gyro.ModJump==2) { ///прыжок с моды на моду. (<--) - Gyro.ModJump=0; - Spi.DAC_B -= 12500; - Gyro.PLC_Error2Mode=4; - } */ - - + + + tempADC5=0x7fff-Spi.ADC5; // контур замкнут включен лазер if((Gyro.RgConA&0x8) && (tempADC5>1000)) - { - if(Gyro.PlC_MaxD>(50<<17)) { //3 режим регулирования + { + if(Gyro.PlC_MaxD>(50<<17)) { // 3 режим регулирования tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); - if(tempDac>600) {tempDac=600;} //ограничение на регулирование если очень большая разница амплитуд - Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) - tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи + if(tempDac>600) tempDac=600; //ограничение на регулирование если очень большая разница амплитуд + Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) + tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи flagmod=3; - } - else if(Gyro.PlC_MaxD>(20<<17)) { // 2 режим регулирования + else if(Gyro.PlC_MaxD>(12<<17)) { // 2 режим регулирования tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac); - tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи + tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи flagmod=2; } - else if(Gyro.PlC_MaxD<(4<<17)) { //режим если дельта равна 0;Gyro.ModJump - tempDac=1; + /* else if(Gyro.PlC_MaxD<(2<<17)) { //режим если дельта равна 0;Gyro.ModJump + tempDac=2; Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; flagmod=0; - } + } */ else { - tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); // 1 режим регулирования + tempDac=2; // 1 режим регулирования Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; tempDac = Gyro.PLC_ADC_DOld * tempDac; flagmod=1; } - } + } - if ( Spi.DAC_B < 18300 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} //проверка на переваливание за границу. + if ( Spi.DAC_B < 15300 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} //проверка на переваливание за границу. else if ( Spi.DAC_B > 53000) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} } - + if(Gyro.StopCuruAngle) {Gyro.CuruAngle = Gyro.OldCuruAngle; Gyro.StopCuruAngle--;} /////////////////////// //////////лог////////// /////////////////////// if(Gyro.LogPLC==1) { // LoopOn - sprintf((Time),"%d %d %d %d %d %d %d %d \r\n",Gyro.CuruAngle, Gyro.tempdelta, Gyro.tempdelta2, Spi.DAC_B, tempDac, AD_MAX, PLC_In, Gyro.Termo);//выдаем в терминал для постройки граффика регулировки периметра. + 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 - + // LoopOff } } @@ -351,12 +498,13 @@ void DAC_OutPut(void)//выдача в цапы { + Modulator(); 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 = WRITE_DAC0; //e.команда для ЦАП_0 передавать. LPC_SSP0->DR = (Spi.DAC_A); //e. передача 12 бит } else { //если такт четный. LPC_SSP0->DR = WRITE_DAC1 ; //e.команда для ЦАП_1 передавать.