![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
fork
Fork of LG by
Diff: SPI.c
- Revision:
- 172:ef7bf1663645
- Parent:
- 171:d227a6045305
- Child:
- 174:daffcc97d532
--- a/SPI.c Thu Jun 09 10:19:23 2016 +0000 +++ b/SPI.c Fri Jun 17 13:54:50 2016 +0000 @@ -35,7 +35,7 @@ Gyro.In2 = Spi.ADC3; Gyro.DeltaT = Spi.ADC4; - TempA = (0x7fff - Spi.ADC5) << 1; // перевернем знак и умножим на два (было 32000...0 стало 0 ...64000) + TempA = (0xffff - Spi.ADC5); // перевернем знак и умножим на два (было 32000...0 стало 0 ...32000 /*сдвиг(<<1) стало 0 ...64000*/) TempTermLM = Spi.ADC1; Gyro.ADF_Accum += TempA; @@ -45,13 +45,13 @@ Gyro.ADS_Count ++; if (Gyro.ADF_Count > 15) { // если прошло 16 тактов виброподвеса - Gyro.AD_Fast = Gyro.ADF_Accum << 12; //обновляем данные и приводим в один масштаб + Gyro.AD_Fast = Gyro.ADF_Accum << 11; //обновляем данные и приводим в один масштаб 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.AD_Slow = Gyro.ADS_Accum << 7; //обновляем данные и приводим в один масштаб Gyro.TermLM = Gyro.ADS_AccumTermLM << 3; Gyro.ADS_Count = 0; Gyro.ADS_Accum = 0; @@ -125,33 +125,41 @@ int tempDac; - PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации + PLC_In =Gyro.AD_Slow; //выбираем даные для фильтрации + // PLC_In = (unsigned int)(PLC_In>>1); Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; // узнаем приращение Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения Gyro.PLC_Old = PLC_In; // запоминание значения - - // 3600 (размер моды порядка 3000) + if(Gyro.flagGph_W){ + //Gyro.flagGph_W=0; + AD_MAX=0; + //Gyro.PLC_Lern =0; + //Gyro.PLC_Error2Mode=150; + Gyro.flagGph_W--; + // r=0; + } + // 3600 (размер моды порядка 3000) if((Gyro.PLC_Lern < 150) && (Gyro.PLC_Error2Mode != 0)) { //пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. Gyro.PLC_Lern++; //инкрементируем счетчик поиска максимальной амплитуды Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 - if (AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. - else if ((AD_MAX>Gyro.AD_Slow)&&(AD_MAX>1930000000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. + if(AD_MAX < PLC_In){AD_MAX = PLC_In;} //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. + else if ((AD_MAX>PLC_In)&&(AD_MAX>1502800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. if (r>5){Gyro.PLC_Lern=150;Gyro.PLC_Error2Mode=5;} //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. } //работает только первые ~30-40 секунд (37 сек). - - if(AD_MAX < Gyro.AD_Slow) { AD_MAX = Gyro.AD_Slow; l=0; } //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. * - else if((l == 150)&&(Gyro.PLC_Error2Mode == 0)) { AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). + + if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. * + else if((l == 150)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). else if(Gyro.PLC_Error2Mode == 0) l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) if ((k == 30)&&(Gyro.PLC_Lern > 59)) Spi.DAC_B += 200; //после уменьшения максимальной амплитуды двигаем шевелем цап else if((k == 1)&&(Gyro.PLC_Lern > 59)) {Spi.DAC_B -= 200; k=0;l=0;} //для быстрог поиска новог максимума. if(k>0)k--; - Gyro.PlC_MaxD=(unsigned int)(AD_MAX-Gyro.AD_Slow); //ищем разницу между желаемой и действительной амплитудами. + Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами. if(Gyro.RgConA&0x8) { // если контур регулирования замкнут @@ -176,26 +184,26 @@ Gyro.PLC_Error2Mode=4; } if(Gyro.RgConA&0x8) { - if(Gyro.PlC_MaxD>(50<<18)) { // 3 режим регулирования - tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); + 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; //используется только для выдачи flagmod=3; } - else if(Gyro.PlC_MaxD>(12<<18)) { // 2 режим регулирования - tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); + 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); //используется только для выдачи flagmod=2; } - else if(Gyro.PlC_MaxD<(2<<18)) { //режим если дельта равна 0;Gyro.ModJump + 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=(unsigned int)(Gyro.PlC_MaxD>>18); // 1 режим регулирования Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; tempDac = Gyro.PLC_ADC_DOld * tempDac; flagmod=1; @@ -218,7 +226,7 @@ //////////лог////////// /////////////////////// if(Gyro.LogPLC==1) { - sprintf((Time),"%d %d %d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, r, tempDac, flagmod, AD_MAX, Gyro.AD_Slow, Gyro.CuruAngle, Gyro.TermLM, (Gyro.Frq>>16) );//выдаем в терминал для постройки граффика регулировки периметра. + sprintf((Time),"%d %d %d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, r, tempDac, flagmod, AD_MAX, PLC_In, Gyro.CuruAngle, Gyro.TermLM, (Gyro.Frq>>16) );//выдаем в терминал для постройки граффика регулировки периметра. WriteCon(Time); } }