SPI slave program to enable communication between the FPGA and the STM32L432 board.

Dependencies:   mbed

Committer:
Zbyszek
Date:
Wed Feb 27 23:35:51 2019 +0000
Revision:
8:e87027349167
Parent:
7:0e9af5986488
Child:
9:9ed9dffd602a
Exporting To Mbed studio

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Zbyszek 0:8e367d6d8f03 1 #include "mbed.h"
Zbyszek 0:8e367d6d8f03 2 #include "SPI.h"
Zbyszek 6:0ebecfecadc9 3 #include "IMUs.h"
Zbyszek 6:0ebecfecadc9 4 #include "Structures.h"
Zbyszek 4:e36c7042d3bb 5 #include "Quaternions.h"
Zbyszek 8:e87027349167 6 #include "DMA_SPI.h"
Zbyszek 8:e87027349167 7
Zbyszek 0:8e367d6d8f03 8 DigitalOut myled(LED1);
Zbyszek 0:8e367d6d8f03 9 Serial pc(USBTX, USBRX);
Zbyszek 0:8e367d6d8f03 10
Zbyszek 0:8e367d6d8f03 11 int masterRx = 0;
Zbyszek 3:e33697420c4a 12 int16_t slaveRx = 0;
Zbyszek 3:e33697420c4a 13 int i = 2;
Zbyszek 3:e33697420c4a 14 int k = 0;
Zbyszek 3:e33697420c4a 15 int16_t zgHigher = 0;
Zbyszek 3:e33697420c4a 16 int16_t zgLower = 0;
Zbyszek 3:e33697420c4a 17 int16_t zGyro = 0;
Zbyszek 3:e33697420c4a 18 int countx = 0;
Zbyszek 3:e33697420c4a 19 int p = 32776;
Zbyszek 6:0ebecfecadc9 20 double const SSF = 0.06097560975609756097560975609756f; //FSEL = 0: 0.00763358778625954198473282442748, FSEL = 3: 0.06097560975609756097560975609756f
Zbyszek 6:0ebecfecadc9 21
Zbyszek 6:0ebecfecadc9 22 int OffsetX = 254;
Zbyszek 6:0ebecfecadc9 23 int OffsetY = -14;
Zbyszek 6:0ebecfecadc9 24 int OffsetZ = 81;
Zbyszek 6:0ebecfecadc9 25
Zbyszek 6:0ebecfecadc9 26 int OffsetXA = -306;
Zbyszek 6:0ebecfecadc9 27 int OffsetYA = -131;
Zbyszek 6:0ebecfecadc9 28 int OffsetZA = -531;
Zbyszek 6:0ebecfecadc9 29
Zbyszek 6:0ebecfecadc9 30 IMU IMU0 (0, -306.0f, -131.0f, -351.0f, 254.0f, -14.0f, 81.0f, 0, 3);
Zbyszek 7:0e9af5986488 31 IMU_Data Dat;
Zbyszek 7:0e9af5986488 32 vector Datt;
Zbyszek 6:0ebecfecadc9 33
Zbyszek 3:e33697420c4a 34
Zbyszek 4:e36c7042d3bb 35 Timer t;
Zbyszek 4:e36c7042d3bb 36 float dTime = 0.0f;
Zbyszek 4:e36c7042d3bb 37
Zbyszek 4:e36c7042d3bb 38 vector vertical;
Zbyszek 4:e36c7042d3bb 39 vector globalAccel;
Zbyszek 4:e36c7042d3bb 40 vector correctionGlobalAccel;
Zbyszek 4:e36c7042d3bb 41 vector correctionBodyAccel;
Zbyszek 4:e36c7042d3bb 42 Quaternion gyroQ;
Zbyszek 4:e36c7042d3bb 43 vector Eangles;
Zbyszek 5:155d224d855c 44 Quaternion CF;
Zbyszek 5:155d224d855c 45 vector intGyro;
Zbyszek 5:155d224d855c 46 vector GyroVals;
Zbyszek 5:155d224d855c 47 vector AccelVals;
Zbyszek 5:155d224d855c 48 vector accelTilt;
Zbyszek 5:155d224d855c 49 Quaternion accelQ;
Zbyszek 5:155d224d855c 50
Zbyszek 5:155d224d855c 51 void calibrateOffset();
Zbyszek 4:e36c7042d3bb 52
Zbyszek 4:e36c7042d3bb 53
Zbyszek 4:e36c7042d3bb 54 float xx;
Zbyszek 4:e36c7042d3bb 55 float yy;
Zbyszek 4:e36c7042d3bb 56 float zz;
Zbyszek 4:e36c7042d3bb 57
Zbyszek 4:e36c7042d3bb 58
Zbyszek 3:e33697420c4a 59
Zbyszek 3:e33697420c4a 60 /*
Zbyszek 3:e33697420c4a 61
Zbyszek 3:e33697420c4a 62 */
Zbyszek 3:e33697420c4a 63 //------------------Printing-All-values----------------------//
Zbyszek 3:e33697420c4a 64 int16_t IMUarray[12]; //Store each separate reading in an array
Zbyszek 3:e33697420c4a 65 uint16_t IDarray[12]; //Holds the identification of each data piece
Zbyszek 3:e33697420c4a 66 char idx = 0; //IMUarray Pointer
Zbyszek 3:e33697420c4a 67 char dataCount = 0; //Keeps track of how many data points have been read in using SPI
Zbyszek 3:e33697420c4a 68 uint16_t id = 0; //Used to store extracted data ID
Zbyszek 3:e33697420c4a 69
Zbyszek 3:e33697420c4a 70 void ProcessAndPrint();
Zbyszek 3:e33697420c4a 71 //------------------Printing-All-values----------------------//
Zbyszek 3:e33697420c4a 72
Zbyszek 4:e36c7042d3bb 73 //-------------Testing-Variables-Remove-Later----------------//
Zbyszek 4:e36c7042d3bb 74 int blinkCounter = 0;
Zbyszek 4:e36c7042d3bb 75 //-------------Testing-Variables-Remove-Later----------------//
Zbyszek 0:8e367d6d8f03 76
Zbyszek 0:8e367d6d8f03 77 int main() {
Zbyszek 4:e36c7042d3bb 78 pc.baud (115200);
Zbyszek 3:e33697420c4a 79 IDarray[0] = 1;
Zbyszek 3:e33697420c4a 80 IDarray[1] = 0;
Zbyszek 3:e33697420c4a 81 IDarray[2] = 9;
Zbyszek 3:e33697420c4a 82 IDarray[3] = 8;
Zbyszek 3:e33697420c4a 83 IDarray[4] = 17;
Zbyszek 3:e33697420c4a 84 IDarray[5] = 16;
Zbyszek 3:e33697420c4a 85 IDarray[6] = 3;
Zbyszek 4:e36c7042d3bb 86 IDarray[7] = 2; //2
Zbyszek 3:e33697420c4a 87 IDarray[8] = 11;
Zbyszek 3:e33697420c4a 88 IDarray[9] = 10;
Zbyszek 3:e33697420c4a 89 IDarray[10] = 19;
Zbyszek 3:e33697420c4a 90 IDarray[11] = 18;
Zbyszek 3:e33697420c4a 91
Zbyszek 4:e36c7042d3bb 92 init_spi1();
Zbyszek 4:e36c7042d3bb 93 t.start();
Zbyszek 3:e33697420c4a 94
Zbyszek 4:e36c7042d3bb 95 gyroQ.w = 1;
Zbyszek 4:e36c7042d3bb 96 gyroQ.x = 0.0001;
Zbyszek 4:e36c7042d3bb 97 gyroQ.y = 0.0001;
Zbyszek 4:e36c7042d3bb 98 gyroQ.z = 0.0001;
Zbyszek 4:e36c7042d3bb 99
Zbyszek 5:155d224d855c 100 CF.w = 1;
Zbyszek 5:155d224d855c 101 CF.x = 0.0001;
Zbyszek 5:155d224d855c 102 CF.y = 0.0001;
Zbyszek 5:155d224d855c 103 CF.z = 0.0001;
Zbyszek 4:e36c7042d3bb 104
Zbyszek 4:e36c7042d3bb 105
Zbyszek 4:e36c7042d3bb 106 gyroQ = normaliseQuaternion(gyroQ);
Zbyszek 5:155d224d855c 107 CF = normaliseQuaternion(CF);
Zbyszek 4:e36c7042d3bb 108
Zbyszek 4:e36c7042d3bb 109 vertical.x = 0.0f;
Zbyszek 4:e36c7042d3bb 110 vertical.y = 0.0f;
Zbyszek 4:e36c7042d3bb 111 vertical.z = 1.0f;
Zbyszek 4:e36c7042d3bb 112
Zbyszek 3:e33697420c4a 113 pc.printf("Begin \n\r");
Zbyszek 0:8e367d6d8f03 114
Zbyszek 0:8e367d6d8f03 115 while(1) {
Zbyszek 3:e33697420c4a 116 if(i == 1) {
Zbyszek 0:8e367d6d8f03 117 for(int x = 1; x < 128; x *= 2) {
Zbyszek 0:8e367d6d8f03 118 slaveRx = transfer_spi_slave(x);
Zbyszek 3:e33697420c4a 119 //pc.putc(slaveRx);
Zbyszek 3:e33697420c4a 120 pc.printf("%d \n\r",slaveRx);
Zbyszek 0:8e367d6d8f03 121 }
Zbyszek 0:8e367d6d8f03 122 for(int x = 128; x > 1; x /= 2) {
Zbyszek 0:8e367d6d8f03 123 slaveRx = transfer_spi_slave(x);
Zbyszek 3:e33697420c4a 124 //pc.putc(slaveRx);
Zbyszek 3:e33697420c4a 125 pc.printf("%d \n\r",slaveRx);
Zbyszek 2:4cc880ea466d 126 }
Zbyszek 3:e33697420c4a 127 }//if(i == 1)
Zbyszek 3:e33697420c4a 128
Zbyszek 3:e33697420c4a 129
Zbyszek 3:e33697420c4a 130
Zbyszek 3:e33697420c4a 131 //------------------------------------------------------------------------------
Zbyszek 3:e33697420c4a 132 if(i == 0) {
Zbyszek 3:e33697420c4a 133 slaveRx = transfer_spi_slave(10);
Zbyszek 3:e33697420c4a 134 countx++;
Zbyszek 3:e33697420c4a 135 if(countx == 1) {
Zbyszek 3:e33697420c4a 136 k = slaveRx;
Zbyszek 3:e33697420c4a 137 k &= ~(255 << 8);
Zbyszek 3:e33697420c4a 138 k = k << 8;
Zbyszek 3:e33697420c4a 139 // if(k == 19) {
Zbyszek 3:e33697420c4a 140 zgHigher = k;
Zbyszek 3:e33697420c4a 141 //zgHigher = zgHigher << 8;
Zbyszek 3:e33697420c4a 142 //}//if(k == 19)
Zbyszek 3:e33697420c4a 143 }//if(count == 11)
Zbyszek 3:e33697420c4a 144
Zbyszek 3:e33697420c4a 145
Zbyszek 3:e33697420c4a 146 else if(countx == 2) {
Zbyszek 3:e33697420c4a 147 k = slaveRx;
Zbyszek 3:e33697420c4a 148 k &= ~(255 << 8);
Zbyszek 3:e33697420c4a 149 //k = k << 8;
Zbyszek 3:e33697420c4a 150 //if(k == 18) {
Zbyszek 3:e33697420c4a 151 zgLower = k;
Zbyszek 3:e33697420c4a 152 //zgLower = zgLower << 8;
Zbyszek 3:e33697420c4a 153 zGyro = zgHigher + zgLower;
Zbyszek 3:e33697420c4a 154 pc.printf("%+d \n\r",zGyro);
Zbyszek 3:e33697420c4a 155 //}//if(k == 19)
Zbyszek 3:e33697420c4a 156 countx = 0;
Zbyszek 3:e33697420c4a 157 }//else if(count == 12)
Zbyszek 3:e33697420c4a 158
Zbyszek 3:e33697420c4a 159 }//if(i == 0)
Zbyszek 3:e33697420c4a 160 //------------------------------------------------------------------------------
Zbyszek 3:e33697420c4a 161
Zbyszek 3:e33697420c4a 162 if(i == 2) {
Zbyszek 4:e36c7042d3bb 163 slaveRx = transfer_spi_slave(10); //get IMU data
Zbyszek 4:e36c7042d3bb 164
Zbyszek 4:e36c7042d3bb 165
Zbyszek 4:e36c7042d3bb 166 id = slaveRx; //Save sample to id for id extraction
Zbyszek 4:e36c7042d3bb 167 id &= ~(255); //get rid of the actual data to only be left with the id
Zbyszek 4:e36c7042d3bb 168 id = id >> 8; //shift the id to the right for comparison
Zbyszek 4:e36c7042d3bb 169
Zbyszek 4:e36c7042d3bb 170 //pc.printf("ID: %d \n\r", id); //Print each id to see what sequence is obtained. Only the correct sequence will make the code run/
Zbyszek 4:e36c7042d3bb 171
Zbyszek 4:e36c7042d3bb 172 if(IDarray[dataCount] == id) { //compare if the order of data is right and if not wait until it is.
Zbyszek 4:e36c7042d3bb 173 dataCount++; //Increase dataCount as new value has been read in.
Zbyszek 4:e36c7042d3bb 174 IMUarray[idx] = slaveRx; //save the newly read value to current free space in the array
Zbyszek 4:e36c7042d3bb 175 idx++; //increment the pointer to point to next free space in the array
Zbyszek 3:e33697420c4a 176
Zbyszek 3:e33697420c4a 177 if(dataCount == 12) {
Zbyszek 3:e33697420c4a 178 //reset idx and dataCount
Zbyszek 3:e33697420c4a 179 dataCount = 0;
Zbyszek 3:e33697420c4a 180 idx = 0;
Zbyszek 6:0ebecfecadc9 181 //ProcessAndPrint();
Zbyszek 6:0ebecfecadc9 182 //calibrateOffset();
Zbyszek 7:0e9af5986488 183 //IMU0.concatenateData(IMUarray);
Zbyszek 7:0e9af5986488 184 Datt = IMU0.CalculateQCFAngles(IMUarray);
Zbyszek 7:0e9af5986488 185
Zbyszek 6:0ebecfecadc9 186
Zbyszek 4:e36c7042d3bb 187 t.stop();
Zbyszek 4:e36c7042d3bb 188 dTime = t.read();
Zbyszek 4:e36c7042d3bb 189 t.reset();
Zbyszek 4:e36c7042d3bb 190 t.start();
Zbyszek 3:e33697420c4a 191 }//if(dataCount == 12)
Zbyszek 3:e33697420c4a 192 }//if(IDarray[dataCount] == id)
Zbyszek 4:e36c7042d3bb 193 else {
Zbyszek 4:e36c7042d3bb 194 //-----Code-Used-For-Testing-----//
Zbyszek 4:e36c7042d3bb 195 //pc.printf("Failed at: %d \n\r", dataCount); //Print an error if there is one
Zbyszek 4:e36c7042d3bb 196 if(blinkCounter == 10) { //Slow the blinking down to make it visible if there are errors
Zbyszek 4:e36c7042d3bb 197 myled = !myled; //Change state of the LED if error occurs
Zbyszek 4:e36c7042d3bb 198 blinkCounter = 0; //Reset Blink counter
Zbyszek 4:e36c7042d3bb 199 }
Zbyszek 4:e36c7042d3bb 200 else {
Zbyszek 4:e36c7042d3bb 201 blinkCounter++;
Zbyszek 4:e36c7042d3bb 202 }
Zbyszek 4:e36c7042d3bb 203 //-----Code-Used-For-Testing-----//
Zbyszek 4:e36c7042d3bb 204
Zbyszek 4:e36c7042d3bb 205 dataCount = 0; //ID sequence is worng so reset the counter
Zbyszek 4:e36c7042d3bb 206 idx = 0; //ID sequence is worng so reset the counter
Zbyszek 4:e36c7042d3bb 207 }
Zbyszek 3:e33697420c4a 208 }//if(i == 2)
Zbyszek 3:e33697420c4a 209
Zbyszek 3:e33697420c4a 210
Zbyszek 3:e33697420c4a 211
Zbyszek 0:8e367d6d8f03 212 }
Zbyszek 0:8e367d6d8f03 213 }
Zbyszek 3:e33697420c4a 214
Zbyszek 3:e33697420c4a 215
Zbyszek 3:e33697420c4a 216
Zbyszek 4:e36c7042d3bb 217
Zbyszek 4:e36c7042d3bb 218 /*
Zbyszek 4:e36c7042d3bb 219 -The purpose of this function
Zbyszek 4:e36c7042d3bb 220 */
Zbyszek 3:e33697420c4a 221 void ProcessAndPrint() {
Zbyszek 3:e33697420c4a 222 int16_t MSB = 0; //Store Most Significant Byte of data piece in this variable for processing
Zbyszek 3:e33697420c4a 223 int16_t LSB = 0; //Store Least Significant Byte of data piece in this variable for processing
Zbyszek 3:e33697420c4a 224 char arrPointer = 0; //Array Pointer
Zbyszek 4:e36c7042d3bb 225
Zbyszek 3:e33697420c4a 226 //-----------Concatentated-Data-Pieces------------------------------------------
Zbyszek 3:e33697420c4a 227 int16_t gyroX = 0;
Zbyszek 3:e33697420c4a 228 int16_t gyroY = 0;
Zbyszek 3:e33697420c4a 229 int16_t gyroZ = 0;
Zbyszek 3:e33697420c4a 230
Zbyszek 3:e33697420c4a 231 int16_t accelX = 0;
Zbyszek 3:e33697420c4a 232 int16_t accelY = 0;
Zbyszek 3:e33697420c4a 233 int16_t accelZ = 0;
Zbyszek 4:e36c7042d3bb 234
Zbyszek 4:e36c7042d3bb 235 float faccelX = 0.0f;
Zbyszek 4:e36c7042d3bb 236 float faccelY = 0.0f;
Zbyszek 4:e36c7042d3bb 237 float faccelZ = 0.0f;
Zbyszek 4:e36c7042d3bb 238
Zbyszek 4:e36c7042d3bb 239 float fgyroX = 0.0f;
Zbyszek 4:e36c7042d3bb 240 float fgyroY = 0.0f;
Zbyszek 4:e36c7042d3bb 241 float fgyroZ = 0.0f;
Zbyszek 4:e36c7042d3bb 242
Zbyszek 3:e33697420c4a 243 //-----------Concatentated-Data-Pieces------------------------------------------
Zbyszek 3:e33697420c4a 244 for(char x = 0; x <= 5; x++) {
Zbyszek 4:e36c7042d3bb 245 MSB = IMUarray[arrPointer]; //Odd data pieces are MSBs
Zbyszek 4:e36c7042d3bb 246 MSB &= ~(255<<8); //Mask the MSB bits as they are not part of data
Zbyszek 4:e36c7042d3bb 247 MSB = MSB << 8; //Shift the Value as its the MSB of the data piece
Zbyszek 4:e36c7042d3bb 248 arrPointer++; //Increment array pointer
Zbyszek 4:e36c7042d3bb 249 LSB = IMUarray[arrPointer]; //Even data pieces are LSBs
Zbyszek 4:e36c7042d3bb 250 LSB &= ~(255 << 8); //Mask the MSB bits as they are not part of data
Zbyszek 4:e36c7042d3bb 251 arrPointer++; //Increment array pointer
Zbyszek 3:e33697420c4a 252
Zbyszek 3:e33697420c4a 253 switch(x) {
Zbyszek 3:e33697420c4a 254 case 0:
Zbyszek 6:0ebecfecadc9 255 accelX = (MSB + LSB) + OffsetXA; //Combine Accelerometer x-axis data
Zbyszek 4:e36c7042d3bb 256 faccelX = (float)accelX * 0.00006103515625f; //Multiply the acceleration by sensitivity scale factor to get it into g 1/16,384
Zbyszek 3:e33697420c4a 257 break;
Zbyszek 3:e33697420c4a 258 case 1:
Zbyszek 6:0ebecfecadc9 259 accelY = (MSB + LSB) + OffsetYA; //Combine Accelerometer y-axis data
Zbyszek 4:e36c7042d3bb 260 faccelY = (float)accelY * 0.00006103515625f; //Multiply the acceleration by sensitivity scale factor to get it into g 1/16,384
Zbyszek 3:e33697420c4a 261 break;
Zbyszek 3:e33697420c4a 262 case 2:
Zbyszek 6:0ebecfecadc9 263 accelZ = (MSB + LSB) + OffsetZA; //Combine Accelerometer z-axis data
Zbyszek 4:e36c7042d3bb 264 faccelZ = (float)accelZ * 0.00006103515625f; //Multiply the acceleration by sensitivity scale factor to get it into g 1/16,384
Zbyszek 3:e33697420c4a 265 break;
Zbyszek 3:e33697420c4a 266 case 3:
Zbyszek 6:0ebecfecadc9 267 gyroX = (MSB + LSB) + OffsetX; //Combine Gyroscope x-axis data
Zbyszek 5:155d224d855c 268 fgyroX = (float)gyroX * SSF; //Multiply the sample by sensitivity scale factor to get it into degress per second 1/16.4
Zbyszek 4:e36c7042d3bb 269
Zbyszek 3:e33697420c4a 270 break;
Zbyszek 3:e33697420c4a 271 case 4:
Zbyszek 6:0ebecfecadc9 272 gyroY = (MSB + LSB) + OffsetY; //Combine Gyroscope y-axis data
Zbyszek 5:155d224d855c 273 fgyroY = (float)gyroY * SSF; //Multiply the sample by sensitivity scale factor to get it into degress per second 1/16.4
Zbyszek 4:e36c7042d3bb 274
Zbyszek 3:e33697420c4a 275 break;
Zbyszek 3:e33697420c4a 276 case 5:
Zbyszek 6:0ebecfecadc9 277 gyroZ = (MSB + LSB) + OffsetZ; //Combine Gyroscope z-axis data
Zbyszek 5:155d224d855c 278 fgyroZ = (float)gyroZ * SSF; //Multiply the sample by sensitivity scale factor to get it into degress per second 1/16.4
Zbyszek 3:e33697420c4a 279 break;
Zbyszek 3:e33697420c4a 280 default:
Zbyszek 3:e33697420c4a 281 break;
Zbyszek 3:e33697420c4a 282 }//switch(x)
Zbyszek 3:e33697420c4a 283 }//for(char x = 0; x <= 5; x++)
Zbyszek 4:e36c7042d3bb 284
Zbyszek 4:e36c7042d3bb 285 //Quaternion-Gyro-Integration--------------------------------------------------------------
Zbyszek 4:e36c7042d3bb 286 //Get the Gyro and Accel values--------------------------------------------------------
Zbyszek 4:e36c7042d3bb 287 //Convert these vales to radians per second and store them in the vector
Zbyszek 6:0ebecfecadc9 288 GyroVals.x = fgyroX * 0.0174533f;
Zbyszek 6:0ebecfecadc9 289 GyroVals.y = fgyroY * 0.0174533f;
Zbyszek 6:0ebecfecadc9 290 GyroVals.z = fgyroZ * 0.0174533f;
Zbyszek 4:e36c7042d3bb 291
Zbyszek 5:155d224d855c 292 intGyro.x = (fgyroX * dTime);
Zbyszek 5:155d224d855c 293 intGyro.y = (fgyroY * dTime);
Zbyszek 5:155d224d855c 294 intGyro.z = (fgyroZ * dTime);
Zbyszek 5:155d224d855c 295
Zbyszek 4:e36c7042d3bb 296 AccelVals.x = faccelX;
Zbyszek 4:e36c7042d3bb 297 AccelVals.y = faccelY;
Zbyszek 4:e36c7042d3bb 298 AccelVals.z = faccelZ;
Zbyszek 4:e36c7042d3bb 299 //Get the Gyro and Accel values--------------------------------------------------------
Zbyszek 4:e36c7042d3bb 300
Zbyszek 6:0ebecfecadc9 301 //CF = updateQuaternion(CF, GyroVals, dTime);
Zbyszek 6:0ebecfecadc9 302 //CF = normaliseQuaternion(CF);
Zbyszek 6:0ebecfecadc9 303 //Eangles = eulerA(CF);
Zbyszek 4:e36c7042d3bb 304 //Quaternion-Gyro-Integration--------------------------------------------------------------
Zbyszek 4:e36c7042d3bb 305
Zbyszek 4:e36c7042d3bb 306
Zbyszek 4:e36c7042d3bb 307 //Angle-Calculations-Based-on-Accalerometer------------------------------------------------
Zbyszek 4:e36c7042d3bb 308 //https://www.dfrobot.com/wiki/index.php/How_to_Use_a_Three-Axis_Accelerometer_for_Tilt_Sensing
Zbyszek 4:e36c7042d3bb 309
Zbyszek 5:155d224d855c 310 accelTilt.x = (atan2f(AccelVals.y, AccelVals.z) * 57.29577951f);
Zbyszek 5:155d224d855c 311 accelTilt.y = (atan2f((-AccelVals.x), sqrt(pow(AccelVals.y, 2) + pow(AccelVals.z, 2) )) * 57.29577951f);
Zbyszek 5:155d224d855c 312 //pc.printf("%+6f, %+6f ", accelTilt.x, accelTilt.y);
Zbyszek 4:e36c7042d3bb 313 //Canntot calculate accel tilt for Z. Gyro date in combination with magnetometer have to be used to obtain reliable z-axis tilt.
Zbyszek 5:155d224d855c 314 //Angle-Calculations-Based-on-Accalerometer------------------------------------------------
Zbyszek 5:155d224d855c 315 //pc.printf("%+6f, %+6f, %+6f ", CF.x, CF.y, CF.z);
Zbyszek 5:155d224d855c 316
Zbyszek 5:155d224d855c 317
Zbyszek 5:155d224d855c 318 //Complementary-Filter---------------------------------------------------------------------
Zbyszek 6:0ebecfecadc9 319 //CF.x = 0.98f*(Eangles.x) + 0.02f*accelTilt.x;
Zbyszek 6:0ebecfecadc9 320 //CF.y = 0.98f*(Eangles.y) + 0.02f*accelTilt.y;
Zbyszek 6:0ebecfecadc9 321 //CF.z = 0.98f*(Eangles.z) + 0.02f*accelTilt.z;
Zbyszek 5:155d224d855c 322
Zbyszek 6:0ebecfecadc9 323 CF.x = 0.98f*(CF.x + intGyro.x) + 0.02f*accelTilt.x;
Zbyszek 6:0ebecfecadc9 324 CF.y = 0.98f*(CF.y + intGyro.y) + 0.02f*accelTilt.y;
Zbyszek 6:0ebecfecadc9 325 CF.z = 0.98f*(CF.z + intGyro.z) + 0.02f*accelTilt.z;
Zbyszek 5:155d224d855c 326 //Complementary-Filter---------------------------------------------------------------------
Zbyszek 4:e36c7042d3bb 327
Zbyszek 4:e36c7042d3bb 328 //Add the correction to gyro readings and update the quaternion------------------------
Zbyszek 4:e36c7042d3bb 329 //pc.printf("%+6f, %+6f, %+6f %+6f\n\r ", xx, yy, zz, dTime);
Zbyszek 5:155d224d855c 330 //pc.printf("%+6f, %+6f, %+6f, %+6f, %+6f, %+6f, %+6f\n\r ", gyroQ.w, gyroQ.x, gyroQ.y, gyroQ.z, CF.x, CF.y, Eangles.z);
Zbyszek 6:0ebecfecadc9 331 //pc.printf("%+6f, %+6f, %+6f \n\r", CF.x, CF.y, CF.z);
Zbyszek 6:0ebecfecadc9 332 //CF.x *= 0.0174533f;
Zbyszek 6:0ebecfecadc9 333 //CF.y *= 0.0174533f;
Zbyszek 6:0ebecfecadc9 334 // CF.z *= 0.0174533f;
Zbyszek 6:0ebecfecadc9 335 //CF = euler2Quaternion(CF);
Zbyszek 6:0ebecfecadc9 336 //CF = normaliseQuaternion(CF);
Zbyszek 4:e36c7042d3bb 337 //pc.printf("%+6f, %+6f, %+6f\n\r ",Eangles.x, Eangles.y, Eangles.z);
Zbyszek 5:155d224d855c 338 pc.printf("Accel X: %+6f, Accel Y: %+6f, Accel Z: %+6f, Gyro X: %+6f, Gyro Y: %+6f, Gyro Z: %+6f\n\r", faccelX, faccelY, faccelZ, fgyroX, fgyroY, fgyroZ);
Zbyszek 6:0ebecfecadc9 339 //pc.printf("Accel X: %+6f, Accel Y: %+6f, Accel Z: %+6f, Gyro X: %+6d, Gyro Y: %+6d, Gyro Z: %+6d\n\r", faccelX, faccelY, faccelZ, gyroX, gyroY, gyroZ);
Zbyszek 3:e33697420c4a 340
Zbyszek 3:e33697420c4a 341 }//void ProcessAndPrint()
Zbyszek 3:e33697420c4a 342
Zbyszek 4:e36c7042d3bb 343
Zbyszek 4:e36c7042d3bb 344
Zbyszek 5:155d224d855c 345 void calibrateOffset() {
Zbyszek 5:155d224d855c 346
Zbyszek 5:155d224d855c 347 int16_t MSB = 0; //Store Most Significant Byte of data piece in this variable for processing
Zbyszek 5:155d224d855c 348 int16_t LSB = 0; //Store Least Significant Byte of data piece in this variable for processing
Zbyszek 5:155d224d855c 349 char arrPointer = 0; //Array Pointer
Zbyszek 5:155d224d855c 350
Zbyszek 5:155d224d855c 351 //-----------Concatentated-Data-Pieces------------------------------------------
Zbyszek 5:155d224d855c 352 int16_t gyroX = 0;
Zbyszek 5:155d224d855c 353 int16_t gyroY = 0;
Zbyszek 5:155d224d855c 354 int16_t gyroZ = 0;
Zbyszek 5:155d224d855c 355
Zbyszek 5:155d224d855c 356 int16_t accelX = 0;
Zbyszek 5:155d224d855c 357 int16_t accelY = 0;
Zbyszek 5:155d224d855c 358 int16_t accelZ = 0;
Zbyszek 5:155d224d855c 359
Zbyszek 5:155d224d855c 360 vector accelRaw;
Zbyszek 5:155d224d855c 361 vector accelG;
Zbyszek 5:155d224d855c 362 vector gyroRaw;
Zbyszek 5:155d224d855c 363 vector gyroDPS;
Zbyszek 5:155d224d855c 364
Zbyszek 5:155d224d855c 365 static unsigned int sampleCounter = 1;
Zbyszek 5:155d224d855c 366 static vector accelRawAvg;
Zbyszek 5:155d224d855c 367 static vector accelGAvg;
Zbyszek 5:155d224d855c 368 static vector gyroRawAvg;
Zbyszek 5:155d224d855c 369 static vector gyroDPSAvg;
Zbyszek 5:155d224d855c 370
Zbyszek 5:155d224d855c 371
Zbyszek 5:155d224d855c 372 for(char x = 0; x <= 5; x++) {
Zbyszek 5:155d224d855c 373 MSB = IMUarray[arrPointer]; //Odd data pieces are MSBs
Zbyszek 5:155d224d855c 374 MSB &= ~(255<<8); //Mask the MSB bits as they are not part of data
Zbyszek 5:155d224d855c 375 MSB = MSB << 8; //Shift the Value as its the MSB of the data piece
Zbyszek 5:155d224d855c 376 arrPointer++; //Increment array pointer
Zbyszek 5:155d224d855c 377 LSB = IMUarray[arrPointer]; //Even data pieces are LSBs
Zbyszek 5:155d224d855c 378 LSB &= ~(255 << 8); //Mask the MSB bits as they are not part of data
Zbyszek 5:155d224d855c 379 arrPointer++; //Increment array pointer
Zbyszek 5:155d224d855c 380
Zbyszek 5:155d224d855c 381 switch(x) {
Zbyszek 5:155d224d855c 382 case 0:
Zbyszek 5:155d224d855c 383 accelX = MSB + LSB; //Combine Accelerometer x-axis data
Zbyszek 5:155d224d855c 384 accelRaw.x = (double)accelX; //accelRaw
Zbyszek 5:155d224d855c 385 accelG.x = (double)accelX * 0.00006103515625f; //accelSSF
Zbyszek 5:155d224d855c 386
Zbyszek 5:155d224d855c 387 break;
Zbyszek 5:155d224d855c 388 case 1:
Zbyszek 5:155d224d855c 389 accelY = MSB + LSB; //Combine Accelerometer y-axis data
Zbyszek 5:155d224d855c 390 accelRaw.y = (double)accelY;
Zbyszek 5:155d224d855c 391 accelG.y = (double)accelY * 0.00006103515625f;
Zbyszek 5:155d224d855c 392 break;
Zbyszek 5:155d224d855c 393 case 2:
Zbyszek 5:155d224d855c 394 accelZ = MSB + LSB; //Combine Accelerometer z-axis data
Zbyszek 5:155d224d855c 395 accelRaw.z = (double)accelZ;
Zbyszek 5:155d224d855c 396 accelG.z = (double)accelZ * 0.00006103515625f;
Zbyszek 5:155d224d855c 397 break;
Zbyszek 5:155d224d855c 398 case 3:
Zbyszek 5:155d224d855c 399 gyroX = MSB + LSB; //Combine Gyroscope x-axis data
Zbyszek 5:155d224d855c 400 gyroRaw.x = (double)gyroX; //gyroRaw
Zbyszek 5:155d224d855c 401 gyroDPS.x = (double)gyroX * SSF; //gyroSSF
Zbyszek 5:155d224d855c 402
Zbyszek 5:155d224d855c 403 break;
Zbyszek 5:155d224d855c 404 case 4:
Zbyszek 5:155d224d855c 405 gyroY = MSB + LSB; //Combine Gyroscope y-axis data
Zbyszek 5:155d224d855c 406 gyroRaw.y = (double)gyroY;
Zbyszek 5:155d224d855c 407 gyroDPS.y = (double)gyroY * SSF;
Zbyszek 4:e36c7042d3bb 408
Zbyszek 5:155d224d855c 409 break;
Zbyszek 5:155d224d855c 410 case 5:
Zbyszek 5:155d224d855c 411 gyroZ = MSB + LSB; //Combine Gyroscope z-axis data
Zbyszek 5:155d224d855c 412 gyroRaw.z = (double)gyroZ;
Zbyszek 5:155d224d855c 413 gyroDPS.z = (double)gyroZ * SSF;
Zbyszek 5:155d224d855c 414 break;
Zbyszek 5:155d224d855c 415 default:
Zbyszek 5:155d224d855c 416 break;
Zbyszek 5:155d224d855c 417 }//switch(x)
Zbyszek 5:155d224d855c 418 }//for(char x = 0; x <= 5; x++)
Zbyszek 5:155d224d855c 419
Zbyszek 5:155d224d855c 420 //Take-Running-Averages------------------------------------------------------------------------
Zbyszek 5:155d224d855c 421 //Raw accel averages
Zbyszek 5:155d224d855c 422 accelRawAvg.x = accelRawAvg.x + ((accelRaw.x - accelRawAvg.x)/sampleCounter);
Zbyszek 5:155d224d855c 423 accelRawAvg.y = accelRawAvg.y + ((accelRaw.y - accelRawAvg.y)/sampleCounter);
Zbyszek 5:155d224d855c 424 accelRawAvg.z = accelRawAvg.z + ((accelRaw.z - accelRawAvg.z)/sampleCounter);
Zbyszek 5:155d224d855c 425
Zbyszek 5:155d224d855c 426 //SSF accel averages
Zbyszek 5:155d224d855c 427 accelGAvg.x = accelGAvg.x + ((accelG.x - accelGAvg.x)/sampleCounter);
Zbyszek 5:155d224d855c 428 accelGAvg.y = accelGAvg.y + ((accelG.y - accelGAvg.y)/sampleCounter);
Zbyszek 5:155d224d855c 429 accelGAvg.z = accelGAvg.z + ((accelG.z - accelGAvg.z)/sampleCounter);
Zbyszek 5:155d224d855c 430
Zbyszek 5:155d224d855c 431 //Raw gyroo averages
Zbyszek 5:155d224d855c 432 gyroRawAvg.x = gyroRawAvg.x + ((gyroRaw.x - gyroRawAvg.x)/sampleCounter);
Zbyszek 5:155d224d855c 433 gyroRawAvg.y = gyroRawAvg.y + ((gyroRaw.y - gyroRawAvg.y)/sampleCounter);
Zbyszek 5:155d224d855c 434 gyroRawAvg.z = gyroRawAvg.z + ((gyroRaw.z - gyroRawAvg.z)/sampleCounter);
Zbyszek 5:155d224d855c 435
Zbyszek 5:155d224d855c 436 //SSF gyro averages
Zbyszek 5:155d224d855c 437 gyroDPSAvg.x = gyroDPSAvg.x + ((gyroDPS.x - gyroDPSAvg.x)/sampleCounter);
Zbyszek 5:155d224d855c 438 gyroDPSAvg.y = gyroDPSAvg.y + ((gyroDPS.y - gyroDPSAvg.y)/sampleCounter);
Zbyszek 5:155d224d855c 439 gyroDPSAvg.z = gyroDPSAvg.z + ((gyroDPS.z - gyroDPSAvg.z)/sampleCounter);
Zbyszek 5:155d224d855c 440 //Take-Running-Averages------------------------------------------------------------------------
Zbyszek 4:e36c7042d3bb 441
Zbyszek 5:155d224d855c 442 //Print Messages-------------------------------------------------------------------------------
Zbyszek 5:155d224d855c 443 if(sampleCounter == 1) {
Zbyszek 5:155d224d855c 444 pc.printf("Collecting Raw and Sensitivity Scale Factor multiplied Gyroscope and Accelerometer Offsets...\n\r");
Zbyszek 5:155d224d855c 445 };
Zbyszek 5:155d224d855c 446
Zbyszek 5:155d224d855c 447
Zbyszek 5:155d224d855c 448 if(sampleCounter == 5000) {
Zbyszek 5:155d224d855c 449 pc.printf("RawAX RawAY RawAZ RawGX RawGY RawGZ SampleN\n\r");
Zbyszek 5:155d224d855c 450 pc.printf("%+-6.2f %+-6.2f %+-6.2f %+-6.2f %+-6.2f %+-6.2f %-10d\n\r", accelRawAvg.x, accelRawAvg.y, accelRawAvg.z, gyroRawAvg.x, gyroRawAvg.y, gyroRawAvg.z, sampleCounter);
Zbyszek 5:155d224d855c 451 pc.printf("\n\r");
Zbyszek 5:155d224d855c 452 pc.printf("\n\r");
Zbyszek 5:155d224d855c 453 pc.printf("\n\r");
Zbyszek 5:155d224d855c 454
Zbyszek 5:155d224d855c 455 //Add the sensitivity scale factor multiplied data
Zbyszek 5:155d224d855c 456 pc.printf("SSFAX SSFAY SSFAZ SSFGX SSFGY SSFGZ SampleN\n\r");
Zbyszek 5:155d224d855c 457 pc.printf("%+-6.2f %+-6.2f %+-6.2f %+-6.2f %+-6.2f %+-6.2f %-10d\n\r", accelGAvg.x, accelGAvg.y, accelGAvg.z, gyroDPSAvg.x, gyroDPSAvg.y, gyroDPSAvg.z, sampleCounter);
Zbyszek 5:155d224d855c 458
Zbyszek 5:155d224d855c 459 };
Zbyszek 5:155d224d855c 460 sampleCounter++;
Zbyszek 5:155d224d855c 461 //Print Messages-------------------------------------------------------------------------------
Zbyszek 5:155d224d855c 462 }
Zbyszek 4:e36c7042d3bb 463
Zbyszek 4:e36c7042d3bb 464
Zbyszek 4:e36c7042d3bb 465
Zbyszek 4:e36c7042d3bb 466
Zbyszek 4:e36c7042d3bb 467
Zbyszek 4:e36c7042d3bb 468
Zbyszek 4:e36c7042d3bb 469
Zbyszek 4:e36c7042d3bb 470
Zbyszek 4:e36c7042d3bb 471 //------------------------------------------Artifacts----------------------------------------
Zbyszek 4:e36c7042d3bb 472
Zbyszek 4:e36c7042d3bb 473 //----------------------Insert Whole---------------------------------------------------
Zbyszek 4:e36c7042d3bb 474 //Rotate the accel data Global reference frame by qvq*---------------------------------
Zbyszek 4:e36c7042d3bb 475 //globalAccel = rotateGlobal(AccelVals, gyroQ);
Zbyszek 4:e36c7042d3bb 476 //Rotate the accel data Global reference frame by qvq*---------------------------------
Zbyszek 4:e36c7042d3bb 477
Zbyszek 4:e36c7042d3bb 478 //get the correction values and rotate back to IMU reference---------------------------
Zbyszek 4:e36c7042d3bb 479 // correctionGlobalAccel = crossProduct(globalAccel, vertical);
Zbyszek 4:e36c7042d3bb 480 // correctionBodyAccel = rotateLocal(correctionGlobalAccel, gyroQ);
Zbyszek 4:e36c7042d3bb 481 //get the correction values and rotate back to IMU reference---------------------------
Zbyszek 4:e36c7042d3bb 482
Zbyszek 4:e36c7042d3bb 483 //Add the correction to gyro readings and update the quaternion------------------------
Zbyszek 4:e36c7042d3bb 484 //GyroVals = sumVector(GyroVals, correctionBodyAccel);
Zbyszek 4:e36c7042d3bb 485 //incRot = toQuaternionNotation123(GyroVals, dTime);
Zbyszek 4:e36c7042d3bb 486 //gyroQ = getQuaternionProduct(gyroQ, incRot);
Zbyszek 4:e36c7042d3bb 487 //gyroQ = normaliseQuaternion(gyroQ);
Zbyszek 4:e36c7042d3bb 488 //----------------------Insert Whole---------------------------------------------------
Zbyszek 4:e36c7042d3bb 489
Zbyszek 4:e36c7042d3bb 490 //------------------------------------------Artifacts----------------------------------------