Ian Hua / Quadcopter-mbedRTOS
Committer:
pHysiX
Date:
Mon May 19 14:16:47 2014 +0000
Revision:
50:8a0accb23007
Parent:
48:9dbdc4144f00
Child:
51:04c6af4319e1
Semaphores implemented, currently no hanging. Need to test flight

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pHysiX 27:18b6580eb0b1 1 /* File: Task2_Slave.cpp
pHysiX 22:ef8aa9728013 2 * Author: Trung Tin Ian HUA
pHysiX 22:ef8aa9728013 3 * Date: May 2014
pHysiX 36:d95e3d6f2fc4 4 * Purpose: Thread2S: Slave PID control loop (rate)
pHysiX 36:d95e3d6f2fc4 5 * Functions: Gyro sample
pHysiX 36:d95e3d6f2fc4 6 * Settings: 400Hz
pHysiX 30:d9b988f8d84f 7 * Timing: 290us
pHysiX 25:a7cfe421cb4a 8 */
pHysiX 26:4a3323ee36d5 9 #include "Task2_Slave.h"
pHysiX 1:43f8ac7ca6d7 10 #include "setup.h"
pHysiX 3:605fbcb54e75 11 #include "PID.h"
pHysiX 3:605fbcb54e75 12
pHysiX 50:8a0accb23007 13 Semaphore sem_Task2_Slave(1);
pHysiX 50:8a0accb23007 14
pHysiX 21:b642c18eccd1 15 /* YPR Adjust */
pHysiX 21:b642c18eccd1 16 volatile float adjust[3] = {0.0, 0.0, 0.0};
pHysiX 21:b642c18eccd1 17
pHysiX 3:605fbcb54e75 18 int16_t gx, gy, gz;
pHysiX 10:ef5fe86f67fe 19 volatile int gyro[3] = {0, 0, 0};
pHysiX 10:ef5fe86f67fe 20
pHysiX 10:ef5fe86f67fe 21 bool counterESC = false;
pHysiX 1:43f8ac7ca6d7 22
pHysiX 34:228d87c45151 23
pHysiX 34:228d87c45151 24
pHysiX 34:228d87c45151 25 // ===============================
pHysiX 34:228d87c45151 26 // === GYRO SAMPLE & SLAVE PID ===
pHysiX 34:228d87c45151 27 // ===============================
pHysiX 27:18b6580eb0b1 28 void Task2_Slave(void const *argument)
pHysiX 1:43f8ac7ca6d7 29 {
pHysiX 50:8a0accb23007 30 while (1) {
pHysiX 50:8a0accb23007 31 sem_Task2_Slave.wait();
pHysiX 50:8a0accb23007 32 gyroSample();
pHysiX 17:18c3bd016e49 33
pHysiX 50:8a0accb23007 34 if (armed) {
pHysiX 50:8a0accb23007 35 yawPIDrate.setSetPoint(inputYPR[0]);
pHysiX 25:a7cfe421cb4a 36
pHysiX 50:8a0accb23007 37 switch (mode) {
pHysiX 50:8a0accb23007 38 case RATE:
pHysiX 50:8a0accb23007 39 pitchPIDrate.setSetPoint(inputYPR[1]);
pHysiX 50:8a0accb23007 40 rollPIDrate.setSetPoint(inputYPR[2]);
pHysiX 17:18c3bd016e49 41
pHysiX 50:8a0accb23007 42 yawPIDrate.setProcessValue(gyro[2]);
pHysiX 50:8a0accb23007 43 pitchPIDrate.setProcessValue(gyro[1]);
pHysiX 50:8a0accb23007 44 rollPIDrate.setProcessValue(gyro[0]);
pHysiX 30:d9b988f8d84f 45
pHysiX 50:8a0accb23007 46 adjust[0] = yawPIDrate.compute();
pHysiX 50:8a0accb23007 47 adjust[1] = pitchPIDrate.compute();
pHysiX 50:8a0accb23007 48 adjust[2] = rollPIDrate.compute();
pHysiX 25:a7cfe421cb4a 49
pHysiX 50:8a0accb23007 50 counterESC = true;
pHysiX 50:8a0accb23007 51 break;
pHysiX 25:a7cfe421cb4a 52
pHysiX 50:8a0accb23007 53 case ATTITUDE:
pHysiX 50:8a0accb23007 54 default:
pHysiX 50:8a0accb23007 55 pitchPIDrate.setSetPoint(adjust_attitude[1]);
pHysiX 50:8a0accb23007 56 rollPIDrate.setSetPoint(adjust_attitude[2]);
pHysiX 5:4879ef0e6d41 57
pHysiX 50:8a0accb23007 58 yawPIDrate.setProcessValue(gyro[2]);
pHysiX 50:8a0accb23007 59 pitchPIDrate.setProcessValue(gyro[1]);
pHysiX 50:8a0accb23007 60 rollPIDrate.setProcessValue(gyro[0]);
pHysiX 5:4879ef0e6d41 61
pHysiX 50:8a0accb23007 62 adjust[0] = yawPIDrate.compute();
pHysiX 50:8a0accb23007 63 adjust[1] = pitchPIDrate.compute();
pHysiX 50:8a0accb23007 64 adjust[2] = rollPIDrate.compute();
pHysiX 21:b642c18eccd1 65
pHysiX 50:8a0accb23007 66 counterESC = true;
pHysiX 50:8a0accb23007 67 break;
pHysiX 50:8a0accb23007 68 }
pHysiX 50:8a0accb23007 69 //sem_Task4.release();
pHysiX 30:d9b988f8d84f 70 }
pHysiX 25:a7cfe421cb4a 71 }
pHysiX 21:b642c18eccd1 72 }
pHysiX 33:f88a6ee18103 73
pHysiX 36:d95e3d6f2fc4 74
pHysiX 36:d95e3d6f2fc4 75
pHysiX 36:d95e3d6f2fc4 76
pHysiX 34:228d87c45151 77 // ************************
pHysiX 34:228d87c45151 78 // *** Helper functions ***
pHysiX 34:228d87c45151 79 // ************************
pHysiX 50:8a0accb23007 80 void Task2_Slave_ISR(void const *argument)
pHysiX 50:8a0accb23007 81 {
pHysiX 50:8a0accb23007 82 sem_Task2_Slave.release();
pHysiX 50:8a0accb23007 83 }
pHysiX 50:8a0accb23007 84
pHysiX 36:d95e3d6f2fc4 85 void gyroSample(void)
pHysiX 36:d95e3d6f2fc4 86 {
pHysiX 48:9dbdc4144f00 87 imu_nb.getRotation(&gx, &gy, &gz);
pHysiX 36:d95e3d6f2fc4 88 gyro[0] = gx + 60;
pHysiX 36:d95e3d6f2fc4 89 gyro[1] = gy - 15;
pHysiX 38:ef65533cca32 90 gyro[2] = gz - 8;
pHysiX 36:d95e3d6f2fc4 91
pHysiX 36:d95e3d6f2fc4 92 for (int i = 0; i < 3; i++)
pHysiX 36:d95e3d6f2fc4 93 gyro[i] /= (float) 32.8;
pHysiX 36:d95e3d6f2fc4 94 }