![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
fork
Fork of LG by
Diff: SPI.c
- Revision:
- 150:29c9f7671bac
- Parent:
- 148:7ce8c1fd00f7
- Child:
- 151:d565ce4d58c8
diff -r abbf7663d27d -r 29c9f7671bac SPI.c --- a/SPI.c Tue May 03 05:12:26 2016 +0000 +++ b/SPI.c Wed May 04 14:01:57 2016 +0000 @@ -8,7 +8,8 @@ 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; @@ -50,8 +51,8 @@ if (Gyro.ADF_Count > 15) // если прошло 16 тактов виброподвеса { - Gyro.AD_Fast = Gyro.ADF_Accum << 12; //обновляем данные и приводим в один масштаб - Gyro.ADF_Count = 0; + Gyro.AD_Fast = Gyro.ADF_Accum << 12; //обновляем данные и приводим в один масштаб + Gyro.ADF_Count = 0;// Gyro.ADF_Accum = 0; Gyro.ADF_NewData = 1; } @@ -130,12 +131,12 @@ void PlcRegul(void) //Программа расчет напряжения для модулятора { - int k; + int PLC_In; int tempDelta; int tempDac; - int flagmod; - + + LoopOn PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации // PLC_In = Gyro.AD_Fast; //или+,или-(знак) @@ -145,9 +146,31 @@ //AD_MAX=1943420832; //15728640 //AD_MAX=1943400; - if(AD_MAX<Gyro.AD_Slow) - {AD_MAX=Gyro.AD_Slow/*+2621440*10;*/;} - tempDelta=AD_MAX-Gyro.AD_Slow; + 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;} // если ошибка(нахожление в двух модовом) @@ -160,25 +183,30 @@ Gyro.PLC_ADC_DOld = 1; } } - else - { - Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0; - } - if(((tempDelta>>18)>30)||((tempDelta>>18)<(-30))) + else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} + + + if(((tempDelta>>18)>50)||((tempDelta>>18)<(-50))) { tempDac=(unsigned int)(tempDelta>>18); - if(tempDac>450) {tempDac=400;} - Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac/*Gyro.PLC_Delta>>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)>10)||((tempDelta>>18)<(-10))) + else if(((tempDelta>>18)>20)||((tempDelta>>18)<(-20))) { tempDac=(unsigned int)(tempDelta>>18); - Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac); - tempDac = Gyro.PLC_ADC_DOld * (tempDac); + 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); @@ -190,15 +218,13 @@ 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;} - -k=1; if(Gyro.LogPLC==1) { - sprintf((Time),"%d %d %d %d %d\r\n", Spi.DAC_B, temp9,tempDelta>>18,tempDac,flagmod/*(Gyro.PLC_ADC_DOld * Gyro.PLC_Delta>>18)*/);//выдаем в терминал для постройки граффика регулировки периметра. + 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 }