
SPI slave program to enable communication between the FPGA and the STM32L432 board.
main.cpp@4:e36c7042d3bb, 2019-02-23 (annotated)
- Committer:
- Zbyszek
- Date:
- Sat Feb 23 01:20:08 2019 +0000
- Revision:
- 4:e36c7042d3bb
- Parent:
- 3:e33697420c4a
- Child:
- 5:155d224d855c
-Added quaternion integration; -added accel based angle calculations
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Zbyszek | 0:8e367d6d8f03 | 1 | #include "mbed.h" |
Zbyszek | 0:8e367d6d8f03 | 2 | #include "SPI.h" |
Zbyszek | 4:e36c7042d3bb | 3 | #include "Quaternions.h" |
Zbyszek | 0:8e367d6d8f03 | 4 | DigitalOut myled(LED1); |
Zbyszek | 0:8e367d6d8f03 | 5 | Serial pc(USBTX, USBRX); |
Zbyszek | 0:8e367d6d8f03 | 6 | |
Zbyszek | 0:8e367d6d8f03 | 7 | int masterRx = 0; |
Zbyszek | 3:e33697420c4a | 8 | int16_t slaveRx = 0; |
Zbyszek | 3:e33697420c4a | 9 | int i = 2; |
Zbyszek | 3:e33697420c4a | 10 | int k = 0; |
Zbyszek | 3:e33697420c4a | 11 | int16_t zgHigher = 0; |
Zbyszek | 3:e33697420c4a | 12 | int16_t zgLower = 0; |
Zbyszek | 3:e33697420c4a | 13 | int16_t zGyro = 0; |
Zbyszek | 3:e33697420c4a | 14 | int countx = 0; |
Zbyszek | 3:e33697420c4a | 15 | int p = 32776; |
Zbyszek | 3:e33697420c4a | 16 | |
Zbyszek | 4:e36c7042d3bb | 17 | Timer t; |
Zbyszek | 4:e36c7042d3bb | 18 | float dTime = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 19 | |
Zbyszek | 4:e36c7042d3bb | 20 | vector vertical; |
Zbyszek | 4:e36c7042d3bb | 21 | vector globalAccel; |
Zbyszek | 4:e36c7042d3bb | 22 | vector correctionGlobalAccel; |
Zbyszek | 4:e36c7042d3bb | 23 | vector correctionBodyAccel; |
Zbyszek | 4:e36c7042d3bb | 24 | Quaternion gyroQ; |
Zbyszek | 4:e36c7042d3bb | 25 | vector Eangles; |
Zbyszek | 4:e36c7042d3bb | 26 | |
Zbyszek | 4:e36c7042d3bb | 27 | |
Zbyszek | 4:e36c7042d3bb | 28 | float xx; |
Zbyszek | 4:e36c7042d3bb | 29 | float yy; |
Zbyszek | 4:e36c7042d3bb | 30 | float zz; |
Zbyszek | 4:e36c7042d3bb | 31 | |
Zbyszek | 4:e36c7042d3bb | 32 | |
Zbyszek | 3:e33697420c4a | 33 | |
Zbyszek | 3:e33697420c4a | 34 | /* |
Zbyszek | 3:e33697420c4a | 35 | |
Zbyszek | 3:e33697420c4a | 36 | */ |
Zbyszek | 3:e33697420c4a | 37 | //------------------Printing-All-values----------------------// |
Zbyszek | 3:e33697420c4a | 38 | int16_t IMUarray[12]; //Store each separate reading in an array |
Zbyszek | 3:e33697420c4a | 39 | uint16_t IDarray[12]; //Holds the identification of each data piece |
Zbyszek | 3:e33697420c4a | 40 | char idx = 0; //IMUarray Pointer |
Zbyszek | 3:e33697420c4a | 41 | char dataCount = 0; //Keeps track of how many data points have been read in using SPI |
Zbyszek | 3:e33697420c4a | 42 | uint16_t id = 0; //Used to store extracted data ID |
Zbyszek | 3:e33697420c4a | 43 | |
Zbyszek | 3:e33697420c4a | 44 | void ProcessAndPrint(); |
Zbyszek | 3:e33697420c4a | 45 | //------------------Printing-All-values----------------------// |
Zbyszek | 3:e33697420c4a | 46 | |
Zbyszek | 4:e36c7042d3bb | 47 | //-------------Testing-Variables-Remove-Later----------------// |
Zbyszek | 4:e36c7042d3bb | 48 | int blinkCounter = 0; |
Zbyszek | 4:e36c7042d3bb | 49 | //-------------Testing-Variables-Remove-Later----------------// |
Zbyszek | 0:8e367d6d8f03 | 50 | |
Zbyszek | 0:8e367d6d8f03 | 51 | int main() { |
Zbyszek | 4:e36c7042d3bb | 52 | pc.baud (115200); |
Zbyszek | 3:e33697420c4a | 53 | IDarray[0] = 1; |
Zbyszek | 3:e33697420c4a | 54 | IDarray[1] = 0; |
Zbyszek | 3:e33697420c4a | 55 | IDarray[2] = 9; |
Zbyszek | 3:e33697420c4a | 56 | IDarray[3] = 8; |
Zbyszek | 3:e33697420c4a | 57 | IDarray[4] = 17; |
Zbyszek | 3:e33697420c4a | 58 | IDarray[5] = 16; |
Zbyszek | 3:e33697420c4a | 59 | IDarray[6] = 3; |
Zbyszek | 4:e36c7042d3bb | 60 | IDarray[7] = 2; //2 |
Zbyszek | 3:e33697420c4a | 61 | IDarray[8] = 11; |
Zbyszek | 3:e33697420c4a | 62 | IDarray[9] = 10; |
Zbyszek | 3:e33697420c4a | 63 | IDarray[10] = 19; |
Zbyszek | 3:e33697420c4a | 64 | IDarray[11] = 18; |
Zbyszek | 3:e33697420c4a | 65 | |
Zbyszek | 4:e36c7042d3bb | 66 | init_spi1(); |
Zbyszek | 4:e36c7042d3bb | 67 | t.start(); |
Zbyszek | 3:e33697420c4a | 68 | |
Zbyszek | 4:e36c7042d3bb | 69 | gyroQ.w = 1; |
Zbyszek | 4:e36c7042d3bb | 70 | gyroQ.x = 0.0001; |
Zbyszek | 4:e36c7042d3bb | 71 | gyroQ.y = 0.0001; |
Zbyszek | 4:e36c7042d3bb | 72 | gyroQ.z = 0.0001; |
Zbyszek | 4:e36c7042d3bb | 73 | |
Zbyszek | 4:e36c7042d3bb | 74 | |
Zbyszek | 4:e36c7042d3bb | 75 | |
Zbyszek | 4:e36c7042d3bb | 76 | gyroQ = normaliseQuaternion(gyroQ); |
Zbyszek | 4:e36c7042d3bb | 77 | |
Zbyszek | 4:e36c7042d3bb | 78 | vertical.x = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 79 | vertical.y = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 80 | vertical.z = 1.0f; |
Zbyszek | 4:e36c7042d3bb | 81 | |
Zbyszek | 3:e33697420c4a | 82 | pc.printf("Begin \n\r"); |
Zbyszek | 0:8e367d6d8f03 | 83 | |
Zbyszek | 0:8e367d6d8f03 | 84 | while(1) { |
Zbyszek | 3:e33697420c4a | 85 | if(i == 1) { |
Zbyszek | 0:8e367d6d8f03 | 86 | for(int x = 1; x < 128; x *= 2) { |
Zbyszek | 0:8e367d6d8f03 | 87 | slaveRx = transfer_spi_slave(x); |
Zbyszek | 3:e33697420c4a | 88 | //pc.putc(slaveRx); |
Zbyszek | 3:e33697420c4a | 89 | pc.printf("%d \n\r",slaveRx); |
Zbyszek | 0:8e367d6d8f03 | 90 | } |
Zbyszek | 0:8e367d6d8f03 | 91 | for(int x = 128; x > 1; x /= 2) { |
Zbyszek | 0:8e367d6d8f03 | 92 | slaveRx = transfer_spi_slave(x); |
Zbyszek | 3:e33697420c4a | 93 | //pc.putc(slaveRx); |
Zbyszek | 3:e33697420c4a | 94 | pc.printf("%d \n\r",slaveRx); |
Zbyszek | 2:4cc880ea466d | 95 | } |
Zbyszek | 3:e33697420c4a | 96 | }//if(i == 1) |
Zbyszek | 3:e33697420c4a | 97 | |
Zbyszek | 3:e33697420c4a | 98 | |
Zbyszek | 3:e33697420c4a | 99 | |
Zbyszek | 3:e33697420c4a | 100 | //------------------------------------------------------------------------------ |
Zbyszek | 3:e33697420c4a | 101 | if(i == 0) { |
Zbyszek | 3:e33697420c4a | 102 | slaveRx = transfer_spi_slave(10); |
Zbyszek | 3:e33697420c4a | 103 | countx++; |
Zbyszek | 3:e33697420c4a | 104 | if(countx == 1) { |
Zbyszek | 3:e33697420c4a | 105 | k = slaveRx; |
Zbyszek | 3:e33697420c4a | 106 | k &= ~(255 << 8); |
Zbyszek | 3:e33697420c4a | 107 | k = k << 8; |
Zbyszek | 3:e33697420c4a | 108 | // if(k == 19) { |
Zbyszek | 3:e33697420c4a | 109 | zgHigher = k; |
Zbyszek | 3:e33697420c4a | 110 | //zgHigher = zgHigher << 8; |
Zbyszek | 3:e33697420c4a | 111 | //}//if(k == 19) |
Zbyszek | 3:e33697420c4a | 112 | }//if(count == 11) |
Zbyszek | 3:e33697420c4a | 113 | |
Zbyszek | 3:e33697420c4a | 114 | |
Zbyszek | 3:e33697420c4a | 115 | else if(countx == 2) { |
Zbyszek | 3:e33697420c4a | 116 | k = slaveRx; |
Zbyszek | 3:e33697420c4a | 117 | k &= ~(255 << 8); |
Zbyszek | 3:e33697420c4a | 118 | //k = k << 8; |
Zbyszek | 3:e33697420c4a | 119 | //if(k == 18) { |
Zbyszek | 3:e33697420c4a | 120 | zgLower = k; |
Zbyszek | 3:e33697420c4a | 121 | //zgLower = zgLower << 8; |
Zbyszek | 3:e33697420c4a | 122 | zGyro = zgHigher + zgLower; |
Zbyszek | 3:e33697420c4a | 123 | pc.printf("%+d \n\r",zGyro); |
Zbyszek | 3:e33697420c4a | 124 | //}//if(k == 19) |
Zbyszek | 3:e33697420c4a | 125 | countx = 0; |
Zbyszek | 3:e33697420c4a | 126 | }//else if(count == 12) |
Zbyszek | 3:e33697420c4a | 127 | |
Zbyszek | 3:e33697420c4a | 128 | }//if(i == 0) |
Zbyszek | 3:e33697420c4a | 129 | //------------------------------------------------------------------------------ |
Zbyszek | 3:e33697420c4a | 130 | |
Zbyszek | 3:e33697420c4a | 131 | if(i == 2) { |
Zbyszek | 4:e36c7042d3bb | 132 | slaveRx = transfer_spi_slave(10); //get IMU data |
Zbyszek | 4:e36c7042d3bb | 133 | |
Zbyszek | 4:e36c7042d3bb | 134 | |
Zbyszek | 4:e36c7042d3bb | 135 | id = slaveRx; //Save sample to id for id extraction |
Zbyszek | 4:e36c7042d3bb | 136 | id &= ~(255); //get rid of the actual data to only be left with the id |
Zbyszek | 4:e36c7042d3bb | 137 | id = id >> 8; //shift the id to the right for comparison |
Zbyszek | 4:e36c7042d3bb | 138 | |
Zbyszek | 4:e36c7042d3bb | 139 | //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 | 140 | |
Zbyszek | 4:e36c7042d3bb | 141 | if(IDarray[dataCount] == id) { //compare if the order of data is right and if not wait until it is. |
Zbyszek | 4:e36c7042d3bb | 142 | dataCount++; //Increase dataCount as new value has been read in. |
Zbyszek | 4:e36c7042d3bb | 143 | IMUarray[idx] = slaveRx; //save the newly read value to current free space in the array |
Zbyszek | 4:e36c7042d3bb | 144 | idx++; //increment the pointer to point to next free space in the array |
Zbyszek | 3:e33697420c4a | 145 | |
Zbyszek | 3:e33697420c4a | 146 | if(dataCount == 12) { |
Zbyszek | 3:e33697420c4a | 147 | //reset idx and dataCount |
Zbyszek | 3:e33697420c4a | 148 | dataCount = 0; |
Zbyszek | 3:e33697420c4a | 149 | idx = 0; |
Zbyszek | 4:e36c7042d3bb | 150 | ProcessAndPrint(); |
Zbyszek | 4:e36c7042d3bb | 151 | |
Zbyszek | 4:e36c7042d3bb | 152 | t.stop(); |
Zbyszek | 4:e36c7042d3bb | 153 | dTime = t.read(); |
Zbyszek | 4:e36c7042d3bb | 154 | t.reset(); |
Zbyszek | 4:e36c7042d3bb | 155 | t.start(); |
Zbyszek | 3:e33697420c4a | 156 | }//if(dataCount == 12) |
Zbyszek | 3:e33697420c4a | 157 | }//if(IDarray[dataCount] == id) |
Zbyszek | 4:e36c7042d3bb | 158 | else { |
Zbyszek | 4:e36c7042d3bb | 159 | //-----Code-Used-For-Testing-----// |
Zbyszek | 4:e36c7042d3bb | 160 | //pc.printf("Failed at: %d \n\r", dataCount); //Print an error if there is one |
Zbyszek | 4:e36c7042d3bb | 161 | if(blinkCounter == 10) { //Slow the blinking down to make it visible if there are errors |
Zbyszek | 4:e36c7042d3bb | 162 | myled = !myled; //Change state of the LED if error occurs |
Zbyszek | 4:e36c7042d3bb | 163 | blinkCounter = 0; //Reset Blink counter |
Zbyszek | 4:e36c7042d3bb | 164 | } |
Zbyszek | 4:e36c7042d3bb | 165 | else { |
Zbyszek | 4:e36c7042d3bb | 166 | blinkCounter++; |
Zbyszek | 4:e36c7042d3bb | 167 | } |
Zbyszek | 4:e36c7042d3bb | 168 | //-----Code-Used-For-Testing-----// |
Zbyszek | 4:e36c7042d3bb | 169 | |
Zbyszek | 4:e36c7042d3bb | 170 | dataCount = 0; //ID sequence is worng so reset the counter |
Zbyszek | 4:e36c7042d3bb | 171 | idx = 0; //ID sequence is worng so reset the counter |
Zbyszek | 4:e36c7042d3bb | 172 | } |
Zbyszek | 3:e33697420c4a | 173 | }//if(i == 2) |
Zbyszek | 3:e33697420c4a | 174 | |
Zbyszek | 3:e33697420c4a | 175 | |
Zbyszek | 3:e33697420c4a | 176 | |
Zbyszek | 0:8e367d6d8f03 | 177 | } |
Zbyszek | 0:8e367d6d8f03 | 178 | } |
Zbyszek | 3:e33697420c4a | 179 | |
Zbyszek | 3:e33697420c4a | 180 | |
Zbyszek | 3:e33697420c4a | 181 | |
Zbyszek | 4:e36c7042d3bb | 182 | |
Zbyszek | 4:e36c7042d3bb | 183 | /* |
Zbyszek | 4:e36c7042d3bb | 184 | -The purpose of this function |
Zbyszek | 4:e36c7042d3bb | 185 | */ |
Zbyszek | 3:e33697420c4a | 186 | void ProcessAndPrint() { |
Zbyszek | 3:e33697420c4a | 187 | int16_t MSB = 0; //Store Most Significant Byte of data piece in this variable for processing |
Zbyszek | 3:e33697420c4a | 188 | int16_t LSB = 0; //Store Least Significant Byte of data piece in this variable for processing |
Zbyszek | 3:e33697420c4a | 189 | char arrPointer = 0; //Array Pointer |
Zbyszek | 4:e36c7042d3bb | 190 | |
Zbyszek | 4:e36c7042d3bb | 191 | vector GyroVals; |
Zbyszek | 4:e36c7042d3bb | 192 | vector AccelVals; |
Zbyszek | 4:e36c7042d3bb | 193 | vector accelTilt; |
Zbyszek | 4:e36c7042d3bb | 194 | Quaternion incRot; |
Zbyszek | 3:e33697420c4a | 195 | //-----------Concatentated-Data-Pieces------------------------------------------ |
Zbyszek | 3:e33697420c4a | 196 | int16_t gyroX = 0; |
Zbyszek | 3:e33697420c4a | 197 | int16_t gyroY = 0; |
Zbyszek | 3:e33697420c4a | 198 | int16_t gyroZ = 0; |
Zbyszek | 3:e33697420c4a | 199 | |
Zbyszek | 3:e33697420c4a | 200 | int16_t accelX = 0; |
Zbyszek | 3:e33697420c4a | 201 | int16_t accelY = 0; |
Zbyszek | 3:e33697420c4a | 202 | int16_t accelZ = 0; |
Zbyszek | 4:e36c7042d3bb | 203 | |
Zbyszek | 4:e36c7042d3bb | 204 | float faccelX = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 205 | float faccelY = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 206 | float faccelZ = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 207 | |
Zbyszek | 4:e36c7042d3bb | 208 | float fgyroX = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 209 | float fgyroY = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 210 | float fgyroZ = 0.0f; |
Zbyszek | 4:e36c7042d3bb | 211 | |
Zbyszek | 3:e33697420c4a | 212 | //-----------Concatentated-Data-Pieces------------------------------------------ |
Zbyszek | 3:e33697420c4a | 213 | for(char x = 0; x <= 5; x++) { |
Zbyszek | 4:e36c7042d3bb | 214 | MSB = IMUarray[arrPointer]; //Odd data pieces are MSBs |
Zbyszek | 4:e36c7042d3bb | 215 | MSB &= ~(255<<8); //Mask the MSB bits as they are not part of data |
Zbyszek | 4:e36c7042d3bb | 216 | MSB = MSB << 8; //Shift the Value as its the MSB of the data piece |
Zbyszek | 4:e36c7042d3bb | 217 | arrPointer++; //Increment array pointer |
Zbyszek | 4:e36c7042d3bb | 218 | LSB = IMUarray[arrPointer]; //Even data pieces are LSBs |
Zbyszek | 4:e36c7042d3bb | 219 | LSB &= ~(255 << 8); //Mask the MSB bits as they are not part of data |
Zbyszek | 4:e36c7042d3bb | 220 | arrPointer++; //Increment array pointer |
Zbyszek | 3:e33697420c4a | 221 | |
Zbyszek | 3:e33697420c4a | 222 | switch(x) { |
Zbyszek | 3:e33697420c4a | 223 | case 0: |
Zbyszek | 4:e36c7042d3bb | 224 | accelX = MSB + LSB; //Combine Accelerometer x-axis data |
Zbyszek | 4:e36c7042d3bb | 225 | faccelX = (float)accelX * 0.00006103515625f; //Multiply the acceleration by sensitivity scale factor to get it into g 1/16,384 |
Zbyszek | 3:e33697420c4a | 226 | break; |
Zbyszek | 3:e33697420c4a | 227 | case 1: |
Zbyszek | 4:e36c7042d3bb | 228 | accelY = MSB + LSB; //Combine Accelerometer y-axis data |
Zbyszek | 4:e36c7042d3bb | 229 | faccelY = (float)accelY * 0.00006103515625f; //Multiply the acceleration by sensitivity scale factor to get it into g 1/16,384 |
Zbyszek | 3:e33697420c4a | 230 | break; |
Zbyszek | 3:e33697420c4a | 231 | case 2: |
Zbyszek | 4:e36c7042d3bb | 232 | accelZ = MSB + LSB; //Combine Accelerometer z-axis data |
Zbyszek | 4:e36c7042d3bb | 233 | faccelZ = (float)accelZ * 0.00006103515625f; //Multiply the acceleration by sensitivity scale factor to get it into g 1/16,384 |
Zbyszek | 3:e33697420c4a | 234 | break; |
Zbyszek | 3:e33697420c4a | 235 | case 3: |
Zbyszek | 4:e36c7042d3bb | 236 | gyroX = MSB + LSB; //Combine Gyroscope x-axis data |
Zbyszek | 4:e36c7042d3bb | 237 | fgyroX = (float)gyroX * 0.06097560975609756097560975609756f; //Multiply the sample by sensitivity scale factor to get it into degress per second 1/16.4 |
Zbyszek | 4:e36c7042d3bb | 238 | |
Zbyszek | 3:e33697420c4a | 239 | break; |
Zbyszek | 3:e33697420c4a | 240 | case 4: |
Zbyszek | 4:e36c7042d3bb | 241 | gyroY = MSB + LSB; //Combine Gyroscope y-axis data |
Zbyszek | 4:e36c7042d3bb | 242 | fgyroY = (float)gyroY * 0.06097560975609756097560975609756f; //Multiply the sample by sensitivity scale factor to get it into degress per second 1/16.4 |
Zbyszek | 4:e36c7042d3bb | 243 | |
Zbyszek | 3:e33697420c4a | 244 | break; |
Zbyszek | 3:e33697420c4a | 245 | case 5: |
Zbyszek | 4:e36c7042d3bb | 246 | gyroZ = MSB + LSB; //Combine Gyroscope z-axis data |
Zbyszek | 4:e36c7042d3bb | 247 | fgyroZ = (float)gyroZ * 0.06097560975609756097560975609756f; //Multiply the sample by sensitivity scale factor to get it into degress per second 1/16.4 |
Zbyszek | 3:e33697420c4a | 248 | break; |
Zbyszek | 3:e33697420c4a | 249 | default: |
Zbyszek | 3:e33697420c4a | 250 | break; |
Zbyszek | 3:e33697420c4a | 251 | }//switch(x) |
Zbyszek | 3:e33697420c4a | 252 | }//for(char x = 0; x <= 5; x++) |
Zbyszek | 4:e36c7042d3bb | 253 | |
Zbyszek | 4:e36c7042d3bb | 254 | //Quaternion-Gyro-Integration-------------------------------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 255 | //Get the Gyro and Accel values-------------------------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 256 | //Convert these vales to radians per second and store them in the vector |
Zbyszek | 4:e36c7042d3bb | 257 | GyroVals.x = fgyroX * 0.0174533; |
Zbyszek | 4:e36c7042d3bb | 258 | GyroVals.y = fgyroY * 0.0174533; |
Zbyszek | 4:e36c7042d3bb | 259 | GyroVals.z = fgyroZ * 0.0174533; |
Zbyszek | 4:e36c7042d3bb | 260 | |
Zbyszek | 4:e36c7042d3bb | 261 | AccelVals.x = faccelX; |
Zbyszek | 4:e36c7042d3bb | 262 | AccelVals.y = faccelY; |
Zbyszek | 4:e36c7042d3bb | 263 | AccelVals.z = faccelZ; |
Zbyszek | 4:e36c7042d3bb | 264 | //Get the Gyro and Accel values-------------------------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 265 | |
Zbyszek | 4:e36c7042d3bb | 266 | gyroQ = updateQuaternion(gyroQ, GyroVals, dTime); |
Zbyszek | 4:e36c7042d3bb | 267 | gyroQ = normaliseQuaternion(gyroQ); |
Zbyszek | 4:e36c7042d3bb | 268 | Eangles = eulerA(gyroQ); |
Zbyszek | 4:e36c7042d3bb | 269 | //Quaternion-Gyro-Integration-------------------------------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 270 | |
Zbyszek | 4:e36c7042d3bb | 271 | |
Zbyszek | 4:e36c7042d3bb | 272 | //Angle-Calculations-Based-on-Accalerometer------------------------------------------------ |
Zbyszek | 4:e36c7042d3bb | 273 | //https://www.dfrobot.com/wiki/index.php/How_to_Use_a_Three-Axis_Accelerometer_for_Tilt_Sensing |
Zbyszek | 4:e36c7042d3bb | 274 | |
Zbyszek | 4:e36c7042d3bb | 275 | accelTilt.x = (atan2(AccelVals.y, AccelVals.z) * 57.29577951f); |
Zbyszek | 4:e36c7042d3bb | 276 | accelTilt.y = (atan2((-AccelVals.x), sqrt(pow(AccelVals.y, 2) + pow(AccelVals.z, 2) ))) * 57.29577951f); |
Zbyszek | 4:e36c7042d3bb | 277 | //Canntot calculate accel tilt for Z. Gyro date in combination with magnetometer have to be used to obtain reliable z-axis tilt. |
Zbyszek | 4:e36c7042d3bb | 278 | //Angle-Calculations-Based-on-Accalerometer------------------------------------------------ |
Zbyszek | 4:e36c7042d3bb | 279 | |
Zbyszek | 4:e36c7042d3bb | 280 | //Add the correction to gyro readings and update the quaternion------------------------ |
Zbyszek | 4:e36c7042d3bb | 281 | //pc.printf("%+6f, %+6f, %+6f %+6f\n\r ", xx, yy, zz, dTime); |
Zbyszek | 4:e36c7042d3bb | 282 | pc.printf("%+6f, %+6f, %+6f, %+6f, %+6f, %+6f, %+6f\n\r ", gyroQ.w, gyroQ.x, gyroQ.y, gyroQ.z, Eangles.x, Eangles.y, Eangles.z); |
Zbyszek | 4:e36c7042d3bb | 283 | //pc.printf("%+6f, %+6f, %+6f\n\r ",Eangles.x, Eangles.y, Eangles.z); |
Zbyszek | 4:e36c7042d3bb | 284 | //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 | 3:e33697420c4a | 285 | |
Zbyszek | 3:e33697420c4a | 286 | }//void ProcessAndPrint() |
Zbyszek | 3:e33697420c4a | 287 | |
Zbyszek | 4:e36c7042d3bb | 288 | |
Zbyszek | 4:e36c7042d3bb | 289 | |
Zbyszek | 4:e36c7042d3bb | 290 | |
Zbyszek | 4:e36c7042d3bb | 291 | |
Zbyszek | 4:e36c7042d3bb | 292 | |
Zbyszek | 4:e36c7042d3bb | 293 | |
Zbyszek | 4:e36c7042d3bb | 294 | |
Zbyszek | 4:e36c7042d3bb | 295 | |
Zbyszek | 4:e36c7042d3bb | 296 | |
Zbyszek | 4:e36c7042d3bb | 297 | |
Zbyszek | 4:e36c7042d3bb | 298 | |
Zbyszek | 4:e36c7042d3bb | 299 | |
Zbyszek | 4:e36c7042d3bb | 300 | //------------------------------------------Artifacts---------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 301 | |
Zbyszek | 4:e36c7042d3bb | 302 | //----------------------Insert Whole--------------------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 303 | //Rotate the accel data Global reference frame by qvq*--------------------------------- |
Zbyszek | 4:e36c7042d3bb | 304 | //globalAccel = rotateGlobal(AccelVals, gyroQ); |
Zbyszek | 4:e36c7042d3bb | 305 | //Rotate the accel data Global reference frame by qvq*--------------------------------- |
Zbyszek | 4:e36c7042d3bb | 306 | |
Zbyszek | 4:e36c7042d3bb | 307 | //get the correction values and rotate back to IMU reference--------------------------- |
Zbyszek | 4:e36c7042d3bb | 308 | // correctionGlobalAccel = crossProduct(globalAccel, vertical); |
Zbyszek | 4:e36c7042d3bb | 309 | // correctionBodyAccel = rotateLocal(correctionGlobalAccel, gyroQ); |
Zbyszek | 4:e36c7042d3bb | 310 | //get the correction values and rotate back to IMU reference--------------------------- |
Zbyszek | 4:e36c7042d3bb | 311 | |
Zbyszek | 4:e36c7042d3bb | 312 | //Add the correction to gyro readings and update the quaternion------------------------ |
Zbyszek | 4:e36c7042d3bb | 313 | //GyroVals = sumVector(GyroVals, correctionBodyAccel); |
Zbyszek | 4:e36c7042d3bb | 314 | //incRot = toQuaternionNotation123(GyroVals, dTime); |
Zbyszek | 4:e36c7042d3bb | 315 | //gyroQ = getQuaternionProduct(gyroQ, incRot); |
Zbyszek | 4:e36c7042d3bb | 316 | //gyroQ = normaliseQuaternion(gyroQ); |
Zbyszek | 4:e36c7042d3bb | 317 | //----------------------Insert Whole--------------------------------------------------- |
Zbyszek | 4:e36c7042d3bb | 318 | |
Zbyszek | 4:e36c7042d3bb | 319 | //------------------------------------------Artifacts---------------------------------------- |