This is my quadcopter prototype software, still in development!

Committer:
Anaesthetix
Date:
Tue Jul 23 14:01:42 2013 +0000
Revision:
1:ac68f0368a77
Parent:
0:978110f7f027
Other accelerometer added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anaesthetix 0:978110f7f027 1 #ifndef GYRO_H
Anaesthetix 0:978110f7f027 2 #define GYRO_H
Anaesthetix 0:978110f7f027 3 #include "IOMacros.h"
Anaesthetix 0:978110f7f027 4 ITG3200 gyro(p9, p10);
Anaesthetix 0:978110f7f027 5 DigitalOut looptime2(p18);
Anaesthetix 0:978110f7f027 6
Anaesthetix 0:978110f7f027 7 SPI spi(p5,p6,p7);
Anaesthetix 0:978110f7f027 8 BMA180 acc1(spi, p8);
Anaesthetix 0:978110f7f027 9
Anaesthetix 0:978110f7f027 10 Timer dtgyro;
Anaesthetix 0:978110f7f027 11 #define PI 3.141592654
Anaesthetix 0:978110f7f027 12
Anaesthetix 0:978110f7f027 13
Anaesthetix 0:978110f7f027 14 int xg= 0;
Anaesthetix 0:978110f7f027 15 int yg= 0;
Anaesthetix 0:978110f7f027 16 int zg= 0;
Anaesthetix 0:978110f7f027 17 float temphoekx=0;
Anaesthetix 0:978110f7f027 18 float temp6=0;
Anaesthetix 0:978110f7f027 19 float newax = 0;
Anaesthetix 0:978110f7f027 20 float neway = 0;
Anaesthetix 0:978110f7f027 21 float newax1 = 0;
Anaesthetix 0:978110f7f027 22 float neway1 = 0;
Anaesthetix 0:978110f7f027 23 float tempx1 = 0;
Anaesthetix 0:978110f7f027 24 float tempy1 = 0;
Anaesthetix 0:978110f7f027 25 int flag = 0;
Anaesthetix 0:978110f7f027 26 float xag = 0;
Anaesthetix 0:978110f7f027 27 float xarg = 0;
Anaesthetix 0:978110f7f027 28 float yarg = 0;
Anaesthetix 0:978110f7f027 29 float zarg = 0;
Anaesthetix 0:978110f7f027 30 float yag = 0;
Anaesthetix 0:978110f7f027 31 float xagoffset = 0;
Anaesthetix 0:978110f7f027 32 float yagoffset = 0;
Anaesthetix 0:978110f7f027 33 float zagoffset = -0.75;
Anaesthetix 0:978110f7f027 34 float axoffset = 0;
Anaesthetix 0:978110f7f027 35 float ayoffset = 0;
Anaesthetix 0:978110f7f027 36 float xangle[40] = {0};
Anaesthetix 0:978110f7f027 37 float yangle[40] = {0};
Anaesthetix 0:978110f7f027 38 float x1 = 0;
Anaesthetix 0:978110f7f027 39 float x2 = 0;
Anaesthetix 0:978110f7f027 40 float y1 = 0;
Anaesthetix 0:978110f7f027 41 float y2 = 0;
Anaesthetix 0:978110f7f027 42 float ax1 = 0;
Anaesthetix 0:978110f7f027 43 float ay1 = 0;
Anaesthetix 0:978110f7f027 44 float ax2 = 0;
Anaesthetix 0:978110f7f027 45 float ax = 0;
Anaesthetix 0:978110f7f027 46 float ay = 0;
Anaesthetix 0:978110f7f027 47 float ay2 = 0;
Anaesthetix 0:978110f7f027 48 int dtgyrtemp;
Anaesthetix 0:978110f7f027 49 float dtgyr;
Anaesthetix 0:978110f7f027 50
Anaesthetix 0:978110f7f027 51 void gyrostart(void);
Anaesthetix 0:978110f7f027 52 void gyrocal(void);
Anaesthetix 0:978110f7f027 53 void gyrosample(void);
Anaesthetix 0:978110f7f027 54
Anaesthetix 0:978110f7f027 55 void gyrostart(void) {
Anaesthetix 0:978110f7f027 56 gyro.setLpBandwidth(LPFBW_42HZ);
Anaesthetix 0:978110f7f027 57 }
Anaesthetix 0:978110f7f027 58
Anaesthetix 0:978110f7f027 59
Anaesthetix 0:978110f7f027 60 void gyrocal(void) {
Anaesthetix 0:978110f7f027 61 for (int i=0; i<100; i++) {
Anaesthetix 0:978110f7f027 62 gyrosample();
Anaesthetix 0:978110f7f027 63 xagoffset += (0.01*xag);
Anaesthetix 0:978110f7f027 64 yagoffset += (0.01*yag);
Anaesthetix 0:978110f7f027 65 // zagoffset += (0.01*zarg);
Anaesthetix 0:978110f7f027 66
Anaesthetix 0:978110f7f027 67 }
Anaesthetix 0:978110f7f027 68 }
Anaesthetix 0:978110f7f027 69
Anaesthetix 0:978110f7f027 70
Anaesthetix 0:978110f7f027 71 void gyrosample(void) {
Anaesthetix 0:978110f7f027 72 //Timer for filtervar
Anaesthetix 0:978110f7f027 73 dtgyro.stop();
Anaesthetix 0:978110f7f027 74 dtgyrtemp = dtgyro.read_us();
Anaesthetix 0:978110f7f027 75 dtgyr = dtgyrtemp;
Anaesthetix 0:978110f7f027 76 dtgyro.reset();
Anaesthetix 0:978110f7f027 77 dtgyro.start();
Anaesthetix 0:978110f7f027 78
Anaesthetix 0:978110f7f027 79 //Get gyro & accelero data
Anaesthetix 0:978110f7f027 80 __disable_irq(); //For some reason deadlocks without this
Anaesthetix 0:978110f7f027 81 xg = gyro.getGyroX();
Anaesthetix 0:978110f7f027 82 yg = gyro.getGyroY();
Anaesthetix 0:978110f7f027 83 zg = gyro.getGyroZ();
Anaesthetix 0:978110f7f027 84 __enable_irq();
Anaesthetix 0:978110f7f027 85 //accsample();
Anaesthetix 0:978110f7f027 86 acc1.readRaw();
Anaesthetix 0:978110f7f027 87
Anaesthetix 0:978110f7f027 88 //Cast int to float for better precision
Anaesthetix 0:978110f7f027 89 xarg = xg;
Anaesthetix 0:978110f7f027 90 yarg = yg;
Anaesthetix 0:978110f7f027 91 zarg = zg;
Anaesthetix 0:978110f7f027 92
Anaesthetix 0:978110f7f027 93 //Calc angular rate in degrees/second
Anaesthetix 0:978110f7f027 94 xarg = (xarg/14.375);
Anaesthetix 0:978110f7f027 95 yarg = (yarg/14.375);
Anaesthetix 0:978110f7f027 96 zarg = (zarg/14.375);
Anaesthetix 0:978110f7f027 97
Anaesthetix 0:978110f7f027 98 zarg -= zagoffset;
Anaesthetix 0:978110f7f027 99 xag = xarg;
Anaesthetix 0:978110f7f027 100 yag = yarg;
Anaesthetix 0:978110f7f027 101
Anaesthetix 0:978110f7f027 102 y1 = acc1.y;
Anaesthetix 0:978110f7f027 103 y2 = acc1.y;
Anaesthetix 0:978110f7f027 104 x1 = acc1.x;
Anaesthetix 0:978110f7f027 105 x2 = acc1.x;
Anaesthetix 0:978110f7f027 106
Anaesthetix 0:978110f7f027 107
Anaesthetix 0:978110f7f027 108
Anaesthetix 0:978110f7f027 109 //Calc y angle
Anaesthetix 0:978110f7f027 110 y1 = y1*y1;
Anaesthetix 0:978110f7f027 111 y1 = 1-y1;
Anaesthetix 0:978110f7f027 112 y1 = sqrt(y1);
Anaesthetix 0:978110f7f027 113 y1 = y2/y1;
Anaesthetix 0:978110f7f027 114
Anaesthetix 0:978110f7f027 115 ay = atan(y1);
Anaesthetix 0:978110f7f027 116 ay = ay*(180/PI);
Anaesthetix 0:978110f7f027 117
Anaesthetix 0:978110f7f027 118 //Calc x angle
Anaesthetix 0:978110f7f027 119 x1 = x1*x1;
Anaesthetix 0:978110f7f027 120 x1 = 1-x1;
Anaesthetix 0:978110f7f027 121 x1 = sqrt(x1);
Anaesthetix 0:978110f7f027 122 x1 = x2/x1;
Anaesthetix 0:978110f7f027 123
Anaesthetix 0:978110f7f027 124 ax = atan(x1);
Anaesthetix 0:978110f7f027 125 ax = ax*(180/PI);
Anaesthetix 0:978110f7f027 126
Anaesthetix 0:978110f7f027 127
Anaesthetix 0:978110f7f027 128 //if [angle] is NAN use previous value
Anaesthetix 0:978110f7f027 129 if (ax != ax) ax = ax2;
Anaesthetix 0:978110f7f027 130 if (ay != ay) ay = ay2;
Anaesthetix 0:978110f7f027 131 if (ax == ax) ax2 = ax;
Anaesthetix 0:978110f7f027 132 if (ay == ay) ay2 = ay;
Anaesthetix 0:978110f7f027 133
Anaesthetix 0:978110f7f027 134
Anaesthetix 0:978110f7f027 135 //Moving avarage filter
Anaesthetix 1:ac68f0368a77 136 xangle[0] = (ax + 6);
Anaesthetix 0:978110f7f027 137 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]));
Anaesthetix 0:978110f7f027 138 xangle[39] = xangle[38];
Anaesthetix 0:978110f7f027 139 xangle[38] = xangle[37];
Anaesthetix 0:978110f7f027 140 xangle[37] = xangle[36];
Anaesthetix 0:978110f7f027 141 xangle[36] = xangle[35];
Anaesthetix 0:978110f7f027 142 xangle[35] = xangle[34];
Anaesthetix 0:978110f7f027 143 xangle[34] = xangle[33];
Anaesthetix 0:978110f7f027 144 xangle[33] = xangle[32];
Anaesthetix 0:978110f7f027 145 xangle[32] = xangle[31];
Anaesthetix 0:978110f7f027 146 xangle[31] = xangle[30];
Anaesthetix 0:978110f7f027 147 xangle[30] = xangle[29];
Anaesthetix 0:978110f7f027 148 xangle[29] = xangle[28];
Anaesthetix 0:978110f7f027 149 xangle[28] = xangle[27];
Anaesthetix 0:978110f7f027 150 xangle[27] = xangle[26];
Anaesthetix 0:978110f7f027 151 xangle[26] = xangle[25];
Anaesthetix 0:978110f7f027 152 xangle[25] = xangle[24];
Anaesthetix 0:978110f7f027 153 xangle[24] = xangle[23];
Anaesthetix 0:978110f7f027 154 xangle[23] = xangle[22];
Anaesthetix 0:978110f7f027 155 xangle[22] = xangle[21];
Anaesthetix 0:978110f7f027 156 xangle[21] = xangle[20];
Anaesthetix 0:978110f7f027 157 xangle[20] = xangle[19];
Anaesthetix 0:978110f7f027 158 xangle[19] = xangle[18];
Anaesthetix 0:978110f7f027 159 xangle[18] = xangle[17];
Anaesthetix 0:978110f7f027 160 xangle[17] = xangle[16];
Anaesthetix 0:978110f7f027 161 xangle[16] = xangle[15];
Anaesthetix 0:978110f7f027 162 xangle[15] = xangle[14];
Anaesthetix 0:978110f7f027 163 xangle[14] = xangle[13];
Anaesthetix 0:978110f7f027 164 xangle[13] = xangle[12];
Anaesthetix 0:978110f7f027 165 xangle[12] = xangle[11];
Anaesthetix 0:978110f7f027 166 xangle[11] = xangle[10];
Anaesthetix 0:978110f7f027 167 xangle[10] = xangle[9];
Anaesthetix 0:978110f7f027 168 xangle[9] = xangle[8];
Anaesthetix 0:978110f7f027 169 xangle[8] = xangle[7];
Anaesthetix 0:978110f7f027 170 xangle[7] = xangle[6];
Anaesthetix 0:978110f7f027 171 xangle[6] = xangle[5];
Anaesthetix 0:978110f7f027 172 xangle[5] = xangle[4];
Anaesthetix 0:978110f7f027 173 xangle[4] = xangle[3];
Anaesthetix 0:978110f7f027 174 xangle[3] = xangle[2];
Anaesthetix 0:978110f7f027 175 xangle[2] = xangle[1];
Anaesthetix 0:978110f7f027 176 xangle[1] = xangle[0];
Anaesthetix 0:978110f7f027 177
Anaesthetix 0:978110f7f027 178
Anaesthetix 0:978110f7f027 179 yangle[0] = ay;
Anaesthetix 0:978110f7f027 180 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]));
Anaesthetix 0:978110f7f027 181 yangle[39] = yangle[38];
Anaesthetix 0:978110f7f027 182 yangle[38] = yangle[37];
Anaesthetix 0:978110f7f027 183 yangle[37] = yangle[36];
Anaesthetix 0:978110f7f027 184 yangle[36] = yangle[35];
Anaesthetix 0:978110f7f027 185 yangle[35] = yangle[34];
Anaesthetix 0:978110f7f027 186 yangle[34] = yangle[33];
Anaesthetix 0:978110f7f027 187 yangle[33] = yangle[32];
Anaesthetix 0:978110f7f027 188 yangle[32] = yangle[31];
Anaesthetix 0:978110f7f027 189 yangle[31] = yangle[30];
Anaesthetix 0:978110f7f027 190 yangle[30] = yangle[29];
Anaesthetix 0:978110f7f027 191 yangle[29] = yangle[28];
Anaesthetix 0:978110f7f027 192 yangle[28] = yangle[27];
Anaesthetix 0:978110f7f027 193 yangle[27] = yangle[26];
Anaesthetix 0:978110f7f027 194 yangle[26] = yangle[25];
Anaesthetix 0:978110f7f027 195 yangle[25] = yangle[24];
Anaesthetix 0:978110f7f027 196 yangle[24] = yangle[23];
Anaesthetix 0:978110f7f027 197 yangle[23] = yangle[22];
Anaesthetix 0:978110f7f027 198 yangle[22] = yangle[21];
Anaesthetix 0:978110f7f027 199 yangle[21] = yangle[20];
Anaesthetix 0:978110f7f027 200 yangle[20] = yangle[19];
Anaesthetix 0:978110f7f027 201 yangle[19] = yangle[18];
Anaesthetix 0:978110f7f027 202 yangle[18] = yangle[17];
Anaesthetix 0:978110f7f027 203 yangle[17] = yangle[16];
Anaesthetix 0:978110f7f027 204 yangle[16] = yangle[15];
Anaesthetix 0:978110f7f027 205 yangle[15] = yangle[14];
Anaesthetix 0:978110f7f027 206 yangle[14] = yangle[13];
Anaesthetix 0:978110f7f027 207 yangle[13] = yangle[12];
Anaesthetix 0:978110f7f027 208 yangle[12] = yangle[11];
Anaesthetix 0:978110f7f027 209 yangle[11] = yangle[10];
Anaesthetix 0:978110f7f027 210 yangle[10] = yangle[9];
Anaesthetix 0:978110f7f027 211 yangle[9] = yangle[8];
Anaesthetix 0:978110f7f027 212 yangle[8] = yangle[7];
Anaesthetix 0:978110f7f027 213 yangle[7] = yangle[6];
Anaesthetix 0:978110f7f027 214 yangle[6] = yangle[5];
Anaesthetix 0:978110f7f027 215 yangle[5] = yangle[4];
Anaesthetix 0:978110f7f027 216 yangle[4] = yangle[3];
Anaesthetix 0:978110f7f027 217 yangle[3] = yangle[2];
Anaesthetix 0:978110f7f027 218 yangle[2] = yangle[1];
Anaesthetix 0:978110f7f027 219 yangle[1] = yangle[0];
Anaesthetix 0:978110f7f027 220
Anaesthetix 0:978110f7f027 221
Anaesthetix 0:978110f7f027 222
Anaesthetix 0:978110f7f027 223
Anaesthetix 0:978110f7f027 224 //Substract angular rate offsets
Anaesthetix 0:978110f7f027 225 xag += xagoffset;
Anaesthetix 0:978110f7f027 226 yag += yagoffset;
Anaesthetix 0:978110f7f027 227 // xag = (xag*-1);
Anaesthetix 0:978110f7f027 228 yag = (yag*-1);
Anaesthetix 0:978110f7f027 229
Anaesthetix 0:978110f7f027 230
Anaesthetix 0:978110f7f027 231 //calc filtervar
Anaesthetix 0:978110f7f027 232 temp6 = 5000000; //time constant [us]
Anaesthetix 0:978110f7f027 233 temp6 = temp6/(temp6+dtgyr);
Anaesthetix 0:978110f7f027 234
Anaesthetix 0:978110f7f027 235
Anaesthetix 0:978110f7f027 236 //complementary filter
Anaesthetix 0:978110f7f027 237 newax = (temp6*(newax + (yag*(dtgyr/1000000)))) + ((1-temp6)*ax1);
Anaesthetix 0:978110f7f027 238 neway = (temp6*(neway + (xag*(dtgyr/1000000)))) + ((1-temp6)*ay1);
Anaesthetix 0:978110f7f027 239 // neway = neway*-1;
Anaesthetix 0:978110f7f027 240
Anaesthetix 0:978110f7f027 241 //if [angle] is NAN use previous value
Anaesthetix 0:978110f7f027 242 if (newax != newax) newax = tempx1;
Anaesthetix 0:978110f7f027 243 if (neway != neway) neway = tempy1;
Anaesthetix 0:978110f7f027 244 if (newax == newax) tempx1 = newax;
Anaesthetix 0:978110f7f027 245 if (neway == neway) tempy1 = neway;
Anaesthetix 0:978110f7f027 246 }
Anaesthetix 0:978110f7f027 247
Anaesthetix 0:978110f7f027 248
Anaesthetix 0:978110f7f027 249
Anaesthetix 0:978110f7f027 250 #endif