Dmitry Kovalev
/
LGfiltr
forkd
Fork of LGstaandart by
Diff: SPI.c
- Revision:
- 157:1069c80f4944
- Parent:
- 155:94e7ac5fea58
- Child:
- 158:0c8342e1837a
diff -r e68ee0bcdcda -r 1069c80f4944 SPI.c --- a/SPI.c Mon May 09 20:03:26 2016 +0000 +++ b/SPI.c Tue May 10 14:11:25 2016 +0000 @@ -38,63 +38,62 @@ void ADS_Acum(void) { - // можно апихнкть в функцию - Spi.ADC_NewData = 0; - Gyro.Termo = Spi.ADC1; - Gyro.In1 = Spi.ADC2; - Gyro.In2 = Spi.ADC3; - Gyro.DeltaT = Spi.ADC4; - TempA = (0x7fff - Spi.ADC5) << 1; // перевернем знак и умножим на два (было 32000...0 стало 0 ...64000) + // можно апихнкть в функцию + Spi.ADC_NewData = 0; + Gyro.Termo = Spi.ADC1; + Gyro.In1 = Spi.ADC2; + Gyro.In2 = Spi.ADC3; + Gyro.DeltaT = Spi.ADC4; + TempA = (0x7fff - Spi.ADC5) << 1; // перевернем знак и умножим на два (было 32000...0 стало 0 ...64000) - Gyro.ADF_Accum += TempA; - Gyro.ADS_Accum += TempA; - Gyro.ADF_Count ++; - Gyro.ADS_Count ++; + Gyro.ADF_Accum += TempA; + Gyro.ADS_Accum += TempA; + Gyro.ADF_Count ++; + Gyro.ADS_Count ++; - if (Gyro.ADF_Count > 15) // если прошло 16 тактов виброподвеса - { - Gyro.AD_Fast = Gyro.ADF_Accum << 12; //обновляем данные и приводим в один масштаб - Gyro.ADF_Count = 0;// - Gyro.ADF_Accum = 0; - Gyro.ADF_NewData = 1; - } - if (Gyro.ADS_Count > 255) // если прошло 256 тактов виброподвеса - { - Gyro.AD_Slow = Gyro.ADS_Accum << 8; //обновляем данные и приводим в один масштаб - Gyro.ADS_Count = 0; - Gyro.ADS_Accum = 0; - Gyro.ADS_NewData = 1; - } + if (Gyro.ADF_Count > 15) { // если прошло 16 тактов виброподвеса + Gyro.AD_Fast = Gyro.ADF_Accum << 12; //обновляем данные и приводим в один масштаб + Gyro.ADF_Count = 0;// + Gyro.ADF_Accum = 0; + Gyro.ADF_NewData = 1; + } + if (Gyro.ADS_Count > 255) { // если прошло 256 тактов виброподвеса + Gyro.AD_Slow = Gyro.ADS_Accum << 8; //обновляем данные и приводим в один масштаб + Gyro.ADS_Count = 0; + Gyro.ADS_Accum = 0; + Gyro.ADS_NewData = 1; + } } void SPI_Exchange(void) // новая функция чтения, в нецй не должно быть ничего лишнего - { - unsigned int DummySPI; - Spi.ADC5_Accum += LPC_SSP0->DR; // Чтение АЦП +{ + unsigned int DummySPI; + 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; - while (LPC_SSP0->SR & RX_SSP_notEMPT) {DummySPI = LPC_SSP0->DR;} //если буфер SPI не пуст.//очистить буфер. - - + 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; - Spi.ADC4 = Spi.ADC4_Accum >> 5; - Spi.ADC5 = Spi.ADC5_Accum >> 5; - Spi.ADC1_Accum = 0; // сбрасывкем аккамулятор - Spi.ADC2_Accum = 0; - Spi.ADC3_Accum = 0; - Spi.ADC4_Accum = 0; - Spi.ADC5_Accum = 0; - Spi.ADC_NewData = 1; - } + + 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; + Spi.ADC4 = Spi.ADC4_Accum >> 5; + Spi.ADC5 = Spi.ADC5_Accum >> 5; + Spi.ADC1_Accum = 0; // сбрасывкем аккамулятор + Spi.ADC2_Accum = 0; + Spi.ADC3_Accum = 0; + Spi.ADC4_Accum = 0; + Spi.ADC5_Accum = 0; + Spi.ADC_NewData = 1; + } } @@ -103,28 +102,28 @@ - /* - 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 > ( 40 * 65536)) k=30; - else if ( Gyro.PLC_Delta < (-40 * 65536)) k=30; - - else if ( Gyro.PLC_Delta > ( 25 * 65536)) k=20; - else if ( Gyro.PLC_Delta < (-25 * 65536)) k=20; - - else if ( Gyro.PLC_Delta > ( 15*65536)) k=16; - else if ( Gyro.PLC_Delta < (-15*65536)) k=16; +/* + 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 > ( 40 * 65536)) k=30; + else if ( Gyro.PLC_Delta < (-40 * 65536)) k=30; - else if ( Gyro.PLC_Delta > ( 5*65536)) k=12; - else if ( Gyro.PLC_Delta < (-5*65536)) k=12; - - else if ( Gyro.PLC_Delta > ( 2*65536)) k=6; - else if ( Gyro.PLC_Delta < (-2*65536)) k=6; - */ + else if ( Gyro.PLC_Delta > ( 25 * 65536)) k=20; + else if ( Gyro.PLC_Delta < (-25 * 65536)) k=20; + + else if ( Gyro.PLC_Delta > ( 15*65536)) k=16; + else if ( Gyro.PLC_Delta < (-15*65536)) k=16; + + else if ( Gyro.PLC_Delta > ( 5*65536)) k=12; + else if ( Gyro.PLC_Delta < (-5*65536)) k=12; + + else if ( Gyro.PLC_Delta > ( 2*65536)) k=6; + else if ( Gyro.PLC_Delta < (-2*65536)) k=6; + */ @@ -133,142 +132,118 @@ void PlcRegul(void) //Программа расчет напряжения для модулятора//выполняется 1.25 микросек. { - LoopOn - int PLC_In; - int tempDelta; - int tempDac; - - - - 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; // запоминание значения - - - - + int PLC_In; + int tempDac; -/* - ////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////смотрим все моды///////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// - if( (Gyro.PLC_Lern<1011)&&(Gyro.PLC_Error2Mode != 0))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. - { - //if(AD_MAX < Gyro.AD_Slow) {AD_MAX = Gyro.AD_Slow;} - ttt=1; - Gyro.PLC_Lern++; - Spi.DAC_B += 0x3c; - if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; - sprintf((Time),"%d %d %d \r\n", Spi.DAC_B, Gyro.AD_Slow, AD_MAX); - WriteCon(Time); - } +// PLC_In = Gyro.AD_Fast; + //или+,или-(знак) -/////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// + PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации + Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; // узнаем приращение + Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения + Gyro.PLC_Old = PLC_In; // запоминание значения + + Gyro.PlC_MaxD=(unsigned int)(AD_MAX-Gyro.AD_Slow); //ищем разницу между желаемой и действительной амплитудами. ** + /* + ////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////смотрим все моды///////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + if( (Gyro.PLC_Lern<1011)&&(Gyro.PLC_Error2Mode != 0))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. + { + //if(AD_MAX < Gyro.AD_Slow) {AD_MAX = Gyro.AD_Slow;} + ttt=1; + Gyro.PLC_Lern++; + Spi.DAC_B += 0x3c; + if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; + sprintf((Time),"%d %d %d \r\n", Spi.DAC_B, Gyro.AD_Slow, AD_MAX); + WriteCon(Time); + } -*/ + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + */ + // 3600 (размер моды порядка 3000) + if((Gyro.PLC_Lern < 60) && (Gyro.PLC_Error2Mode != 0)) { //пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. + Gyro.PLC_Lern++; //инкрементируем счетчик поиска максимальной амплитуды + if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. * + Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 + } //работает только первые ~30-40 секунд (37 сек). - // 3600 (размер моды порядка 3000) - if( (Gyro.PLC_Lern<60)&&(Gyro.PLC_Error2Mode != 0))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. - { - Gyro.PLC_Lern++; //инкрементируем счетчик поиска максимальной амплитуды - if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. - Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 - } //работает только первые ~30-40 секунд (37 сек). - - if(AD_MAX < Gyro.AD_Slow) {AD_MAX = Gyro.AD_Slow; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. - else l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) - - tempDelta=(unsigned int)(AD_MAX-Gyro.AD_Slow); //ищем разницу между желаемой и действительной амплитудами. - //ели небыло обновления максимальной амплитуды инкрементируем счетчика малого понижения амплитуды. - if((l>100)&&(Gyro.PLC_Lern>59)) {AD_MAX -= 3107200; l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). + if(AD_MAX < Gyro.AD_Slow) { AD_MAX = Gyro.AD_Slow; l=0; }//обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. * + else l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) + + //ели небыло обновления максимальной амплитуды инкрементируем счетчика малого понижения амплитуды. + if((l>50)&&(Gyro.PLC_Lern>59)) { AD_MAX -= 3107200; l=0; } //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). + + if(Gyro.RgConA&0x2) { // если контур регулирования замкнут + /* 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;} // проверка на двух модовость*/ + if ( Gyro.PLC_Error2Mode > 0) { Gyro.PLC_Error2Mode --; 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_ADC_DOld = 1;} + } + else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} + + if(Gyro.PlC_MaxD>(50<<18)) { // 3 режим регулирования + tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); + if(tempDac>1500) tempDac=1500; //ограничение на регулирование если очень большая разница амплитуд + Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) + tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи + flagmod=3; + } + else if(Gyro.PlC_MaxD>(12<<18)) { // 2 режим регулирования + tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); + Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac); + tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи + flagmod=2; + } + else if(Gyro.PlC_MaxD<(2<<18)) { //режим если дельта равна 0; + tempDac=2; + Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; + flagmod=1; + } + else { + tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); // 1 режим регулирования + Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; + tempDac = Gyro.PLC_ADC_DOld * tempDac; + flagmod=1; + } - if(Gyro.RgConA&0x2) // если контур регулирования замкнут - { - 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_ADC_DOld = 1; - } - } - else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} - - - - + if(flagmod==3) {k++; //если максимальный режим регулирования //инкрементируем счетчик большого понижения амплитуды + if(k>100){k=0;AD_MAX -= 13107200;} //если счетчик бльше 50 //обнуляем счетчик //уменьшаем максимальную амплитуду. + } + else k=0; //если это не серия максимальных регулировок обнуляем счетчик. + + + + if ( Spi.DAC_B < 1000 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} //проверка на переваливание за границу. + else if ( Spi.DAC_B > 63000 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} + - if(tempDelta>(50<<18)) // 3 режим регулирования - { - tempDac=(unsigned int)(tempDelta>>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>(12<<18)) // 2 режим регулирования - { - tempDac=(unsigned int)(tempDelta>>18); - Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac); - tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи - flagmod=2; - } - else if(tempDelta<(2<<18)) //режим если дельта равна 0; - { - tempDac=2; - Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; - flagmod=1; - } - else - { - tempDac=(unsigned int)(tempDelta>>19); // 1 режим регулирования - Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; - tempDac = Gyro.PLC_ADC_DOld * tempDac; - flagmod=1; - } - - - if(flagmod==3){ //если максимальный режим регулирования - k++; //инкрементируем счетчик большого понижения амплитуды - if(k>35) //если счетчик бльше 35 - { - k=0; //обнуляем счетчик - AD_MAX -= 13107200; //уменьшаем максимальную амплитуду. - } - } - else k=0; //если это не серия максимальных регулировок обнуляем счетчик. - - - - 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 %d\r\n",Gyro.PLC_Lern, Spi.DAC_B, Gyro.AD_Slow, Gyro.AD_Slow>>18 );//выдаем в терминал для постройки граффика регулировки периметра. + + /////////////////////// + //////////лог////////// + /////////////////////// + if(Gyro.LogPLC==1) { + //sprintf((Time),"%d %d %d %d\r\n",Gyro.PLC_Lern, Spi.DAC_B, Gyro.AD_Slow, Gyro.AD_Slow>>18 );//выдаем в терминал для постройки граффика регулировки периметра. //WriteCon(Time); - sprintf((Time),"%d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, tempDelta>>18, tempDac, flagmod, AD_MAX, Gyro.AD_Slow, k);//выдаем в терминал для постройки граффика регулировки периметра. + sprintf((Time),"%d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, Gyro.PlC_MaxD>>18, tempDac, flagmod, AD_MAX, Gyro.AD_Slow, k);//выдаем в терминал для постройки граффика регулировки периметра. WriteCon(Time); - } -LoopOff - } - + } +} /* + void PlcRegul(void) //Программа расчет напряжения для модулятора { int PLC_In; @@ -283,18 +258,18 @@ Gyro.PLC_Old = PLC_In; // запоминание значения 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) + + 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) + else if (Gyro.PLC_DeltaADD < 0) { // Gyro.PLC_ADC_DOld = (Gyro.PLC_DeltaADD /6553600 )-1; @@ -305,60 +280,61 @@ Gyro.PLC_ADC_DOld = 1; } } - else + else { Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0; } - - + + 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 %d %d %d\r\n", Spi.DAC_B, temp9,flagmod, AD_MAX, Gyro.AD_Slow, k);//выдаем в терминал для постройки граффика регулировки периметра. - WriteCon(Time); + sprintf((Time),"%d %d %d %d %d %d\r\n", Spi.DAC_B, temp9,flagmod, AD_MAX, Gyro.AD_Slow, k);//выдаем в терминал для постройки граффика регулировки периметра. + WriteCon(Time); } - + } */ -void PlcRegul_old(void) // на всяни й случай +void PlcRegul_old(void) // на всякий случай { - int Delta; - - ADD_AMP+=Spi.ADC5; - Count_AMP++; - if(Count_AMP>=(32*32+8)) - { - Delta = ADD_AMP - Cur_Amp; - - if(Gyro.RgConA&0x2) - { - if (Znak_Amp > 1) {Znak_Amp --;} - else if ( Delta > 30000000 ) {AD_Regul += 5000000; Znak_Amp = 5;} - else if ( Delta < (-3000000)) {AD_Regul += 5000000; Znak_Amp = 5;} - else if ((Delta * Znak_Amp) > 0) - { - Znak_Amp = 1; - AD_Regul -= (Delta * Znak_Amp * 10); - } - else - { - Znak_Amp = -1; - AD_Regul -= (Delta * Znak_Amp * 10); - } - - Spi.DAC_B = (AD_Regul + 0x1fffffff)/65536; - } - Cur_Amp=ADD_AMP; Count_AMP=0; ADD_AMP=0; - } - + int Delta; + + ADD_AMP+=Spi.ADC5; + Count_AMP++; + if(Count_AMP>=(32*32+8)) { + Delta = ADD_AMP - Cur_Amp; + + if(Gyro.RgConA&0x2) { + if (Znak_Amp > 1) { + Znak_Amp --; + } else if ( Delta > 30000000 ) { + AD_Regul += 5000000; + Znak_Amp = 5; + } else if ( Delta < (-3000000)) { + AD_Regul += 5000000; + Znak_Amp = 5; + } else if ((Delta * Znak_Amp) > 0) { + Znak_Amp = 1; + AD_Regul -= (Delta * Znak_Amp * 10); + } else { + Znak_Amp = -1; + AD_Regul -= (Delta * Znak_Amp * 10); + } + + Spi.DAC_B = (AD_Regul + 0x1fffffff)/65536; + } + Cur_Amp=ADD_AMP; + Count_AMP=0; + ADD_AMP=0; + } + } @@ -366,42 +342,41 @@ void DAC_OutPut(void)//выдача в цапы { - LPC_SSP0->DR=0x5555; + 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 = (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; - - } - // 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_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; + + } + // LPC_SSP0->DR = Spi.DAC_B; //e. передача 12 бит + } } @@ -438,7 +413,7 @@ void SPI_Exchange(void) { unsigned int DummySPI; - + Spi.ADC5 = LPC_SSP0->DR; Spi.ADC4 = LPC_SSP0->DR; @@ -447,7 +422,7 @@ Spi.ADC1 = LPC_SSP0->DR; Input.ArrayIn[2]= Spi.ADC5; - + DAC_OutPut(); // LPC_DAC->CR = (((SinPLC[CountV64]*35/5)+24300));// модулятор @@ -456,13 +431,13 @@ DummySPI = LPC_SSP0->DR; //очистить буфер. //заполнение буферов еденичных значений АЦП. - Buff_ADC_1 [CountV31] = Spi.ADC1; + Buff_ADC_1 [CountV31] = Spi.ADC1; Buff_ADC_2 [CountV31] = Spi.ADC2; Buff_ADC_3 [CountV31] = Spi.ADC3; Buff_ADC_4 [CountV31] = Spi.ADC4; Buff_ADC_5 [CountV255] = Spi.ADC5; // ампл ацп. - + Temp_AMP64P += Buff_ADC_5[CountV255]; Temp_AMP64P -= Buff_ADC_5[(CountV255-64) & 0xff]; // заполнение буфера накопленых приращений за 8 тактов Buff_AMP64P[CountV255] = (unsigned int) (Temp_AMP64P);