mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-11-29 07:24:13 +01:00
Add a version of the sin lookup table that is in ram instead of flash
This commit is contained in:
parent
490955dbea
commit
9f3c8dddd3
@ -28,9 +28,14 @@
|
|||||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "openpilot.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
#include "stdbool.h"
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
|
|
||||||
|
#ifdef FLASH_TABLE
|
||||||
|
/** Version of the code which precomputes the lookup table in flash **/
|
||||||
|
|
||||||
// This is a precomputed sin lookup table over 90 degrees that
|
// This is a precomputed sin lookup table over 90 degrees that
|
||||||
const float sin_table[] = {
|
const float sin_table[] = {
|
||||||
0.000000f,0.017452f,0.034899f,0.052336f,0.069756f,0.087156f,0.104528f,0.121869f,0.139173f,0.156434f,
|
0.000000f,0.017452f,0.034899f,0.052336f,0.069756f,0.087156f,0.104528f,0.121869f,0.139173f,0.156434f,
|
||||||
@ -44,6 +49,11 @@
|
|||||||
0.984808f,0.987688f,0.990268f,0.992546f,0.994522f,0.996195f,0.997564f,0.998630f,0.999391f,0.999848f
|
0.984808f,0.987688f,0.990268f,0.992546f,0.994522f,0.996195f,0.997564f,0.998630f,0.999391f,0.999848f
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int sin_lookup_initalize()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use the lookup table to return sine(angle) where angle is in radians
|
* Use the lookup table to return sine(angle) where angle is in radians
|
||||||
* to save flash this cheats and uses trig functions to only save
|
* to save flash this cheats and uses trig functions to only save
|
||||||
@ -66,6 +76,46 @@ float sin_lookup_deg(float angle)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/** Version of the code which allocates the lookup table in heap **/
|
||||||
|
|
||||||
|
const int SIN_RESOLUTION = 180;
|
||||||
|
|
||||||
|
static float *sin_table;
|
||||||
|
int sin_lookup_initalize()
|
||||||
|
{
|
||||||
|
// Previously initialized
|
||||||
|
if (sin_table)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
sin_table = (float *) pvPortMalloc(sizeof(float) * SIN_RESOLUTION);
|
||||||
|
if (sin_table == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for(uint32_t i = 0; i < 180; i++)
|
||||||
|
sin_table[i] = sinf((float)i * 2 * M_PI / 360.0f);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses the lookup table to calculate sine (angle is in degrees)
|
||||||
|
* @param[in] angle in degrees
|
||||||
|
* @returns sin(angle)
|
||||||
|
*/
|
||||||
|
float sin_lookup_deg(float angle) {
|
||||||
|
int i_ang = ((int32_t)angle) % 360;
|
||||||
|
if (i_ang > 180)
|
||||||
|
return - sin_table[i_ang-180];
|
||||||
|
else
|
||||||
|
return sin_table[i_ang];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get cos(angle) using the sine lookup table
|
* Get cos(angle) using the sine lookup table
|
||||||
* @param[in] angle Angle in degrees
|
* @param[in] angle Angle in degrees
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#ifndef SIN_LOOKUP_H
|
#ifndef SIN_LOOKUP_H
|
||||||
#define SIN_LOOKUP_H
|
#define SIN_LOOKUP_H
|
||||||
|
|
||||||
|
int sin_lookup_initalize();
|
||||||
float sin_lookup_deg(float angle);
|
float sin_lookup_deg(float angle);
|
||||||
float cos_lookup_deg(float angle);
|
float cos_lookup_deg(float angle);
|
||||||
float sin_lookup_rad(float angle);
|
float sin_lookup_rad(float angle);
|
||||||
|
@ -101,11 +101,11 @@ int stabilization_relay_rate(float error, float *output, int axis, bool reinit)
|
|||||||
// Project the error onto a sine and cosine of the same frequency
|
// Project the error onto a sine and cosine of the same frequency
|
||||||
// to accumulate the average amplitude
|
// to accumulate the average amplitude
|
||||||
int32_t dT = thisTime - lastHighTime;
|
int32_t dT = thisTime - lastHighTime;
|
||||||
int32_t phase = (360 * dT) / relay.Period[axis];
|
float phase = ((float)360 * (float)dT) / relay.Period[axis];
|
||||||
if(phase >= 360)
|
if(phase >= 360)
|
||||||
phase = 0;
|
phase = 0;
|
||||||
accum_sin += sin_lookup_deg(phase) * error;
|
accum_sin += sin_lookup_deg(phase) * error;
|
||||||
accum_cos += cos_lookup_deg(phase) * error;
|
accum_cos += sin_lookup_deg(phase + 90) * error;
|
||||||
accumulated ++;
|
accumulated ++;
|
||||||
|
|
||||||
// Make sure we've had enough time since last transition then check for a change in the output
|
// Make sure we've had enough time since last transition then check for a change in the output
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
// Math libraries
|
// Math libraries
|
||||||
#include "CoordinateConversions.h"
|
#include "CoordinateConversions.h"
|
||||||
#include "pid.h"
|
#include "pid.h"
|
||||||
|
#include "sin_lookup.h"
|
||||||
|
|
||||||
// Includes for various stabilization algorithms
|
// Includes for various stabilization algorithms
|
||||||
#include "relay_tuning.h"
|
#include "relay_tuning.h"
|
||||||
@ -117,12 +118,15 @@ int32_t StabilizationInitialize()
|
|||||||
// Initialize variables
|
// Initialize variables
|
||||||
StabilizationSettingsInitialize();
|
StabilizationSettingsInitialize();
|
||||||
ActuatorDesiredInitialize();
|
ActuatorDesiredInitialize();
|
||||||
RelayTuningSettingsInitialize();
|
|
||||||
RelayTuningInitialize();
|
|
||||||
#if defined(DIAGNOSTICS)
|
#if defined(DIAGNOSTICS)
|
||||||
RateDesiredInitialize();
|
RateDesiredInitialize();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Code required for relay tuning
|
||||||
|
sin_lookup_initalize();
|
||||||
|
RelayTuningSettingsInitialize();
|
||||||
|
RelayTuningInitialize();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user