Dmitry Kovalev
/
LGfiltr
forkd
Fork of LGstaandart by
Diff: SPI.c
- Revision:
- 144:083c667ba848
- Parent:
- 143:2b15794a6cd2
- Child:
- 146:2bea299a7c4f
diff -r 2b15794a6cd2 -r 083c667ba848 SPI.c --- a/SPI.c Wed Apr 27 06:46:17 2016 +0000 +++ b/SPI.c Wed Apr 27 14:04:45 2016 +0000 @@ -71,23 +71,7 @@ -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; @@ -108,25 +92,42 @@ else if ( Gyro.PLC_Delta > ( 2*65536)) k=6; else if ( Gyro.PLC_Delta < (-2*65536)) k=6; - + */ + + + + + + +void PlcRegul(void) //Программа расчет напряжения для модулятора +{ + int k; + int PLC_In; + int tempDelta; + int tempDac; + int flagmod; + int AD_MAX; + 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; // запоминание значения + AD_MAX=1941520832; + //15728640 + tempDelta=AD_MAX-Gyro.AD_Slow; + if(Gyro.RgConA&0x2) // если включон контур регулирования + { + - 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_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; - } + if ( Gyro.PLC_Error2Mode > 0) {Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0;} // если ошибка(нахожление в двух модовом) + else if ( Gyro.PLC_Delta > (3500 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} // проверка на двух модовость + else if ( Gyro.PLC_Delta < (-3500 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} + else if ( Gyro.PLC_DeltaADD > 0) {Gyro.PLC_ADC_DOld = 1;} + else if ( Gyro.PLC_DeltaADD < 0) {Gyro.PLC_ADC_DOld = -1;} else { + //Gyro.PLC_Delta=1114111;//если делта 0 то Spi.DAC_B += 4; Gyro.PLC_ADC_DOld = 1; } } @@ -135,17 +136,41 @@ Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0; } - - Spi.DAC_B += Gyro.PLC_ADC_DOld * /*32*/ k; - + 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*/; + tempDac = Gyro.PLC_ADC_DOld * tempDac; + flagmod=3; + } + else if(((tempDelta>>18)>30)||((tempDelta>>18)<(-30))) + { + tempDac=(unsigned int)(tempDelta>>19); + Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac+5); + tempDac = Gyro.PLC_ADC_DOld * (tempDac+5); + flagmod=2; + } + else + { + tempDac=(unsigned int)(tempDelta>>20); + Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; + tempDac = Gyro.PLC_ADC_DOld * tempDac; + flagmod=1; + } + + 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; + +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));//выдаем в терминал для постройки граффика регулировки периметра. + 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)*/);//выдаем в терминал для постройки граффика регулировки периметра. WriteCon(Time); }