Dmitry Kovalev
/
LGstaandart
forkd
Fork of LG2 by
Diff: SPI.c
- Revision:
- 141:c6de20b9b483
- Parent:
- 140:1fbf117fc120
- Child:
- 142:7a6f68601291
diff -r 1fbf117fc120 -r c6de20b9b483 SPI.c --- a/SPI.c Mon Apr 25 13:33:57 2016 +0000 +++ b/SPI.c Tue Apr 26 13:42:09 2016 +0000 @@ -6,7 +6,7 @@ unsigned int Count_AMP, ADD_AMP, Cur_Amp; int Znak_Amp; int AD_Regul = 0; - +int temp9; unsigned int Temp_ADC_2; @@ -67,6 +67,118 @@ } + + + + +void PlcRegul(void) //Программа расчет напряжения для модулятора +{ + int k; + int PLC_In; + + + PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации +// PLC_In = Gyro.AD_Fast; + //или+,или-(знак) + Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; // узнаем приращение + // (знак) * (то на что инкрементировали цап) + Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения + Gyro.PLC_Old = PLC_In; // запоминание значения + + if(Gyro.RgConA&0x2) // если включон контур регулирования + { + + if ( Gyro.PLC_Delta > ( 100 * 65536)) k=256; + else if ( Gyro.PLC_Delta < (-100 * 65536)) k=256; + + else if ( Gyro.PLC_Delta > ( 55 * 65536)) k=64; + else if ( Gyro.PLC_Delta < (-55 * 65536)) k=64; + + else if ( Gyro.PLC_Delta > ( 37 * 65536)) k=20; + else if ( Gyro.PLC_Delta < (-37 * 65536)) k=20; + + else if ( Gyro.PLC_Delta > ( 25 * 65536)) k=16; + else if ( Gyro.PLC_Delta < (-25 * 65536)) k=16; + + else if ( Gyro.PLC_Delta > ( 15*65536)) k=8; + else if ( Gyro.PLC_Delta < (-15*65536)) k=8; + + else if ( Gyro.PLC_Delta > ( 5*65536)) k=6; + else if ( Gyro.PLC_Delta < (-5*65536)) k=6; + + else if ( Gyro.PLC_Delta > ( 2*65536)) k=4; + else if ( Gyro.PLC_Delta < (-2*65536)) k=4; + + + if (Gyro.PLC_Error2Mode > 0) {Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0; } // если ошибка(нахожление в двух модовом) + else if ( Gyro.PLC_Delta > (3000 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} // проверка на двух модовость + else if ( Gyro.PLC_Delta < (-3000 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} + /* + else if ( Gyro.PLC_Delta > ( 1500 * 65536)) k=128; + else if ( Gyro.PLC_Delta < (-1500 * 65536)) k=128; + + else if ( Gyro.PLC_Delta > ( 1000 * 65536)) k=64; + else if ( Gyro.PLC_Delta < (-1000 * 65536)) k=64; + + else if ( Gyro.PLC_Delta > ( 500 * 65536)) k=32; + else if ( Gyro.PLC_Delta < (-500 * 65536)) k=32; + + else if ( Gyro.PLC_Delta > ( 200 * 65536)) k=16; + else if ( Gyro.PLC_Delta < (-200 * 65536)) k=16; + + else if ( Gyro.PLC_Delta > ( 100*65536)) k=8; + else if ( Gyro.PLC_Delta < (-100*65536)) k=8; + + else if ( Gyro.PLC_Delta > ( 50*65536)) k=4; + else if ( Gyro.PLC_Delta < (-50*65536)) k=4; + + else if ( Gyro.PLC_Delta > ( 10*65536)) k=2; + else if ( Gyro.PLC_Delta < (-10*65536)) k=2; + + */ + else if (Gyro.PLC_DeltaADD > 0) + { + +// Gyro.PLC_ADC_DOld = (Gyro.PLC_DeltaADD /6553600 )+1; + Gyro.PLC_ADC_DOld = 1; + } + else if (Gyro.PLC_DeltaADD < 0) + { + +// Gyro.PLC_ADC_DOld = (Gyro.PLC_DeltaADD /6553600 )-1; + Gyro.PLC_ADC_DOld = -1; + } + else + { + Gyro.PLC_ADC_DOld = 1; + } + } + else + { + Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0; + } + + + Spi.DAC_B += Gyro.PLC_ADC_DOld * /*32*/ k; + + + 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\r\n", Spi.DAC_B, Gyro.StrayPLC_flag, temp9,(Gyro.PLC_Delta/65536));//выдаем в терминал для постройки граффика регулировки периметра. + WriteCon(Time); + } + + } + + + + + +/* void PlcRegul(void) //Программа расчет напряжения для модулятора { int PLC_In; @@ -108,28 +220,24 @@ Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0; } - - switch( Gyro.StrayPLC_flag) { - case 0: - Spi.DAC_B += Gyro.PLC_ADC_DOld * 16; - break; - case 1: - Spi.DAC_B += ((Gyro.PLC_ADC_DOld * 16)+Gyro.StrayPLC);//вносим помеху - break; - case 2: - Spi.DAC_B += ((Gyro.PLC_ADC_DOld * 16)+Gyro.StrayPLC_2Mode);//вгоняем в многомодовый режим - break; - } - //Spi.DAC_B += Gyro.PLC_ADC_DOld * 16; + + Spi.DAC_B += Gyro.PLC_ADC_DOld * 16; 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;} + + if(Gyro.LogPLC==1) + { + + sprintf((Time),"%d %d %d\r\n", Spi.DAC_B, Gyro.StrayPLC_flag, temp9);//выдаем в терминал для постройки граффика регулировки периметра. + WriteCon(Time); + } } - +*/ void PlcRegul_old(void) // на всяни й случай { @@ -176,9 +284,27 @@ 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 бит + } + 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; + LPC_SSP0->DR = temp9; + + break; + case 2://большое воздействие + temp9=Spi.DAC_B + Gyro.StrayPLC_2Mode; + LPC_SSP0->DR = temp9;//вгоняем в многомодовый режим + break; + } + // LPC_SSP0->DR = Spi.DAC_B; //e. передача 12 бит + } }