forkd

Dependencies:   mbed

Fork of LGstaandart by Dmitry Kovalev

vibro.c

Committer:
Kovalev_D
Date:
2017-04-13
Revision:
209:224e7331a061
Parent:
208:19150d2b528f
Child:
210:b02fa166315d

File content as of revision 209:224e7331a061:

#include "Global.h"
GyroT Gyro;
GyroParam GyroP;
volatile unsigned int Cheng_AMP_Flag=0;
//int    reper=0;
int    Rate2VibFlag,countA=0,tempDP,vibrot=0,fnoize=0,Znak=0,tempy,ttempo;
unsigned int OldMaxAmp=0,countFras=0;
int z=25;
int i=16,tempi=0,klk=0;
__irq void EINT3_IRQHandler()
{  
   Gyro.EXT_Latch=1; 
 //  Gyro.DeltaEXT_Event=1;
  // Gyro.B_Delta_EventEXT=1;
   LPC_GPIOINT->IO0IntClr |= (1<<1);
  // CMD_Delta_Bins(); 
}


void VibroOut(void) 	// выставка ног вибро
{
    if(CountV31>=16) 
      {//первая нога вибро
         // левая граница вЫкл вибро 1 > Time_vibro <ПРАВАЯ  граница вЫкл вибро 1
        if((Time_vibro>Gyro.AmpN1) && (Time_vibro<Gyro.AmpN2))	
        {
            SetV1//установить в регистре PinReg бит "вибро 1" в "0"
        } 
        else 
        {
         	 ClrV1  //установить в регистре PinReg бит "вибро 1" в "1"
        }

      } 
    else {//вторая нога вибро
        if((Time_vibro>Gyro.AmpN1)&&(Time_vibro<Gyro.AmpN2))	
        {
        	 SetV2 //установить в регистре PinReg бит "вибро 2" в "0"
        } 
        else
        {
            ClrV2//установить в регистре PinReg бит "вибро 2" в "1"
        }
    }
}


void OLDCalcAmpN(void)//расчет точек старта и стопа импульса вибропривода и расчет частоты ошумления.
{   
    static int PeriodCount = 0,Period=0;
    unsigned int Nmax=0, lowper=0;
    Gyro.FrqHZ=Gyro.Frq>>16;
    if(PeriodCount>= Gyro.AmpT) 
    { //если количество заходов в прерывание больше либо равно частоте ошумления.
      PeriodCount=0;//сбрасываем таймер
    if(Cheng_AMP_Flag==0) 
      { 
       if((Gyro.AmpPer+Gyro.AmpPerDel)>90)
            {
                Gyro.AmpPer=90-Gyro.AmpPerDel;   //проверка верхней граници амплитуды
            }
       Nmax =(unsigned int)((103000/(Gyro.Frq>>16))-1);                    //
       Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer))/Gyro.FrqHZ);     //левая граница амплитуды
       Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1);                     //правая граница амплитуды
       if(Gyro.AmpPer<5)
         	{
              lowper = Gyro.AmpN2-Gyro.AmpN1;
              lowper=lowper/2;
              Gyro.AmpN2= Gyro.AmpN2+lowper;
            }
       Cheng_AMP_Flag=1;
       Gyro.L_vibro=(((16383 *(Gyro.AmpN2-Gyro.AmpN1))/(Nmax/2)));
           // Gyro.L_vibro= Gyro.L_vibro/*2*/;
       }

        else  
         {
            if((Gyro.AmpPer+Gyro.AmpPerDel)>90) {
                Gyro.AmpPer=90-Gyro.AmpPerDel;   //проверка верхней граници амплитуды
            }
            if(/*(Gyro.RgConA&0x40)&&*/(Gyro.RgConA&0x20))
            {            
            Nmax =(unsigned int)((103000/(Gyro.Frq>>16))-1);
            Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/Gyro.FrqHZ);//левая граница амплитуды
            Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1);                        //правая граница амплитуды
            if(Gyro.AmpPer<5)
             {
              lowper = Gyro.AmpN2-Gyro.AmpN1;
              lowper=lowper/2;
              Gyro.AmpN2= Gyro.AmpN2+lowper+1;
             }
            }

            // Gyro.AmpN2=Gyro.AmpN1+2;
            Cheng_AMP_Flag=0;
            //Gyro.L_vibro=(103000/Nmax);
             Gyro.L_vibro=(((16383 *(Gyro.AmpN2-Gyro.AmpN1))/(Nmax/2)));
          //  Gyro.L_vibro=(((Gyro.AmpPer*7680000)/25)*8)/(Gyro.Frq>>12);
          //  Gyro.L_vibro= Gyro.L_vibro/*2*/;
      }
      /*  sprintf((Time)," %d %d\r\n",(16383 *((Gyro.AmpN2-Gyro.AmpN1)/Nmax)),  Gyro.L_vibro);
     	WriteCon(Time);*/

      //   Period=Gyro.CuruAngle*101;
   
      srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин.
    //  srand(Mrand());        
      Gyro.AmpT = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp

    } else {
        PeriodCount++;//таймер амплитуды
    }

}

void VibroAMPRegul(void)  //подстройка амплитуды ВП
{ 

    int temp=0;
  
   	Gyro.CaunPlus = CaunAddPlus;//амплитуда по модулю из востановленного синиуса Buff_Restored_sin
    
	CaunAddPlus = 0;
	Gyro.CaunMin = CaunAddMin; //амплитуда по модулю из востановленного синиуса Buff_Restored_sin
	
	CaunAddMin = 0;
	Gyro.MaxAmp = Gyro.CaunPlus + Gyro.CaunMin; 
	
	
	if(countFras<512)
	{
	  countFras++;
	  Gyro.F_rasAdd += Gyro.MaxAmp/32*Gyro.FrqHZ/22.5;
	}
	else
	{    
	  
		Gyro.F_rasAdd += Gyro.MaxAmp/32*Gyro.FrqHZ/22;
		Gyro.F_ras=Gyro.F_rasAdd>>9;
		Gyro.F_rasAdd=0;
		countFras=0;
	}
	
	
	if(Gyro.RgConA&0x20)
	{
  	//расчет максимальной амплитуды из востановленного синуса р-р.
  	temp=(int)(((Gyro.MaxAmp - Gyro.AmpTarget) * Gyro.AmpSpeed));
  	temp=temp>>5;
    Gyro.Amp   -= temp; // расчет амплитуды ВП с учетом разници
  		if((Gyro.Amp>>16) > Gyro.AmpPerMax)   {Gyro.Amp = (Gyro.AmpPerMax << 16);}   // временное ограничение роста амплитуды ВП в случае неподоженного гироскопа//////////
 		if((Gyro.Amp>>16) < Gyro.AmpPerMin)   {Gyro.Amp = (Gyro.AmpPerMin << 16);}  // временное ограничение роста амплитуды ВП в случае неподоженного гироскопа//////////
    Gyro.AmpPer = Gyro.Amp>>16; //приведение амплитуды ВП к виду 0%-100%
    }
    


    }



void VibroFrqRegul(void)// расчет Фазы с учетор разници(подстройка частоты)
{ 
   	static int TempFaza, CountFaza;
   	TempFaza = -4;
   	Gyro.FrqPhaseEror=0;
   	for (CountFaza = 0; CountFaza <8; CountFaza++ )     {if (Buff_Restored_sin [(CountV31 - Gyro.FrqPhase  + CountFaza) & 0x1f] > 0 ) TempFaza++;} //резонанс когда  CountV31 = 8 => Buff_Restored_sin = 0
    for (CountFaza = 0; CountFaza <8; CountFaza++ )     {Gyro.FrqPhaseEror += Buff_Restored_sin [(CountV31 - Gyro.FrqPhase  + CountFaza) & 0x1f];}
   	if(Gyro.RgConA&0x40)
   	{																						//12
      Gyro.Frq += TempFaza*Gyro.FrqChengSpeed;
    }
  //  Gyro.FrqPhaseEror = TempFaza<<10;
    if     (Gyro.Frq < Gyro.FrqHZmin) Gyro.Frq=Gyro.FrqHZmin;//нижнее  ограничение частоты
    else if(Gyro.Frq > Gyro.FrqHZmax) Gyro.Frq=Gyro.FrqHZmax;//верхнее ограничение частоты
    LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового  значение частоты вибро
}

//////////////////////////////////////////////////////////////////////////////
/////////////////////////основного 32 тактного цикла//////////////////////////
//////////////////////////////////////////////////////////////////////////////
void cheng(void)
{  
    switch(CountV31) {
     case 0:
          	Gyro.VibroAMPRegulF=1;
            Time_vibro=0;
            Gyro.VibroNoiseF++;//расчет и установка нового заначения частоты ошумления и запись в таймер частоты ошумления.
     break;
    
	 case 16:
	     //   Gyro.Reper_Event=1; 
            Time_vibro=0;
            Gyro.VibroFrqRegulF=1; //
     break;
     }
}
void AllRegul (void)
{   ///////////////////////////контуры регулировки/////////////////////////////
   
    if (Spi.ADC_NewData     == 1) {ADS_Acum();								 	}   // был приход новых данных по ацп сдесь сделать обработку информации и подготовку для выдачи делается 1 раз за вибро
	if (Gyro.ADF_NewData    == 1) {Gyro.ADF_NewData = 0;                    	}   // был приход новых данных После быстрого фильтра AD	
	
	
	
	/*if (Gyro.ADS_NewData    == 1) 
	{	Gyro.ADS_NewData = 0; 
		switch(Gyro.LogPLC) {
        case 0:     PlcRegul();    break;    
	    case 1:     PlcRegul();    break;
	    case 2:     ShowMod();     break;
	    }
	}*/// был приход новых данных После Медленного фильтра AD (гдето раз в 0.63 секунды )//регулировка периметра.
 
 
 
    if (Gyro.VibroFrqRegulF == 1) {Gyro.VibroFrqRegulF = 0;	 VibroFrqRegul();	}	// Регулеровка частоты виброподвеса    
    if (Gyro.VibroAMPRegulF == 1) 
    {
    	Gyro.VibroAMPRegulF = 0;	
    	VibroAMPRegul(); 
    	if(!MODFlag)PLCRegul(); 
    	
   	}	// Регулеровка Амплитуды виброподвеса
    if (Gyro.VibroNoiseF    == 1) {Gyro.VibroNoiseF = 0;  OLDCalcAmpN();}
 /*   { 
      switch(Gyro.flag) {
  	   case 1: Gyro.VibroNoiseF = 0; OLDCalcAmpN();                             break;
       case 2: Gyro.AmpMin =3;Gyro.AmpTD =10;Gyro.VibroNoiseF = 0;Calc2AmpN();  break;
       case 3: Gyro.AmpMin =1;Gyro.AmpTD =10;Gyro.VibroNoiseF = 0;CalcAmpD();   break; 
	  }
    }	 */// регулеровка ошумления, наверно нужно объеденить с регулеровкой ампитуды
    //if (Gyro.VibroOutF      == 1) {Gyro.VibroOutF = 0; VibroOut();}	// установка ног в регисторе тоже подумать , зачем отделный флаг? наверно 
}