Got compass to work again

This commit is contained in:
Lennart Eriksson 2016-11-23 13:56:55 +01:00
parent 3c10f7b4de
commit e2c8ffee5a
14 changed files with 121 additions and 19 deletions

View File

@ -67,6 +67,8 @@ extern float accPitchFineTune;
extern accel_t accelProfile; /*Struct profile for input data from sensor*/ extern accel_t accelProfile; /*Struct profile for input data from sensor*/
extern float Yaw;
extern float YawU;
/************************************************************************** /**************************************************************************

View File

@ -107,6 +107,7 @@ typedef enum
TASK_RX_CLI, TASK_RX_CLI,
TASK_SERIAL, TASK_SERIAL,
TASK_BATTERY, TASK_BATTERY,
TASK_ARDUINO,
#ifdef BARO #ifdef BARO
TASK_BARO, TASK_BARO,
#endif #endif

View File

@ -38,6 +38,7 @@ void systemTaskRxCli(void);
bool systemTaskRxCliCheck(uint32_t currentDeltaTime); bool systemTaskRxCliCheck(uint32_t currentDeltaTime);
void systemTaskSerial(void); void systemTaskSerial(void);
void systemTaskBattery(void); void systemTaskBattery(void);
void systemTaskArduino(void);
void systemTaskBaro(void); void systemTaskBaro(void);
void systemTaskCompass(void); void systemTaskCompass(void);
void systemTaskGps(void); void systemTaskGps(void);

View File

@ -159,6 +159,7 @@ typedef enum {
EEPROM_PERIOD_RX_CLI, EEPROM_PERIOD_RX_CLI,
EEPROM_PERIOD_SERIAL, EEPROM_PERIOD_SERIAL,
EEPROM_PERIOD_BATTERY, EEPROM_PERIOD_BATTERY,
EEPROM_PERIOD_ARDUINO,
#ifdef BARO #ifdef BARO
EEPROM_PERIOD_BARO, EEPROM_PERIOD_BARO,
#endif #endif

View File

@ -14,7 +14,7 @@
#ifndef SYSTEM_VARIABLES_H_ #ifndef SYSTEM_VARIABLES_H_
#define SYSTEM_VARIABLES_H_ #define SYSTEM_VARIABLES_H_
#define EEPROM_SYS_VERSION 107 #define EEPROM_SYS_VERSION 111
#define ADC_STATE #define ADC_STATE
#include "stm32f4xx.h" #include "stm32f4xx.h"

View File

@ -20,6 +20,10 @@
#include "drivers/failsafe_toggles.h" #include "drivers/failsafe_toggles.h"
#include "drivers/motormix.h" #include "drivers/motormix.h"
#include "utilities.h" #include "utilities.h"
#include "drivers/arduino_com.h"
#define sq(x) ((x)*(x))
#define map(x, in_min, in_max, out_min, out_max) (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
#define PTERM_SCALE 0.032029f /*P-term used as a scale value to the PID controller*/ #define PTERM_SCALE 0.032029f /*P-term used as a scale value to the PID controller*/
@ -63,7 +67,16 @@ pt1Filter_t accelFilter[2] = {0};
float accRollFineTune = 0; float accRollFineTune = 0;
float accPitchFineTune = 0; float accPitchFineTune = 0;
float oldSensorValue[2] = {0};
float oldSensorValueRoll[12] = {0};
float oldSensorValuePitch[12] = {0};
float MagnetFilteredOld[3];
float alphaMagnet = 0.4;
int MagnetMax[3];
int MagnetMin[3];
float MagnetMap[3];
float Yaw;
float YawU;
/************************************************************************** /**************************************************************************
* BRIEF: Calculates angle from accelerometer * * BRIEF: Calculates angle from accelerometer *
@ -124,9 +137,6 @@ float constrainf(float amt, int low, int high)
} }
float oldSensorValue[2] = {0};
float oldSensorValueRoll[12] = {0};
float oldSensorValuePitch[12] = {0};
int i = 0; int i = 0;
@ -214,6 +224,59 @@ void getCurrentValues(float sensorValues[3], uint8_t ID_profile)
break; break;
case PID_ID_COMPASS: case PID_ID_COMPASS:
{
float xMagnetFiltered = 0;
float yMagnetFiltered = 0;
float zMagnetFiltered = 0;
xMagnetFiltered = MagnetFilteredOld[0] + alphaMagnet * (compass_data.x - MagnetFilteredOld[0]);
yMagnetFiltered = MagnetFilteredOld[1] + alphaMagnet * (compass_data.y - MagnetFilteredOld[1]);
zMagnetFiltered = MagnetFilteredOld[2] + alphaMagnet * (compass_data.z - MagnetFilteredOld[2]);
MagnetFilteredOld[0] = xMagnetFiltered;
MagnetFilteredOld[1] = yMagnetFiltered;
MagnetFilteredOld[2] = zMagnetFiltered;
//this part is required to normalize the magnetic vector
if (xMagnetFiltered>MagnetMax[0]) { MagnetMax[0] = xMagnetFiltered; }
if (yMagnetFiltered>MagnetMax[1]) { MagnetMax[1] = yMagnetFiltered; }
if (zMagnetFiltered>MagnetMax[2]) { MagnetMax[2] = zMagnetFiltered; }
if (xMagnetFiltered<MagnetMin[0]) { MagnetMin[0] = xMagnetFiltered; }
if (yMagnetFiltered<MagnetMin[1]) { MagnetMin[1] = yMagnetFiltered; }
if (zMagnetFiltered<MagnetMin[2]) { MagnetMin[2] = zMagnetFiltered; }
float norm;
MagnetMap[0] = (float)(map(xMagnetFiltered, MagnetMin[0], MagnetMax[0], -10000, 10000)) / 10000.0;
MagnetMap[1] = (float)(map(yMagnetFiltered, MagnetMin[1], MagnetMax[1], -10000, 10000)) / 10000.0;
MagnetMap[2] = (float)(map(zMagnetFiltered, MagnetMin[2], MagnetMax[2], -10000, 10000)) / 10000.0;
//normalize the magnetic vector
norm = sqrt(sq(MagnetMap[0]) + sq(MagnetMap[1]) + sq(MagnetMap[2]));
MagnetMap[0] /= norm;
MagnetMap[1] /= norm;
MagnetMap[2] /= norm;
// compare Applications of Magnetic Sensors for Low Cost Compass Systems by Michael J. Caruso
// for the compensated Yaw equations...
// http://www.ssec.honeywell.com/magnetic/datasheets/lowcost.pdf
Yaw = atan2(-(MagnetMap[1] * cos(oldSensorValue[0]) + MagnetMap[2] * sin(oldSensorValue[0])), MagnetMap[0] * cos(oldSensorValue[1]) + MagnetMap[1] * sin(oldSensorValue[1]) * sin(oldSensorValue[0]) + MagnetMap[2] * sin(oldSensorValue[1]) * cos(oldSensorValue[0]));
YawU = atan2(-MagnetMap[1], MagnetMap[0]);
// float XH;
// XH = compass_data.y * cos(oldSensorValue[1]) +
// compass_data.x * sin(oldSensorValue[1]) * sin(oldSensorValue[0]) +
// compass_data.z * sin(oldSensorValue[1]) * cos(oldSensorValue[0]);
// float YH;
// YH = compass_data.x * cos(oldSensorValue[0]) +
// compass_data.z * sin(oldSensorValue[0]);
//
// Yaw = atan2(-YH, XH);
// YawU = atan2(compass_data.y, compass_data.x);
}
break;
case PID_ID_BAROMETER: case PID_ID_BAROMETER:
default: default:
@ -421,7 +484,7 @@ void pidRun(uint8_t ID)
break; break;
case PID_ID_ACCELEROMETER: case PID_ID_ACCELEROMETER:
if (!(PidProfile[PID_ID_ACCELEROMETER].pidEnabled && flags_IsSet_ID(systemFlags_flightmode_acceleromter_id))) if ((PidProfile[PID_ID_ACCELEROMETER].pidEnabled && flags_IsSet_ID(systemFlags_flightmode_acceleromter_id)))
{ {
PidProfile[PID_ID_ACCELEROMETER].PID_Out[ROLL] = rc_input.Roll; PidProfile[PID_ID_ACCELEROMETER].PID_Out[ROLL] = rc_input.Roll;
PidProfile[PID_ID_ACCELEROMETER].PID_Out[PITCH] = rc_input.Pitch; PidProfile[PID_ID_ACCELEROMETER].PID_Out[PITCH] = rc_input.Pitch;
@ -434,7 +497,7 @@ void pidRun(uint8_t ID)
break; break;
case PID_ID_COMPASS: case PID_ID_COMPASS:
if (!PidProfile[PID_ID_COMPASS].pidEnabled) if (PidProfile[PID_ID_COMPASS].pidEnabled)
{ {
PidProfile[PID_ID_COMPASS].PID_Out[0] = rc_input.Yaw; PidProfile[PID_ID_COMPASS].PID_Out[0] = rc_input.Yaw;
} }

View File

@ -339,6 +339,8 @@ void initSchedulerTasks(void)
enableTask(TASK_BATTERY, true); enableTask(TASK_BATTERY, true);
enableTask(TASK_ARDUINO, true);
#ifdef BARO #ifdef BARO
enableTask(TASK_BARO, true); enableTask(TASK_BARO, true);
#endif #endif

View File

@ -100,6 +100,14 @@ task_t SystemTasks[TASK_COUNT] =
.staticPriority = PRIORITY_MEDIUM, .staticPriority = PRIORITY_MEDIUM,
}, },
[TASK_ARDUINO] =
{
.taskName = "ARDUINO",
.taskFunction = systemTaskArduino,
.desiredPeriod = GetUpdateRateHz(50), //50 hz update rate (20 ms)
.staticPriority = PRIORITY_MEDIUM,
},
#ifdef BARO #ifdef BARO
[TASK_BARO] = [TASK_BARO] =
{ {

View File

@ -183,6 +183,7 @@ typedef enum
COMMAND_ID_PERIOD_RX_CLI, COMMAND_ID_PERIOD_RX_CLI,
COMMAND_ID_PERIOD_SERIAL, COMMAND_ID_PERIOD_SERIAL,
COMMAND_ID_PERIOD_BATTERY, COMMAND_ID_PERIOD_BATTERY,
COMMAND_ID_PERIOD_ARDUINO,
#ifdef BARO #ifdef BARO
COMMAND_ID_PERIOD_BARO, COMMAND_ID_PERIOD_BARO,
#endif #endif
@ -371,6 +372,10 @@ const cliCommandConfig_t commandTable[COMMAND_ID_COUNT] = {
{ {
"task_period_battery", COMMAND_ID_PERIOD_BATTERY, EEPROM_PERIOD_BATTERY, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_32, .valueRange = {0, 1000000000} "task_period_battery", COMMAND_ID_PERIOD_BATTERY, EEPROM_PERIOD_BATTERY, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_32, .valueRange = {0, 1000000000}
}, },
[COMMAND_ID_PERIOD_ARDUINO] =
{
"task_period_arduino", COMMAND_ID_PERIOD_ARDUINO, EEPROM_PERIOD_ARDUINO, EEPROM_VALUE_TYPE_SYSTEM, 0, VAL_UINT_32, .valueRange = {0, 1000000000}
},
#ifdef BARO #ifdef BARO
[COMMAND_ID_PERIOD_BARO] = [COMMAND_ID_PERIOD_BARO] =
{ {

View File

@ -154,6 +154,12 @@ EEPROM_DATA_t eeprom_sys_Arr[EEPROM_SYS_COUNT] = {
.dataPtr = &(SystemTasks[TASK_BATTERY].desiredPeriod), .dataPtr = &(SystemTasks[TASK_BATTERY].desiredPeriod),
}, },
[EEPROM_PERIOD_ARDUINO] =
{
.size = sizeof(SystemTasks[TASK_ARDUINO].desiredPeriod),
.dataPtr = &(SystemTasks[TASK_ARDUINO].desiredPeriod),
},
#ifdef BARO #ifdef BARO
[EEPROM_PERIOD_BARO] = [EEPROM_PERIOD_BARO] =
{ {

View File

@ -10,6 +10,7 @@
#include "utilities.h" #include "utilities.h"
#include "string.h" #include "string.h"
#include "stm32f4xx_revo.h" #include "stm32f4xx_revo.h"
#include "Flight/pid.h"
#define COMPASS_PACKET_SIZE 8 #define COMPASS_PACKET_SIZE 8
#define GPS_PACKET_SIZE 10 #define GPS_PACKET_SIZE 10
@ -49,7 +50,7 @@ enum smartportID {
arduino_sensor_t sensors[SENSOR_COUNT]; arduino_sensor_t sensors[SENSOR_COUNT];
usart_dma_profile dmaHandler; usart_dma_profile usartdmaHandler;
dma_usart_return raw_dma_data_t; dma_usart_return raw_dma_data_t;
// enumeration to hold the id:s of the different packages // enumeration to hold the id:s of the different packages
@ -91,7 +92,7 @@ arduino_data_t data_arr[ARDUINO_DATA_COUNT] = {
void arduinoCom_init(USART_TypeDef* usart_inst) void arduinoCom_init(USART_TypeDef* usart_inst)
{ {
/* initialize the USART with a dma buffer */ /* initialize the USART with a dma buffer */
usart_init_dma(usart_inst, &dmaHandler, ARDUINO_BAUD, STOP_BITS_1, PARITY_NONE, ARDUINO_DMA_SIZE, 0); usart_init_dma(usart_inst, &usartdmaHandler, ARDUINO_BAUD, STOP_BITS_1, PARITY_NONE, ARDUINO_DMA_SIZE, 0);
/*Initialize the sensors to be sent over smartport*/ /*Initialize the sensors to be sent over smartport*/
sensors[CURRENT_SENSOR_ID].ID = FSS_SENSOR_CURRENT; sensors[CURRENT_SENSOR_ID].ID = FSS_SENSOR_CURRENT;
@ -118,8 +119,7 @@ void arduinoCom_init(USART_TypeDef* usart_inst)
bool arduino_frame_available() bool arduino_frame_available()
{ {
/* We read data from DMA */ /* We read data from DMA */
raw_dma_data_t = usart_get_dma_buffer(&dmaHandler); raw_dma_data_t = usart_get_dma_buffer(&usartdmaHandler);
return raw_dma_data_t.new_data; return raw_dma_data_t.new_data;
} }
@ -237,6 +237,8 @@ void arduino_parse_message(uint8_t data)
***********************************************************************/ ***********************************************************************/
void arduino_read() void arduino_read()
{ {
raw_dma_data_t = usart_get_dma_buffer(&usartdmaHandler);
//If the DMA has come to a new buffer //If the DMA has come to a new buffer
if (raw_dma_data_t.new_data) if (raw_dma_data_t.new_data)
{ {
@ -265,19 +267,19 @@ void update_sensor_values()
{ {
/* TODO: Add the correct data to the value parameters here*/ /* TODO: Add the correct data to the value parameters here*/
sensors[CURRENT_SENSOR_ID].value += 1; sensors[CURRENT_SENSOR_ID].value = Yaw * (180 / 3.1415) + 180;
sensors[CURRENT_SENSOR_ID].crc = calculate_crc(&sensors[CURRENT_SENSOR_ID], ARDUINO_SENSOR_SIZE - 1); sensors[CURRENT_SENSOR_ID].crc = calculate_crc(&sensors[CURRENT_SENSOR_ID], ARDUINO_SENSOR_SIZE - 1);
sensors[VOLTAGE_SENSOR_ID].value += 2; sensors[VOLTAGE_SENSOR_ID].value = YawU * (180 / 3.1415) + 180;
sensors[VOLTAGE_SENSOR_ID].crc = calculate_crc(&sensors[VOLTAGE_SENSOR_ID], ARDUINO_SENSOR_SIZE - 1); sensors[VOLTAGE_SENSOR_ID].crc = calculate_crc(&sensors[VOLTAGE_SENSOR_ID], ARDUINO_SENSOR_SIZE - 1);
sensors[BAROMETER_SENSOR_ID].value += 3; sensors[BAROMETER_SENSOR_ID].value = 0;
sensors[BAROMETER_SENSOR_ID].crc = calculate_crc(&sensors[BAROMETER_SENSOR_ID], ARDUINO_SENSOR_SIZE - 1); sensors[BAROMETER_SENSOR_ID].crc = calculate_crc(&sensors[BAROMETER_SENSOR_ID], ARDUINO_SENSOR_SIZE - 1);
sensors[TUNE_PITCH_ID].value += 4; sensors[TUNE_PITCH_ID].value = 0;
sensors[TUNE_PITCH_ID].crc = calculate_crc(&sensors[TUNE_PITCH_ID], ARDUINO_SENSOR_SIZE - 1); sensors[TUNE_PITCH_ID].crc = calculate_crc(&sensors[TUNE_PITCH_ID], ARDUINO_SENSOR_SIZE - 1);
sensors[TUNE_ROLL_ID].value += 5; sensors[TUNE_ROLL_ID].value = 0;
sensors[TUNE_ROLL_ID].crc = calculate_crc(&sensors[TUNE_ROLL_ID], ARDUINO_SENSOR_SIZE - 1); sensors[TUNE_ROLL_ID].crc = calculate_crc(&sensors[TUNE_ROLL_ID], ARDUINO_SENSOR_SIZE - 1);
} }
@ -291,7 +293,7 @@ void arduino_send_sensor_values()
update_sensor_values(); update_sensor_values();
for (int i = 0; i < SENSOR_COUNT; i++) for (int i = 0; i < SENSOR_COUNT; i++)
{ {
usart_transmit(&dmaHandler.usart_pro, (uint8_t *) &sensors[i], 6, 10000); usart_transmit(&usartdmaHandler.usart_pro, (uint8_t *) &sensors[i], 6, 10000);
} }
} }

View File

@ -84,7 +84,7 @@ bool usart_init_dma(USART_TypeDef* usart_inst, // The USART instance to be
} }
else if(usart_inst == USART6) else if(usart_inst == USART6)
{ {
dma_rx_instance = DMA2_Stream2; dma_rx_instance = DMA2_Stream1;
dma_tx_instance = DMA2_Stream6; dma_tx_instance = DMA2_Stream6;
channel = DMA_CHANNEL_5; channel = DMA_CHANNEL_5;
} }

View File

@ -28,7 +28,8 @@
#include "drivers/motormix.h" #include "drivers/motormix.h"
#include "drivers/motors.h" #include "drivers/motors.h"
#include "Flight/pid.h" #include "Flight/pid.h"
#include "drivers/barometer.h"#include "drivers/arduino_com.h" #include "drivers/barometer.h"
#include "drivers/arduino_com.h"
/************************************************************************** /**************************************************************************
* BRIEF: Should contain all the initializations of the system, needs to * BRIEF: Should contain all the initializations of the system, needs to
@ -64,6 +65,9 @@ void init_system()
//init sbus, using USART1 //init sbus, using USART1
sbus_init(); sbus_init();
arduinoCom_init(USART6);
// uart1_rx_inverter_init(false);
#ifdef USE_LEDS #ifdef USE_LEDS
//Initialize the on board leds //Initialize the on board leds

View File

@ -42,6 +42,7 @@
#include "drivers/motormix.h" #include "drivers/motormix.h"
#include "Flight/pid.h" #include "Flight/pid.h"
#include "drivers/barometer.h" #include "drivers/barometer.h"
#include "drivers/arduino_com.h"
void systemTaskGyroPid(void) void systemTaskGyroPid(void)
{ {
@ -224,6 +225,12 @@ void systemTaskBattery(void)
ledOffInverted(Led0_PIN, Led0_GPIO_PORT); ledOffInverted(Led0_PIN, Led0_GPIO_PORT);
} }
void systemTaskArduino(void)
{
arduino_read();
arduino_send_sensor_values();
}
void systemTaskBaro(void) void systemTaskBaro(void)
{ {
//barometer_CaclulateValues(); //barometer_CaclulateValues();