Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
RTOS-Threads/src/Task2_Master.cpp
- Committer:
- pHysiX
- Date:
- 2014-05-13
- Revision:
- 36:d95e3d6f2fc4
- Parent:
- 34:228d87c45151
- Child:
- 38:ef65533cca32
File content as of revision 36:d95e3d6f2fc4:
/* File: Task2_Master.cpp * Author: Trung Tin Ian HUA * Date: May 2014 * Purpose: Thread2M: Master PID control loop (attitude) * Functions: AHRSSample: Read MPU6050 DMP and calculate YPR * Settings: 200Hz * Timing: 40us */ #include "Task2_Slave.h" #include "setup.h" #include "PID.h" /* MPU6050 control/status variables: */ uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU uint16_t fifoCount; // count of all bytes currently in FIFO uint8_t fifoBuffer[64]; // FIFO storage buffer /* Orientation/motion variables: */ Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravity; // [x, y, z] gravity vector float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector float altitude, temperature; #ifndef M_PI #define M_PI 3.1415 #endif #ifdef ENABLE_COMPASS //int compassX, compassY, compassZ; double heading = 0; #endif /* YPR Adjust */ volatile float adjust_attitude[3] = {0.0, 0.0, 0.0}; // =============================== // === YPR SAMPLE & MASTER PID === // =============================== //Timer void Task2_Master(void const *argument) { //Timer AHRSSample(); if (armed) { switch (mode) { case RATE: break; case ATTITUDE: default: //Timer pitchPIDstable.setProcessValue((int) (ypr[1] - ypr_offset[1])); rollPIDstable.setProcessValue((int) (ypr[2] - ypr_offset[2])); pitchPIDstable.setSetPoint(inputYPR[1]); rollPIDstable.setSetPoint(inputYPR[2]); adjust_attitude[1] = pitchPIDstable.compute(); adjust_attitude[2] = rollPIDstable.compute(); adjust_attitude[2] *= -1; //counterTask2Master = true; //Timer break; } //Timer } } // ************************ // *** Helper functions *** // ************************ void AHRSSample(void) { //Timer // reset interrupt flag and get INT_STATUS byte mpuIntStatus = imu.getIntStatus(); // get current FIFO count fifoCount = imu.getFIFOCount(); //imu.debugSerial.printf("FIFO Count: %d\n", fifoCount); // check for overflow // Only keep a max of 2 packets in buffer. if ((mpuIntStatus & 0x10) || fifoCount > 84) { // reset so we can continue cleanly imu.resetFIFO(); imu.debugSerial.printf("FIFO overflow!"); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else if (mpuIntStatus & 0x02) { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = imu.getFIFOCount(); while (fifoCount > 41) { // read a packet from FIFO imu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is > 1 packet available // (this lets us immediately read more without waiting for an interrupt) fifoCount -= packetSize; } // display YPR angles in degrees imu.dmpGetQuaternion(&q, fifoBuffer); imu.dmpGetGravity(&gravity, &q); imu.dmpGetYawPitchRoll(ypr, &q, &gravity); ypr[0] = ypr[0] * 180/M_PI; ypr[1] = ypr[1] * 180/M_PI; ypr[2] = ypr[2] * 180/M_PI; /* if (compass.getDataReady()) { // compass.getValues(&compass_x, &compass_y, &compass_z); heading = compass.getHeadingXY() * 180/M_PI; } ypr[0] *= 0.98; ypr[0] += 0.02*heading; */ } //Timer }