Ian Hua / Quadcopter-mbedRTOS
Committer:
pHysiX
Date:
Mon May 12 04:43:38 2014 +0000
Revision:
30:d9b988f8d84f
Parent:
27:18b6580eb0b1
Child:
31:3dde2201e54d
WIP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pHysiX 22:ef8aa9728013 1 /* File: Task1.cpp
pHysiX 22:ef8aa9728013 2 * Author: Trung Tin Ian HUA
pHysiX 22:ef8aa9728013 3 * Date: May 2014
pHysiX 22:ef8aa9728013 4 * Purpose: Thread1: Code to read Yaw Pitch Roll angles from MPU6050 DMP.
pHysiX 22:ef8aa9728013 5 * Settings: 100Hz
pHysiX 30:d9b988f8d84f 6 * Timing: 1440us
pHysiX 22:ef8aa9728013 7 */
pHysiX 1:43f8ac7ca6d7 8 #include "Task1.h"
pHysiX 1:43f8ac7ca6d7 9 #include "setup.h"
pHysiX 1:43f8ac7ca6d7 10
pHysiX 2:ab967d7b4346 11 /* MPU6050 control/status variables: */
pHysiX 2:ab967d7b4346 12 uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
pHysiX 2:ab967d7b4346 13 uint16_t fifoCount; // count of all bytes currently in FIFO
pHysiX 21:b642c18eccd1 14 uint8_t fifoBuffer[64]; // FIFO storage buffer
pHysiX 1:43f8ac7ca6d7 15
pHysiX 2:ab967d7b4346 16 /* Orientation/motion variables: */
pHysiX 2:ab967d7b4346 17 Quaternion q; // [w, x, y, z] quaternion container
pHysiX 2:ab967d7b4346 18 VectorFloat gravity; // [x, y, z] gravity vector
pHysiX 2:ab967d7b4346 19 float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector
pHysiX 24:54a8cdf17378 20 float ypr_1[3];
pHysiX 22:ef8aa9728013 21
pHysiX 22:ef8aa9728013 22 float altitude, temperature;
pHysiX 22:ef8aa9728013 23 bool counterTask1 = false;
pHysiX 22:ef8aa9728013 24
pHysiX 22:ef8aa9728013 25 #ifndef M_PI
pHysiX 22:ef8aa9728013 26 #define M_PI 3.1415
pHysiX 22:ef8aa9728013 27 #endif
pHysiX 12:953d25061417 28
pHysiX 12:953d25061417 29 #ifdef ENABLE_COMPASS
pHysiX 12:953d25061417 30 //int compassX, compassY, compassZ;
pHysiX 12:953d25061417 31 double heading = 0;
pHysiX 12:953d25061417 32 #endif
pHysiX 12:953d25061417 33
pHysiX 30:d9b988f8d84f 34 #ifdef TIME_TASK1
pHysiX 30:d9b988f8d84f 35 Timer _t1;
pHysiX 30:d9b988f8d84f 36 #endif
pHysiX 1:43f8ac7ca6d7 37 // ================================================================
pHysiX 30:d9b988f8d84f 38 // === YPR THREAD ===
pHysiX 2:ab967d7b4346 39 // ================================================================
pHysiX 1:43f8ac7ca6d7 40 void Task1(void const *argument)
pHysiX 1:43f8ac7ca6d7 41 {
pHysiX 30:d9b988f8d84f 42 switch (box_demo) {
pHysiX 30:d9b988f8d84f 43 case true:
pHysiX 30:d9b988f8d84f 44 AHRSSample();
pHysiX 27:18b6580eb0b1 45
pHysiX 30:d9b988f8d84f 46 BT.printf("
pHysiX 30:d9b988f8d84f 47 break;
pHysiX 1:43f8ac7ca6d7 48
pHysiX 30:d9b988f8d84f 49 case false:
pHysiX 30:d9b988f8d84f 50 #ifdef TIME_TASK1
pHysiX 30:d9b988f8d84f 51 _t1.reset();
pHysiX 30:d9b988f8d84f 52 _t1.start();
pHysiX 30:d9b988f8d84f 53 #endif
pHysiX 30:d9b988f8d84f 54 if (armed) {
pHysiX 30:d9b988f8d84f 55 switch (mode) {
pHysiX 30:d9b988f8d84f 56 case RATE:
pHysiX 30:d9b988f8d84f 57 break;
pHysiX 12:953d25061417 58
pHysiX 30:d9b988f8d84f 59 case ATTITUDE:
pHysiX 30:d9b988f8d84f 60 default:
pHysiX 30:d9b988f8d84f 61 AHRSSample();
pHysiX 12:953d25061417 62
pHysiX 30:d9b988f8d84f 63 counterTask1 = true;
pHysiX 30:d9b988f8d84f 64 break;
pHysiX 30:d9b988f8d84f 65 }
pHysiX 27:18b6580eb0b1 66 }
pHysiX 1:43f8ac7ca6d7 67 }
pHysiX 2:ab967d7b4346 68 }
pHysiX 30:d9b988f8d84f 69
pHysiX 30:d9b988f8d84f 70 // ================================================================
pHysiX 30:d9b988f8d84f 71 // === Helper functions ===
pHysiX 30:d9b988f8d84f 72 // ================================================================
pHysiX 30:d9b988f8d84f 73
pHysiX 30:d9b988f8d84f 74 void AHRSSample(void)
pHysiX 30:d9b988f8d84f 75 {
pHysiX 30:d9b988f8d84f 76 // reset interrupt flag and get INT_STATUS byte
pHysiX 30:d9b988f8d84f 77 mpuIntStatus = imu.getIntStatus();
pHysiX 30:d9b988f8d84f 78
pHysiX 30:d9b988f8d84f 79 // get current FIFO count
pHysiX 30:d9b988f8d84f 80 fifoCount = imu.getFIFOCount();
pHysiX 30:d9b988f8d84f 81 //imu.debugSerial.printf("FIFO Count: %d\n", fifoCount);
pHysiX 30:d9b988f8d84f 82
pHysiX 30:d9b988f8d84f 83 // check for overflow
pHysiX 30:d9b988f8d84f 84 // Only keep a max of 2 packets in buffer.
pHysiX 30:d9b988f8d84f 85 if ((mpuIntStatus & 0x10) || fifoCount > 84) {
pHysiX 30:d9b988f8d84f 86 // reset so we can continue cleanly
pHysiX 30:d9b988f8d84f 87 imu.resetFIFO();
pHysiX 30:d9b988f8d84f 88 imu.debugSerial.printf("FIFO overflow!");
pHysiX 30:d9b988f8d84f 89
pHysiX 30:d9b988f8d84f 90 // otherwise, check for DMP data ready interrupt (this should happen frequently)
pHysiX 30:d9b988f8d84f 91 } else if (mpuIntStatus & 0x02) {
pHysiX 30:d9b988f8d84f 92 // wait for correct available data length, should be a VERY short wait
pHysiX 30:d9b988f8d84f 93 while (fifoCount < packetSize) fifoCount = imu.getFIFOCount();
pHysiX 30:d9b988f8d84f 94
pHysiX 30:d9b988f8d84f 95 while (fifoCount > 41) {
pHysiX 30:d9b988f8d84f 96 // read a packet from FIFO
pHysiX 30:d9b988f8d84f 97 imu.getFIFOBytes(fifoBuffer, packetSize);
pHysiX 30:d9b988f8d84f 98
pHysiX 30:d9b988f8d84f 99 // track FIFO count here in case there is > 1 packet available
pHysiX 30:d9b988f8d84f 100 // (this lets us immediately read more without waiting for an interrupt)
pHysiX 30:d9b988f8d84f 101 fifoCount -= packetSize;
pHysiX 30:d9b988f8d84f 102 }
pHysiX 30:d9b988f8d84f 103
pHysiX 30:d9b988f8d84f 104 // display YPR angles in degrees
pHysiX 30:d9b988f8d84f 105 imu.dmpGetQuaternion(&q, fifoBuffer);
pHysiX 30:d9b988f8d84f 106 imu.dmpGetGravity(&gravity, &q);
pHysiX 30:d9b988f8d84f 107 imu.dmpGetYawPitchRoll(ypr, &q, &gravity);
pHysiX 30:d9b988f8d84f 108
pHysiX 30:d9b988f8d84f 109 ypr[0] = ypr[0] * 180/M_PI;
pHysiX 30:d9b988f8d84f 110 ypr[1] = ypr[1] * 180/M_PI;
pHysiX 30:d9b988f8d84f 111 ypr[2] = ypr[2] * 180/M_PI;
pHysiX 30:d9b988f8d84f 112
pHysiX 30:d9b988f8d84f 113 /*
pHysiX 30:d9b988f8d84f 114 if (compass.getDataReady()) {
pHysiX 30:d9b988f8d84f 115 // compass.getValues(&compass_x, &compass_y, &compass_z);
pHysiX 30:d9b988f8d84f 116 heading = compass.getHeadingXY() * 180/M_PI;
pHysiX 30:d9b988f8d84f 117 }
pHysiX 30:d9b988f8d84f 118
pHysiX 30:d9b988f8d84f 119 ypr[0] *= 0.98;
pHysiX 30:d9b988f8d84f 120 ypr[0] += 0.02*heading;
pHysiX 30:d9b988f8d84f 121 */
pHysiX 30:d9b988f8d84f 122 }
pHysiX 30:d9b988f8d84f 123 }