![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
forkd
Fork of LGstaandart by
Diff: SPI.c
- Revision:
- 188:4c523cc373cc
- Parent:
- 179:2b4e6bc277df
- Child:
- 189:8a16378724c4
--- a/SPI.c Mon Aug 01 14:03:08 2016 +0000 +++ b/SPI.c Fri Aug 19 14:02:02 2016 +0000 @@ -10,7 +10,8 @@ int temp9; int AD_MAX=0; int k=0,l=0,r=0; -int flagmod=0; +int flagmod=0,Bdelta; + unsigned int Temp_ADC_2; unsigned int Temp_ADC_3; unsigned int Temp_ADC_4; @@ -125,28 +126,29 @@ 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; // запоминание значения - if(Gyro.flagGph_W){AD_MAX=0;Gyro.flagGph_W--;Gyro.PLC_Error2Mode=1;} //если изменился коэфициент усиления ФД //3600 (размер моды порядка 3000) + if(Gyro.flagGph_W){AD_MAX=0; Gyro.flagGph_W--; Gyro.PLC_Error2Mode=3;} //если изменился коэфициент усиления ФД //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 < 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 тактов то выходим из поиска + else if ((AD_MAX>PLC_In)&&(AD_MAX>1500800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. + if (r>10){Gyro.PLC_Lern=150;Gyro.PLC_Error2Mode=8;} //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. } //работает только первые ~30-40 секунд (37 сек). - 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(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. + else l++; + if((l == 40)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m + //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) 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--; @@ -175,13 +177,16 @@ Spi.DAC_B -= 12500; Gyro.PLC_Error2Mode=4; } + if (Bdelta>20) + {AD_MAX=1510800000;} if(Gyro.RgConA&0x8) { if(Gyro.PlC_MaxD>(50<<17)) { // 3 режим регулирования tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); - if(tempDac>600) tempDac=600; //ограничение на регулирование если очень большая разница амплитуд + if(tempDac>600) {tempDac=600; Bdelta++; } //ограничение на регулирование если очень большая разница амплитуд Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи flagmod=3; + } else if(Gyro.PlC_MaxD>(12<<17)) { // 2 режим регулирования tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); @@ -218,7 +223,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, PLC_In, (Gyro.Frq>>16), Gyro.AmpPer, Gyro.CuruAngle);//выдаем в терминал для постройки граффика регулировки периметра. + sprintf((Time),"%d %d %d %d %d %d %d %d %d %d\r\n", Gyro.AD_Slow, temp9, r, tempDac, flagmod, AD_MAX, PLC_In, (Gyro.Frq>>16), Spi.DAC_A, Gyro.In2);//выдаем в терминал для постройки граффика регулировки периметра. WriteCon(Time); } }