Ian Hua / Quadcopter-mbedRTOS

RTOS-Threads/src/Task2_Slave.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_Slave.cpp
 * Author:      Trung Tin Ian HUA
 * Date:        May 2014
 * Purpose:     Thread2S: Slave PID control loop (rate)
 * Functions:   Gyro sample
 * Settings:    400Hz
 * Timing:      290us
 */
#include "Task2_Slave.h"
#include "setup.h"
#include "PID.h"

/* YPR Adjust */
volatile float adjust[3] = {0.0, 0.0, 0.0};

int16_t gx, gy, gz;
volatile int gyro[3] = {0, 0, 0};

bool counterESC = false;



// ===============================
// === GYRO SAMPLE & SLAVE PID ===
// ===============================
//Timer
void Task2_Slave(void const *argument)
{
//Timer
    gyroSample();

//Timer
    if (armed) {
        yawPIDrate.setSetPoint(inputYPR[0]);

        switch (mode) {
            case RATE:
                pitchPIDrate.setSetPoint(inputYPR[1]);
                rollPIDrate.setSetPoint(inputYPR[2]);

                yawPIDrate.setProcessValue(gyro[2]);
                pitchPIDrate.setProcessValue(gyro[1]);
                rollPIDrate.setProcessValue(gyro[0]);

                adjust[0] = yawPIDrate.compute();
                adjust[1] = pitchPIDrate.compute();
                adjust[2] = rollPIDrate.compute();

                counterESC = true;
                break;

            case ATTITUDE:
            default:
                pitchPIDrate.setSetPoint(adjust_attitude[1]);
                rollPIDrate.setSetPoint(adjust_attitude[2]);

                yawPIDrate.setProcessValue(gyro[2]);
                pitchPIDrate.setProcessValue(gyro[1]);
                rollPIDrate.setProcessValue(gyro[0]);

                adjust[0] = yawPIDrate.compute();
                adjust[1] = pitchPIDrate.compute();
                adjust[2] = rollPIDrate.compute();

                counterESC = true;
                break;
        }
//Timer
    }
//Timer
}




// ************************
// *** Helper functions ***
// ************************
void gyroSample(void)
{
    imu.getRotation(&gx, &gy, &gz);
    gyro[0] = gx + 60;
    gyro[1] = gy - 15;
    gyro[2] = gz + 25;

    for (int i = 0; i < 3; i++)
        gyro[i] /= (float) 32.8;
}