fork

Dependencies:   mbed

Fork of LG by igor Apu

QEI.c

Committer:
igor_v
Date:
2016-02-07
Revision:
43:3f7c8a0ea59c
Parent:
42:6fc307c4963e
Child:
45:cbc955aecebe

File content as of revision 43:3f7c8a0ea59c:

#include "Global.h"


int Pulse_midl = 0;
int PulseHalf = 0;
int CuruAngle = 0;
int Dif_QEI;

int FFF=0;//для заплатки


int Pulse_8Point = 0;
int Pulse_16Point = 0;
int Pulse_32Point = 0;
int Pulse_16PointD = 0;
unsigned int Iras=0,Temp_F_ras=0;
int yy = 0;




/*
unsigned int Buff_32Point	[256];
unsigned int Buff_16Point	[256];
unsigned int Buff_16PointD	[256];
unsigned int Buff_8Point	[256];
unsigned int Buff_1Point	[256];
unsigned int Buff_Restored_sin [256];

*/

int Buff_32Point		[32];			// давай сделаем буфера поменьше
int Buff_16Point		[32];
int Buff_16PointD		[32];
int Buff_8Point			[32];
int Buff_Restored_sin 	[32];
int Buff_1Point			[256];			// этот на 256



int unsigned Cur_QEI = 0, Last_QEI=0;







// ДАВАЙ попробуем сделать буфера в целых (знаковы)
void D_QEI_Int(void)
{

    Cur_QEI  =  LPC_QEI->POS & 0xFFFF; 	// считывание текущего значения энкодера.
    Dif_QEI  =  (Cur_QEI - Last_QEI);  // получение приращения.()
    Last_QEI =  Cur_QEI;               // запись текущего значения энкодера в регистр предыдущего значения.

    if (Dif_QEI < -0xfff)  Dif_QEI += 0x10000;   // обработка прохода значения через ноль
    if (Dif_QEI >  0xfff)  Dif_QEI -= 0x10000;    // обработка прохода значения через ноль


    Buff_1Point[CountV255] = Dif_QEI;// накопление в буфер еденичных значений приращения по каждому такту.

    ////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////

// зачем это. мож к этому воремени стали вращатся назад

    if (LPC_QEI->STAT) {					//e. "+" direction //r. стали вращаться в "+"
        Gyro.Cnt_Mns = Dif_QEI;
    } else {
        Gyro.Cnt_Pls = -Dif_QEI;
    }


// внимание , все расчеты в знаковых целых


    ////////// ???? Заплатка
    ////////// ???? Проблема начального заполнения буферов
    //////////////////////////////////////////////////////////////////////////////////////////////
    // если прошло 32 такта вибро подвеса начать заполнять остальные буверы.
    Pulse_8Point += Buff_1Point[CountV255];
    Pulse_8Point -= Buff_1Point[(CountV255-8) & 0xff];                   // заполнение буфера накопленых приращений за 8 тактов
    Buff_8Point[CountV31] =Pulse_8Point;

    Pulse_16Point += Buff_1Point[CountV255];
    Pulse_16Point -= Buff_1Point[(CountV255-16) & 0xff];				// заполнение буфера накопленых приращений за 16 тактов
    Buff_16Point[CountV31] = Pulse_16Point;

    Pulse_32Point += Buff_1Point[CountV255];
    Pulse_32Point -= Buff_1Point[(CountV255-32) & 0xff];  								// заполнение буфера накопленых приращений за 32 тактов
    Buff_32Point[CountV31] = Pulse_32Point;

    Pulse_16PointD += Buff_1Point[CountV255];
    Pulse_16PointD -= Buff_1Point[(CountV255-16) & 0xff];									// заполнение буфера накопленых приращений за 16 тактов Двойныз
    Pulse_16PointD += Buff_1Point[(CountV255-32) & 0xff];									//
    Pulse_16PointD -= Buff_1Point[(CountV255-48) & 0xff];									// з
    Buff_16PointD[CountV31] = Pulse_16PointD;
    Buff_Restored_sin [CountV31]= Buff_16PointD [ CountV31] - Buff_32Point[CountV31];		//Востанавливаем синус (для работы вибропривода)

    Gyro.Cnt_Dif  =  (Pulse_32Point);

    if(Buff_Restored_sin [CountV31] > 0)
        Temp_F_ras += Buff_Restored_sin [CountV31];
    else Temp_F_ras -= Buff_Restored_sin [CountV31]; 			// расчет амплитуды

    if (CountV31 == 0) {								// если определеный так, то переписываем амиплитуду
        Gyro.F_ras = Temp_F_ras;
        Temp_F_ras = 0;
    }
// зачем это.



    if(Buff_32Point[CountV255]>0) {
        Temp_F_ras += Buff_32Point[CountV255];
    } else if ((CountV255 & 0x1f)==0) {
        Gyro.F_ras=Temp_F_ras;
        Temp_F_ras=0;
    } else {
        Temp_F_ras -=  Buff_32Point[CountV255];
    }


}



void D_QEI(void)
{
    Dif_QEI=0;
    Cur_QEI  =  LPC_QEI->POS & 0xFFFF; // считывание текущего значения энкодера.
    Dif_QEI  =  (Cur_QEI - Last_QEI);  // получение приращения.()
    Last_QEI =  Cur_QEI;               // запись текущего значения энкодера в регистр предыдущего значения.

    if (Dif_QEI < -0xfff)  Dif_QEI += 0x10000;   // обработка прохода значения через ноль
    if (Dif_QEI >  0xfff)  Dif_QEI -= 0x10000;    // обработка прохода значения через ноль


    Buff_1Point[CountV255] = (unsigned int) (Dif_QEI + 0xffff);// накопление в буфер еденичных значений приращения по каждому такту.

    ////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////

    if (LPC_QEI->STAT) {					//e. "+" direction //r. стали вращаться в "+" сторону
        Gyro.Cnt_Mns = Dif_QEI;
    } else {
        Gyro.Cnt_Pls = -Dif_QEI;
    }

    ////////// ???? Заплатка
    ////////// ???? Проблема начального заполнения буферов
    //////////////////////////////////////////////////////////////////////////////////////////////
    if(FFF==1) { // если прошло 32 такта вибро подвеса начать заполнять остальные буверы.
        Pulse_8Point += Buff_1Point[CountV255];
        Pulse_8Point -= Buff_1Point[(CountV255-8) & 0xff];                    // заполнение буфера накопленых приращений за 8 тактов
        Buff_8Point[CountV255] = (unsigned int) (Pulse_8Point + 0xffff);

        Pulse_16Point += Buff_1Point[CountV255];
        Pulse_16Point -= Buff_1Point[(CountV255-16) & 0xff];									// заполнение буфера накопленых приращений за 16 тактов
        Buff_16Point[CountV255] = (unsigned int) (Pulse_16Point + 0xffff);

        Pulse_32Point += Buff_1Point[CountV255];
        Pulse_32Point -= Buff_1Point[(CountV255-32) & 0xff];  								// заполнение буфера накопленых приращений за 32 тактов
        Gyro.Cnt_Dif  =  (Pulse_32Point+ 0xffff);
        Buff_32Point[CountV255] = (unsigned int) (Pulse_32Point + 0xffff);

        Pulse_16PointD += Buff_1Point[CountV255];
        Pulse_16PointD -= Buff_1Point[(CountV255-16) & 0xff];									// заполнение буфера накопленых приращений за 16 тактов Двойныз
        Pulse_16PointD += Buff_1Point[(CountV255-32) & 0xff];									//
        Pulse_16PointD -= Buff_1Point[(CountV255-48) & 0xff];									// з

        Buff_16PointD[CountV255] = (unsigned int) (Pulse_16PointD + 0xffff);


//							Buff_Restored_sin [CountVf]= (unsigned int)( ((Buff_16Point[CountVf]*2)) - Buff_32Point[CountVf] );

        Buff_Restored_sin [CountV255]= (unsigned int)( Buff_16PointD [ CountV255] + 65536 - Buff_32Point[CountV255] );



        if(Buff_32Point[CountV255]>0) {
            Temp_F_ras += Buff_32Point[CountV255];
        } else if ((CountV255 & 0x1f)==0) {
            Gyro.F_ras=Temp_F_ras;
            Temp_F_ras=0;
        } else {
            Temp_F_ras -=  Buff_32Point[CountV255];
        }

        //unsigned int T_Vib;

    } else if(CountV255 == 255) {
        FFF=1;//временная заплатка  для паузы перед заполнением остальных буферов
        for (yy = 0; yy < 256; yy++ ) {
            Buff_1Point [yy] = 0xffff;
            Buff_16Point [yy] = 0xffff;
            Buff_32Point [yy] = 0xffff;
            Buff_16PointD [yy] = 0xffff;
        }

    }
}