This is my quadcopter prototype software, still in development!

quadv3/gyro.h

Committer:
Anaesthetix
Date:
2013-07-23
Revision:
1:ac68f0368a77
Parent:
0:978110f7f027

File content as of revision 1:ac68f0368a77:

#ifndef GYRO_H
#define GYRO_H
#include "IOMacros.h"
ITG3200 gyro(p9, p10);
DigitalOut looptime2(p18);

SPI spi(p5,p6,p7); 
BMA180 acc1(spi, p8);

Timer dtgyro;
#define PI 3.141592654


int xg= 0;
int yg= 0;
int zg= 0;
float temphoekx=0;
float temp6=0;
float newax = 0;
float neway = 0;
float newax1 = 0;
float neway1 = 0;
float tempx1 = 0;
float tempy1 = 0;
int flag = 0;
float xag = 0;
float xarg = 0;
float yarg = 0;
float zarg = 0;
float yag = 0;
float xagoffset = 0;
float yagoffset = 0;
float zagoffset = -0.75;
float axoffset = 0;
float ayoffset = 0;
float xangle[40] = {0};
float yangle[40] = {0};
float x1 = 0;
float x2 = 0;
float y1 = 0;
float y2 = 0;
float ax1 = 0;
float ay1 = 0;
float ax2 = 0;
  float ax = 0;
  float ay = 0;    
float ay2 = 0;
int dtgyrtemp;
float dtgyr;

void gyrostart(void);
void gyrocal(void);
void gyrosample(void);

void gyrostart(void) {
    gyro.setLpBandwidth(LPFBW_42HZ);
}


void gyrocal(void) {
    for (int i=0; i<100; i++) {
        gyrosample();
        xagoffset += (0.01*xag);
        yagoffset += (0.01*yag);
        //  zagoffset += (0.01*zarg);

    }
}


void gyrosample(void) {
    //Timer for filtervar
    dtgyro.stop();
    dtgyrtemp = dtgyro.read_us();
    dtgyr = dtgyrtemp;
    dtgyro.reset();
    dtgyro.start();
    
    //Get gyro & accelero data
    __disable_irq(); //For some reason deadlocks without this
    xg = gyro.getGyroX();
    yg = gyro.getGyroY();
    zg = gyro.getGyroZ();
    __enable_irq();
    //accsample();
    acc1.readRaw();
    
    //Cast int to float for better precision
    xarg = xg;
    yarg = yg;
    zarg = zg;

    //Calc angular rate in degrees/second
    xarg = (xarg/14.375);
    yarg = (yarg/14.375);
    zarg = (zarg/14.375);

    zarg -= zagoffset;
    xag = xarg;
    yag = yarg;

    y1 = acc1.y;
    y2 = acc1.y;
    x1 = acc1.x;
    x2 = acc1.x;



    //Calc y angle
    y1 = y1*y1;
    y1 = 1-y1;
    y1 = sqrt(y1);
    y1 = y2/y1;

    ay = atan(y1);
    ay = ay*(180/PI);

    //Calc x angle
    x1 = x1*x1;
    x1 = 1-x1;
    x1 = sqrt(x1);
    x1 = x2/x1;

    ax = atan(x1);
    ax = ax*(180/PI);


    //if [angle] is NAN use previous value
    if (ax != ax) ax = ax2;
    if (ay != ay) ay = ay2;
    if (ax == ax) ax2 = ax;
    if (ay == ay) ay2 = ay;
    
    
    //Moving avarage filter
    xangle[0] = (ax + 6);
    ax1 = ((0.025*xangle[0]) + (0.025*xangle[1]) + (0.025*xangle[2]) + (0.025*xangle[3]) + (0.025*xangle[4]) + (0.025*xangle[5]) + (0.025*xangle[6]) + (0.025*xangle[7]) + (0.025*xangle[8]) + (0.025*xangle[9]) + (0.025*xangle[10]) + (0.025*xangle[11]) + (0.025*xangle[12]) + (0.025*xangle[13]) + (0.025*xangle[14]) + (0.025*xangle[15]) + (0.025*xangle[16]) + (0.025*xangle[17]) + (0.025*xangle[18]) + (0.025*xangle[19]) + (0.025*xangle[20]) + (0.025*xangle[21]) + (0.025*xangle[22]) + (0.025*xangle[23]) + (0.025*xangle[24]) + (0.025*xangle[25]) + (0.025*xangle[26]) + (0.025*xangle[27]) + (0.025*xangle[28]) + (0.025*xangle[29]) + (0.025*xangle[30]) + (0.025*xangle[31]) + (0.025*xangle[32]) + (0.025*xangle[33]) + (0.025*xangle[34]) + (0.025*xangle[35]) + (0.025*xangle[36]) + (0.025*xangle[37]) + (0.025*xangle[38]) + (0.025*xangle[39]));
    xangle[39] = xangle[38]; 
    xangle[38] = xangle[37];
    xangle[37] = xangle[36];
    xangle[36] = xangle[35];
    xangle[35] = xangle[34];
    xangle[34] = xangle[33];
    xangle[33] = xangle[32];
    xangle[32] = xangle[31];
    xangle[31] = xangle[30];
    xangle[30] = xangle[29]; 
    xangle[29] = xangle[28]; 
    xangle[28] = xangle[27];
    xangle[27] = xangle[26];
    xangle[26] = xangle[25];
    xangle[25] = xangle[24];
    xangle[24] = xangle[23];
    xangle[23] = xangle[22];
    xangle[22] = xangle[21];
    xangle[21] = xangle[20];
    xangle[20] = xangle[19]; 
    xangle[19] = xangle[18];
    xangle[18] = xangle[17];
    xangle[17] = xangle[16];
    xangle[16] = xangle[15];
    xangle[15] = xangle[14];
    xangle[14] = xangle[13];
    xangle[13] = xangle[12];
    xangle[12] = xangle[11];
    xangle[11] = xangle[10];
    xangle[10] = xangle[9]; 
    xangle[9] = xangle[8];
    xangle[8] = xangle[7];
    xangle[7] = xangle[6];
    xangle[6] = xangle[5];
    xangle[5] = xangle[4];
    xangle[4] = xangle[3];
    xangle[3] = xangle[2];
    xangle[2] = xangle[1];
    xangle[1] = xangle[0];

    
    yangle[0] = ay;
    ay1 = ((0.025*yangle[0]) + (0.025*yangle[1]) + (0.025*yangle[2]) + (0.025*yangle[3]) + (0.025*yangle[4]) + (0.025*yangle[5]) + (0.025*yangle[6]) + (0.025*yangle[7]) + (0.025*yangle[8]) + (0.025*yangle[9]) + (0.025*yangle[10]) + (0.025*yangle[11]) + (0.025*yangle[12]) + (0.025*yangle[13]) + (0.025*yangle[14]) + (0.025*yangle[15]) + (0.025*yangle[16]) + (0.025*yangle[17]) + (0.025*yangle[18]) + (0.025*yangle[19]) + (0.025*yangle[20]) + (0.025*yangle[21]) + (0.025*yangle[22]) + (0.025*yangle[23]) + (0.025*yangle[24]) + (0.025*yangle[25]) + (0.025*yangle[26]) + (0.025*yangle[27]) + (0.025*yangle[28]) + (0.025*yangle[29]) + (0.025*yangle[30]) + (0.025*yangle[31]) + (0.025*yangle[32]) + (0.025*yangle[33]) + (0.025*yangle[34]) + (0.025*yangle[35]) + (0.025*yangle[36]) + (0.025*yangle[37]) + (0.025*yangle[38]) + (0.025*yangle[39]));
    yangle[39] = yangle[38]; 
    yangle[38] = yangle[37];
    yangle[37] = yangle[36];
    yangle[36] = yangle[35];
    yangle[35] = yangle[34];
    yangle[34] = yangle[33];
    yangle[33] = yangle[32];
    yangle[32] = yangle[31];
    yangle[31] = yangle[30];
    yangle[30] = yangle[29]; 
    yangle[29] = yangle[28]; 
    yangle[28] = yangle[27];
    yangle[27] = yangle[26];
    yangle[26] = yangle[25];
    yangle[25] = yangle[24];
    yangle[24] = yangle[23];
    yangle[23] = yangle[22];
    yangle[22] = yangle[21];
    yangle[21] = yangle[20];
    yangle[20] = yangle[19]; 
    yangle[19] = yangle[18];
    yangle[18] = yangle[17];
    yangle[17] = yangle[16];
    yangle[16] = yangle[15];
    yangle[15] = yangle[14];
    yangle[14] = yangle[13];
    yangle[13] = yangle[12];
    yangle[12] = yangle[11];
    yangle[11] = yangle[10];
    yangle[10] = yangle[9]; 
    yangle[9] = yangle[8];
    yangle[8] = yangle[7];
    yangle[7] = yangle[6];
    yangle[6] = yangle[5];
    yangle[5] = yangle[4];
    yangle[4] = yangle[3];
    yangle[3] = yangle[2];
    yangle[2] = yangle[1];
    yangle[1] = yangle[0];



    
    //Substract angular rate offsets
    xag += xagoffset;
    yag += yagoffset;
 //   xag = (xag*-1);
    yag = (yag*-1);
    

    //calc filtervar
    temp6 = 5000000;                      //time constant [us]
    temp6 = temp6/(temp6+dtgyr);
    

    //complementary filter
    newax = (temp6*(newax + (yag*(dtgyr/1000000)))) + ((1-temp6)*ax1);
    neway = (temp6*(neway + (xag*(dtgyr/1000000)))) + ((1-temp6)*ay1);
 //   neway = neway*-1;

    //if [angle] is NAN use previous value
    if (newax != newax) newax = tempx1;
    if (neway != neway) neway = tempy1;
    if (newax == newax) tempx1 = newax;
    if (neway == neway) tempy1 = neway;
}



#endif