From c265553652444293f90189c7481fb7eb16f28115 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sat, 19 Nov 2011 19:01:00 +0100 Subject: Separated AHRS and telemetry code. --- ahrs.h | 25 +++++++++++++++++++++ main.cpp | 71 +++++++++-------------------------------------------------- telemetry.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++ telemetry.h | 8 +++++++ 4 files changed, 99 insertions(+), 60 deletions(-) create mode 100644 ahrs.h create mode 100644 telemetry.cpp create mode 100644 telemetry.h diff --git a/ahrs.h b/ahrs.h new file mode 100644 index 0000000..e78ae8d --- /dev/null +++ b/ahrs.h @@ -0,0 +1,25 @@ +#ifndef AHRS_H +#define AHRS_H + +#include "itg3200.h" +#include "bma150.h" + +class AHRS { + public: + ITG3200 gyro; + BMA150 accel; + + AHRS(I2C& i2c) : gyro(i2c), accel(i2c) {} + + void init() { + gyro.init(); + accel.init(); + } + + void update() { + gyro.update(); + accel.update(); + } +}; + +#endif diff --git a/main.cpp b/main.cpp index 635467b..c465f00 100644 --- a/main.cpp +++ b/main.cpp @@ -6,8 +6,8 @@ #include "ppmsum.h" #include "i2c.h" -#include "itg3200.h" -#include "bma150.h" +#include "ahrs.h" +#include "telemetry.h" #include "usart.h" #include "xbee.h" @@ -60,55 +60,10 @@ class PID { }; I2C i2c; -ITG3200 gyro(i2c); -BMA150 accel(i2c); +AHRS ahrs(i2c); -volatile uint16_t dmabuf[2]; volatile uint16_t motors[4]; -void threadmain() { - ADC1.CR2 = 0x9; - while(ADC1.CR2 & 0x8); - ADC1.CR2 = 0x5; - while(ADC1.CR2 & 0x4); - - DMA1.CH[0].CMAR = (uint32_t)&dmabuf; - DMA1.CH[0].CPAR = (uint32_t)&ADC1.DR; - DMA1.CH[0].CNDTR = 2; - DMA1.CH[0].CCR = 0x05a1; - - ADC1.SMPR2 = 0x003f000; - ADC1.SQR1 = 0x100000; - ADC1.SQR3 = 5 | (4 << 5); - ADC1.CR1 = 0x100; - ADC1.CR2 = 0x103; - ADC1.CR2 = 0x103; - - while(1) { - uint16_t buf[] = { - gyro.x, - gyro.y, - gyro.z, - accel.x, - accel.y, - accel.z, - motors[0], - motors[1], - motors[2], - motors[3], - dmabuf[0], - dmabuf[1], - }; - - xbee_send(1, sizeof(buf), (uint8_t*)buf); - Time::sleep(100); - } -} - -uint32_t thstack[1024]; - -Thread thread(thstack, sizeof(thstack), threadmain); - GPS gps; void gps_thread_main() { @@ -148,9 +103,7 @@ int main() { Time::sleep(200); i2c.enable(); - - gyro.init(); - accel.init(); + ahrs.init(); PPMSum ppmsum; ppmsum.enable(); @@ -171,7 +124,7 @@ int main() { usart_enable(); gps.enable(); - thread.start(); + telemetry_thread.start(); //gps_thread.start(); while(1) { @@ -181,23 +134,21 @@ int main() { } TIM2.SR = 0; - // Read sensors. - gyro.update(); - accel.update(); + // Update AHRS. + ahrs.update(); // Update filter. - - // Generate motor mix. int16_t throttle = ppmsum.channels[2] - 1000; - int16_t pitch = pid_pitch.update((ppmsum.channels[1] - 1500) * 1 - gyro.x); - int16_t roll = pid_roll.update((ppmsum.channels[0] - 1500) * 1 - gyro.y); - int16_t yaw = pid_yaw.update((ppmsum.channels[3] - 1500) * -1 - gyro.z); + int16_t pitch = pid_pitch.update((ppmsum.channels[1] - 1500) * 1 - ahrs.gyro.x); + int16_t roll = pid_roll.update((ppmsum.channels[0] - 1500) * 1 - ahrs.gyro.y); + int16_t yaw = pid_yaw.update((ppmsum.channels[3] - 1500) * -1 - ahrs.gyro.z); int16_t max = throttle > 250 ? 250 : throttle; saturate(pitch, max); saturate(roll, max); saturate(yaw, max); + // Generate motor mix. motors[0] = limit(throttle + pitch - roll + yaw, 0, 1000); motors[1] = limit(throttle - pitch - roll - yaw, 0, 1000); motors[2] = limit(throttle - pitch + roll + yaw, 0, 1000); diff --git a/telemetry.cpp b/telemetry.cpp new file mode 100644 index 0000000..d44412f --- /dev/null +++ b/telemetry.cpp @@ -0,0 +1,55 @@ +#include "telemetry.h" + +#include + +#include "stm32.h" +#include "ahrs.h" +#include "xbee.h" + +extern volatile uint16_t motors[4]; +extern AHRS ahrs; + +volatile uint16_t dmabuf[2]; + +void telemetry_main() { + ADC1.CR2 = 0x9; + while(ADC1.CR2 & 0x8); + ADC1.CR2 = 0x5; + while(ADC1.CR2 & 0x4); + + DMA1.CH[0].CMAR = (uint32_t)&dmabuf; + DMA1.CH[0].CPAR = (uint32_t)&ADC1.DR; + DMA1.CH[0].CNDTR = 2; + DMA1.CH[0].CCR = 0x05a1; + + ADC1.SMPR2 = 0x003f000; + ADC1.SQR1 = 0x100000; + ADC1.SQR3 = 5 | (4 << 5); + ADC1.CR1 = 0x100; + ADC1.CR2 = 0x103; + ADC1.CR2 = 0x103; + + while(1) { + uint16_t buf[] = { + ahrs.gyro.x, + ahrs.gyro.y, + ahrs.gyro.z, + ahrs.accel.x, + ahrs.accel.y, + ahrs.accel.z, + motors[0], + motors[1], + motors[2], + motors[3], + dmabuf[0], + dmabuf[1], + }; + + xbee_send(1, sizeof(buf), (uint8_t*)buf); + Time::sleep(100); + } +} + +uint32_t telemetry_stack[1024]; + +Thread telemetry_thread(telemetry_stack, sizeof(telemetry_stack), telemetry_main); \ No newline at end of file diff --git a/telemetry.h b/telemetry.h new file mode 100644 index 0000000..9c2efaf --- /dev/null +++ b/telemetry.h @@ -0,0 +1,8 @@ +#ifndef TELEMETRY_H +#define TELEMETRY_H + +#include + +extern Thread telemetry_thread; + +#endif -- cgit v1.2.3