123
Fork of LG by
Diff: SPI.c
- Revision:
- 191:40028201ddad
- Parent:
- 190:289514f730ee
- Child:
- 192:d32c8cf7bcd9
--- a/SPI.c Tue Aug 23 14:03:16 2016 +0000 +++ b/SPI.c Mon Aug 29 11:58:52 2016 +0000 @@ -10,7 +10,7 @@ int AD_MAX=0; int k=0,l=0,r=0;//счетчики для регулировки периметра int flagmod=0,Bdelta; - +int start=10; unsigned int Temp_ADC_2; unsigned int Temp_ADC_3; unsigned int Temp_ADC_4; @@ -113,53 +113,52 @@ -void PlcRegul(void) //Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.) +void PlcRegul(void) //Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.) { //LoopOn int PLC_In; int tempDac; - - if(!(Gyro.PinReg & PinRegBitL)) 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=3;} //если изменился коэфициент усиления ФД //3600 (размер моды порядка 3000) - if((!(Gyro.PinReg & PinRegBitL)) && (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>1500800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. - if (r>10){Gyro.PLC_Lern=150;Gyro.PLC_Error2Mode=8;} //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска - - Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. - } //работает только первые ~30-40 секунд (37 сек). - - if (Gyro.PLC_Lern<250) Gyro.PLC_Lern++; - // if (Gyro.PLC_Lern<20)AD_MAX=0; - - 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--; + if(!(Gyro.PinReg & PinRegBitL) && (start>0)) start--; + if((start==0)){ + if(!(Gyro.PinReg & PinRegBitL)) 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; //запоминание значения + 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) для определения максимальной амплитуды. + Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 + if(AD_MAX < PLC_In){AD_MAX = PLC_In;} //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. + else if ((AD_MAX>PLC_In)&&(AD_MAX>1500800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. + if (r>10){ + Gyro.PLC_Lern=150; + Gyro.PLC_Error2Mode=3; + } //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска + Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. + } //работает только первые ~30-40 секунд (37 сек). + if (Gyro.PLC_Lern<250) Gyro.PLC_Lern++; + 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--; - Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами. + Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами. - if(Gyro.RgConA&0x8) { // если контур регулирования замкнут - /* 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;} + if(Gyro.RgConA&0x8) { // если контур регулирования замкнут + 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;}///прыжок с моды на моду. + else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} + + ///прыжок с моды на моду. /* if(Gyro.ModJump==1) { ///прыжок с моды на моду. (-->) Gyro.ModJump=0; @@ -172,49 +171,42 @@ Spi.DAC_B -= 12500; Gyro.PLC_Error2Mode=4; } */ - /*if (Bdelta>20) - {AD_MAX=1510800000;}*/ - tempADC5=0x7fff-Spi.ADC5; + + - if((Gyro.RgConA&0x8) && (tempADC5>1000) && (!(Gyro.PinReg & PinRegBitL))) { - if(Gyro.PlC_MaxD>(50<<17)) { // 3 режим регулирования + tempADC5=0x7fff-Spi.ADC5; + // контур замкнут включен лазер + if((Gyro.RgConA&0x8) && (tempADC5>1000)) { + if(Gyro.PlC_MaxD>(50<<17)) { //3 режим регулирования tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); - if(tempDac>600) {tempDac=600; Bdelta++; } //ограничение на регулирование если очень большая разница амплитуд - Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) - tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи + 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<<17)) { // 2 режим регулирования + 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); //используется только для выдачи + tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи flagmod=2; } - else if(Gyro.PlC_MaxD<(2<<17)) { //режим если дельта равна 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>>18); // 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; - } - } - /* - if(flagmod==3) {k++; //если максимальный режим регулирования //инкрементируем счетчик большого понижения амплитуды - if(k>100){k=0;AD_MAX -= 6107200;} //если счетчик бльше 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;} - +} /////////////////////// //////////лог////////// @@ -287,7 +279,7 @@ } -*/ +*//* void PlcRegul_old(void) // на всякий случай { int Delta; @@ -324,7 +316,7 @@ } - +*/ void DAC_OutPut(void)//выдача в цапы {