Merge pull request #1843 from martinbudden/bf_minor_optimisations

Some minor performance optimisations
This commit is contained in:
borisbstyle 2016-12-17 13:46:22 +01:00 committed by GitHub
commit 0edfb397dc
6 changed files with 19 additions and 13 deletions

View File

@ -46,11 +46,12 @@ void pt1FilterInit(pt1Filter_t *filter, uint8_t f_cut, float dT)
{ {
filter->RC = 1.0f / ( 2.0f * M_PI_FLOAT * f_cut ); filter->RC = 1.0f / ( 2.0f * M_PI_FLOAT * f_cut );
filter->dT = dT; filter->dT = dT;
filter->k = filter->dT / (filter->RC + filter->dT);
} }
float pt1FilterApply(pt1Filter_t *filter, float input) float pt1FilterApply(pt1Filter_t *filter, float input)
{ {
filter->state = filter->state + filter->dT / (filter->RC + filter->dT) * (input - filter->state); filter->state = filter->state + filter->k * (input - filter->state);
return filter->state; return filter->state;
} }
@ -60,9 +61,10 @@ float pt1FilterApply4(pt1Filter_t *filter, float input, uint8_t f_cut, float dT)
if (!filter->RC) { if (!filter->RC) {
filter->RC = 1.0f / ( 2.0f * M_PI_FLOAT * f_cut ); filter->RC = 1.0f / ( 2.0f * M_PI_FLOAT * f_cut );
filter->dT = dT; filter->dT = dT;
filter->k = filter->dT / (filter->RC + filter->dT);
} }
filter->state = filter->state + filter->dT / (filter->RC + filter->dT) * (input - filter->state); filter->state = filter->state + filter->k * (input - filter->state);
return filter->state; return filter->state;
} }

View File

@ -25,6 +25,7 @@
typedef struct pt1Filter_s { typedef struct pt1Filter_s {
float state; float state;
float k;
float RC; float RC;
float dT; float dT;
} pt1Filter_t; } pt1Filter_t;

View File

@ -20,6 +20,7 @@
#ifndef sq #ifndef sq
#define sq(x) ((x)*(x)) #define sq(x) ((x)*(x))
#endif #endif
#define power3(x) ((x)*(x)*(x))
// Undefine this for use libc sinf/cosf. Keep this defined to use fast sin/cos approximations // Undefine this for use libc sinf/cosf. Keep this defined to use fast sin/cos approximations
#define FAST_MATH // order 9 approximation #define FAST_MATH // order 9 approximation

View File

@ -147,7 +147,6 @@ bool isCalibrating()
} }
#define RC_RATE_INCREMENTAL 14.54f #define RC_RATE_INCREMENTAL 14.54f
#define RC_EXPO_POWER 3
void calculateSetpointRate(int axis, int16_t rc) { void calculateSetpointRate(int axis, int16_t rc) {
float angleRate, rcRate, rcSuperfactor, rcCommandf; float angleRate, rcRate, rcSuperfactor, rcCommandf;
@ -167,7 +166,7 @@ void calculateSetpointRate(int axis, int16_t rc) {
if (rcExpo) { if (rcExpo) {
float expof = rcExpo / 100.0f; float expof = rcExpo / 100.0f;
rcCommandf = rcCommandf * powerf(rcInput[axis], RC_EXPO_POWER) * expof + rcCommandf * (1-expof); rcCommandf = rcCommandf * power3(rcInput[axis]) * expof + rcCommandf * (1-expof);
} }
angleRate = 200.0f * rcRate * rcCommandf; angleRate = 200.0f * rcRate * rcCommandf;
@ -290,7 +289,7 @@ void updateRcCommands(void)
tmp = 0; tmp = 0;
} }
rcCommand[axis] = tmp; rcCommand[axis] = tmp;
} else if (axis == YAW) { } else {
if (tmp > rcControlsConfig()->yaw_deadband) { if (tmp > rcControlsConfig()->yaw_deadband) {
tmp -= rcControlsConfig()->yaw_deadband; tmp -= rcControlsConfig()->yaw_deadband;
} else { } else {
@ -778,9 +777,11 @@ void subTaskMotorUpdate(void)
#ifdef USE_SERVOS #ifdef USE_SERVOS
// motor outputs are used as sources for servo mixing, so motors must be calculated using mixTable() before servos. // motor outputs are used as sources for servo mixing, so motors must be calculated using mixTable() before servos.
servoTable(); if (isMixerUsingServos()) {
filterServos(); servoTable();
writeServos(); filterServos();
writeServos();
}
#endif #endif
if (motorControlEnable) { if (motorControlEnable) {

View File

@ -263,10 +263,10 @@ void pidController(const pidProfile_t *pidProfile, uint16_t max_angle_inclinatio
dynC = c[axis]; dynC = c[axis];
if (setpointRate[axis] > 0) { if (setpointRate[axis] > 0) {
if ((setpointRate[axis] - previousSetpoint[axis]) < previousSetpoint[axis]) if ((setpointRate[axis] - previousSetpoint[axis]) < previousSetpoint[axis])
dynC = dynC * powerf(rcInput[axis], 2) * relaxFactor[axis] + dynC * (1-relaxFactor[axis]); dynC = dynC * sq(rcInput[axis]) * relaxFactor[axis] + dynC * (1-relaxFactor[axis]);
} else if (setpointRate[axis] < 0) { } else if (setpointRate[axis] < 0) {
if ((setpointRate[axis] - previousSetpoint[axis]) > previousSetpoint[axis]) if ((setpointRate[axis] - previousSetpoint[axis]) > previousSetpoint[axis])
dynC = dynC * powerf(rcInput[axis], 2) * relaxFactor[axis] + dynC * (1-relaxFactor[axis]); dynC = dynC * sq(rcInput[axis]) * relaxFactor[axis] + dynC * (1-relaxFactor[axis]);
} }
} }
const float rD = dynC * setpointRate[axis] - PVRate; // cr - y const float rD = dynC * setpointRate[axis] - PVRate; // cr - y

View File

@ -176,9 +176,10 @@ void setTaskEnabled(cfTaskId_e taskId, bool enabled)
uint32_t getTaskDeltaTime(cfTaskId_e taskId) uint32_t getTaskDeltaTime(cfTaskId_e taskId)
{ {
if (taskId == TASK_SELF || taskId < TASK_COUNT) { if (taskId == TASK_SELF) {
cfTask_t *task = taskId == TASK_SELF ? currentTask : &cfTasks[taskId]; return currentTask->taskLatestDeltaTime;
return task->taskLatestDeltaTime; } else if (taskId < TASK_COUNT) {
return cfTasks[taskId].taskLatestDeltaTime;
} else { } else {
return 0; return 0;
} }