1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-19 22:35:23 +03:00

Fix for blackbox I interval to be 32 ms even if PID denom isn't 1. (#5688)

This commit is contained in:
Michael Keller 2018-04-16 22:40:38 +12:00 committed by GitHub
parent 0cb6205f05
commit c3a534f800
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 31 deletions

View file

@ -1709,13 +1709,14 @@ void blackboxInit(void)
blackboxResetIterationTimers(); blackboxResetIterationTimers();
// an I-frame is written every 32ms // an I-frame is written every 32ms
// gyro.targetLooptime is 1000 for 1kHz loop, 500 for 2kHz loop etc, gyro.targetLooptime is rounded for short looptimes // blackboxUpdate() is run in synchronisation with the PID loop
if (gyro.targetLooptime == 31) { // rounded from 31.25us // targetPidLooptime is 1000 for 1kHz loop, 500 for 2kHz loop etc, targetPidLooptime is rounded for short looptimes
if (targetPidLooptime == 31) { // rounded from 31.25us
blackboxIInterval = 1024; blackboxIInterval = 1024;
} else if (gyro.targetLooptime == 63) { // rounded from 62.5us } else if (targetPidLooptime == 63) { // rounded from 62.5us
blackboxIInterval = 512; blackboxIInterval = 512;
} else { } else {
blackboxIInterval = (uint16_t)(32 * 1000 / gyro.targetLooptime); blackboxIInterval = (uint16_t)(32 * 1000 / targetPidLooptime);
} }
// by default p_ratio is 32 and a P-frame is written every 1ms // by default p_ratio is 32 and a P-frame is written every 1ms
// if p_ratio is zero then no P-frames are logged // if p_ratio is zero then no P-frames are logged

View file

@ -32,6 +32,7 @@ extern "C" {
#include "flight/failsafe.h" #include "flight/failsafe.h"
#include "flight/mixer.h" #include "flight/mixer.h"
#include "flight/pid.h"
#include "fc/rc_controls.h" #include "fc/rc_controls.h"
#include "fc/rc_modes.h" #include "fc/rc_modes.h"
@ -57,14 +58,14 @@ TEST(BlackboxTest, TestInitIntervals)
{ {
blackboxConfigMutable()->p_ratio = 32; blackboxConfigMutable()->p_ratio = 32;
// 250Hz PIDloop // 250Hz PIDloop
gyro.targetLooptime = 4000; targetPidLooptime = 4000;
blackboxInit(); blackboxInit();
EXPECT_EQ(8, blackboxIInterval); EXPECT_EQ(8, blackboxIInterval);
EXPECT_EQ(0, blackboxPInterval); EXPECT_EQ(0, blackboxPInterval);
EXPECT_EQ(2048, blackboxSInterval); EXPECT_EQ(2048, blackboxSInterval);
// 500Hz PIDloop // 500Hz PIDloop
gyro.targetLooptime = 2000; targetPidLooptime = 2000;
blackboxInit(); blackboxInit();
EXPECT_EQ(16, blackboxIInterval); EXPECT_EQ(16, blackboxIInterval);
EXPECT_EQ(0, blackboxPInterval); EXPECT_EQ(0, blackboxPInterval);
@ -72,49 +73,42 @@ TEST(BlackboxTest, TestInitIntervals)
// 1kHz PIDloop // 1kHz PIDloop
gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_1KHZ_SAMPLE, 1, false); gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_1KHZ_SAMPLE, 1, false);
targetPidLooptime = gyro.targetLooptime * 1;
blackboxInit(); blackboxInit();
EXPECT_EQ(32, blackboxIInterval); EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(1, blackboxPInterval); EXPECT_EQ(1, blackboxPInterval);
EXPECT_EQ(8192, blackboxSInterval); EXPECT_EQ(8192, blackboxSInterval);
// 2kHz PIDloop // 2kHz PIDloop
gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_NORMAL, 4, false); targetPidLooptime = 500;
EXPECT_EQ(500, gyro.targetLooptime);
blackboxInit(); blackboxInit();
EXPECT_EQ(64, blackboxIInterval); EXPECT_EQ(64, blackboxIInterval);
EXPECT_EQ(2, blackboxPInterval); EXPECT_EQ(2, blackboxPInterval);
EXPECT_EQ(16384, blackboxSInterval); EXPECT_EQ(16384, blackboxSInterval);
// 4kHz PIDloop // 4kHz PIDloop
gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_NORMAL, 2, false); targetPidLooptime = 250;
EXPECT_EQ(250, gyro.targetLooptime);
blackboxInit(); blackboxInit();
EXPECT_EQ(128, blackboxIInterval); EXPECT_EQ(128, blackboxIInterval);
EXPECT_EQ(4, blackboxPInterval); EXPECT_EQ(4, blackboxPInterval);
EXPECT_EQ(32768, blackboxSInterval); EXPECT_EQ(32768, blackboxSInterval);
// 8kHz PIDloop // 8kHz PIDloop
gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_NORMAL, 1, false); targetPidLooptime = 125;
EXPECT_EQ(125, gyro.targetLooptime);
gyro.targetLooptime = 125;
blackboxInit(); blackboxInit();
EXPECT_EQ(256, blackboxIInterval); EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(8, blackboxPInterval); EXPECT_EQ(8, blackboxPInterval);
EXPECT_EQ(65536, blackboxSInterval); EXPECT_EQ(65536, blackboxSInterval);
// 16kHz PIDloop // 16kHz PIDloop
gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_NORMAL, 2, true); targetPidLooptime = 63; // rounded from 62.5
EXPECT_EQ(63, gyro.targetLooptime);
gyro.targetLooptime = 63; // rounded from 62.5
blackboxInit(); blackboxInit();
EXPECT_EQ(512, blackboxIInterval); // note rounding EXPECT_EQ(512, blackboxIInterval); // note rounding
EXPECT_EQ(16, blackboxPInterval); EXPECT_EQ(16, blackboxPInterval);
EXPECT_EQ(131072, blackboxSInterval); EXPECT_EQ(131072, blackboxSInterval);
// 32kHz PIDloop // 32kHz PIDloop
gyro.targetLooptime = gyroSetSampleRate(&gyroDev, GYRO_HARDWARE_LPF_NORMAL, 1, true); targetPidLooptime = 31; // rounded from 31.25
EXPECT_EQ(31, gyro.targetLooptime);
gyro.targetLooptime = 31; // rounded from 31.25
blackboxInit(); blackboxInit();
EXPECT_EQ(1024, blackboxIInterval); // note rounding EXPECT_EQ(1024, blackboxIInterval); // note rounding
EXPECT_EQ(32, blackboxPInterval); EXPECT_EQ(32, blackboxPInterval);
@ -125,7 +119,7 @@ TEST(BlackboxTest, Test_500Hz)
{ {
blackboxConfigMutable()->p_ratio = 32; blackboxConfigMutable()->p_ratio = 32;
// 500Hz PIDloop // 500Hz PIDloop
gyro.targetLooptime = 2000; targetPidLooptime = 2000;
blackboxInit(); blackboxInit();
EXPECT_EQ(true, blackboxShouldLogIFrame()); EXPECT_EQ(true, blackboxShouldLogIFrame());
EXPECT_EQ(true, blackboxShouldLogPFrame()); EXPECT_EQ(true, blackboxShouldLogPFrame());
@ -143,7 +137,7 @@ TEST(BlackboxTest, Test_1kHz)
{ {
blackboxConfigMutable()->p_ratio = 32; blackboxConfigMutable()->p_ratio = 32;
// 1kHz PIDloop // 1kHz PIDloop
gyro.targetLooptime = 1000; targetPidLooptime = 1000;
blackboxInit(); blackboxInit();
EXPECT_EQ(true, blackboxShouldLogIFrame()); EXPECT_EQ(true, blackboxShouldLogIFrame());
EXPECT_EQ(true, blackboxShouldLogPFrame()); EXPECT_EQ(true, blackboxShouldLogPFrame());
@ -169,7 +163,7 @@ TEST(BlackboxTest, Test_2kHz)
{ {
blackboxConfigMutable()->p_ratio = 32; blackboxConfigMutable()->p_ratio = 32;
// 2kHz PIDloop // 2kHz PIDloop
gyro.targetLooptime = 500; targetPidLooptime = 500;
blackboxInit(); blackboxInit();
EXPECT_EQ(64, blackboxIInterval); EXPECT_EQ(64, blackboxIInterval);
EXPECT_EQ(2, blackboxPInterval); EXPECT_EQ(2, blackboxPInterval);
@ -202,7 +196,7 @@ TEST(BlackboxTest, Test_8kHz)
{ {
blackboxConfigMutable()->p_ratio = 32; blackboxConfigMutable()->p_ratio = 32;
// 8kHz PIDloop // 8kHz PIDloop
gyro.targetLooptime = 125; targetPidLooptime = 125;
blackboxInit(); blackboxInit();
EXPECT_EQ(true, blackboxShouldLogIFrame()); EXPECT_EQ(true, blackboxShouldLogIFrame());
EXPECT_EQ(true, blackboxShouldLogPFrame()); EXPECT_EQ(true, blackboxShouldLogPFrame());
@ -227,7 +221,7 @@ TEST(BlackboxTest, Test_zero_p_ratio)
{ {
blackboxConfigMutable()->p_ratio = 0; blackboxConfigMutable()->p_ratio = 0;
// 1kHz PIDloop // 1kHz PIDloop
gyro.targetLooptime = 1000; targetPidLooptime = 1000;
blackboxInit(); blackboxInit();
EXPECT_EQ(32, blackboxIInterval); EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(0, blackboxPInterval); EXPECT_EQ(0, blackboxPInterval);
@ -251,7 +245,7 @@ TEST(BlackboxTest, Test_CalculatePDenom)
// so p_ratio is 32 when blackbox logging rate is 1kHz // so p_ratio is 32 when blackbox logging rate is 1kHz
// 1kHz PIDloop // 1kHz PIDloop
gyro.targetLooptime = 1000; targetPidLooptime = 1000;
blackboxInit(); blackboxInit();
EXPECT_EQ(32, blackboxIInterval); EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(32, blackboxCalculatePDenom(1, 1)); // 1kHz logging EXPECT_EQ(32, blackboxCalculatePDenom(1, 1)); // 1kHz logging
@ -259,7 +253,7 @@ TEST(BlackboxTest, Test_CalculatePDenom)
EXPECT_EQ(8, blackboxCalculatePDenom(1, 4)); EXPECT_EQ(8, blackboxCalculatePDenom(1, 4));
// 2kHz PIDloop // 2kHz PIDloop
gyro.targetLooptime = 500; targetPidLooptime = 500;
blackboxInit(); blackboxInit();
EXPECT_EQ(64, blackboxIInterval); EXPECT_EQ(64, blackboxIInterval);
EXPECT_EQ(64, blackboxCalculatePDenom(1, 1)); EXPECT_EQ(64, blackboxCalculatePDenom(1, 1));
@ -267,7 +261,7 @@ TEST(BlackboxTest, Test_CalculatePDenom)
EXPECT_EQ(16, blackboxCalculatePDenom(1, 4)); EXPECT_EQ(16, blackboxCalculatePDenom(1, 4));
// 4kHz PIDloop // 4kHz PIDloop
gyro.targetLooptime = 250; targetPidLooptime = 250;
blackboxInit(); blackboxInit();
EXPECT_EQ(128, blackboxIInterval); EXPECT_EQ(128, blackboxIInterval);
EXPECT_EQ(128, blackboxCalculatePDenom(1, 1)); EXPECT_EQ(128, blackboxCalculatePDenom(1, 1));
@ -276,7 +270,7 @@ TEST(BlackboxTest, Test_CalculatePDenom)
EXPECT_EQ(16, blackboxCalculatePDenom(1, 8)); EXPECT_EQ(16, blackboxCalculatePDenom(1, 8));
// 8kHz PIDloop // 8kHz PIDloop
gyro.targetLooptime = 125; targetPidLooptime = 125;
blackboxInit(); blackboxInit();
EXPECT_EQ(256, blackboxIInterval); EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(256, blackboxCalculatePDenom(1, 1)); EXPECT_EQ(256, blackboxCalculatePDenom(1, 1));
@ -289,7 +283,7 @@ TEST(BlackboxTest, Test_CalculatePDenom)
TEST(BlackboxTest, Test_CalculateRates) TEST(BlackboxTest, Test_CalculateRates)
{ {
// 1kHz PIDloop // 1kHz PIDloop
gyro.targetLooptime = 1000; targetPidLooptime = 1000;
blackboxConfigMutable()->p_ratio = 32; blackboxConfigMutable()->p_ratio = 32;
blackboxInit(); blackboxInit();
EXPECT_EQ(32, blackboxIInterval); EXPECT_EQ(32, blackboxIInterval);
@ -310,7 +304,7 @@ TEST(BlackboxTest, Test_CalculateRates)
// 8kHz PIDloop // 8kHz PIDloop
gyro.targetLooptime = 125; targetPidLooptime = 125;
blackboxConfigMutable()->p_ratio = 32; // 1kHz logging blackboxConfigMutable()->p_ratio = 32; // 1kHz logging
blackboxInit(); blackboxInit();
EXPECT_EQ(256, blackboxIInterval); EXPECT_EQ(256, blackboxIInterval);
@ -342,7 +336,7 @@ TEST(BlackboxTest, Test_CalculateRates)
EXPECT_EQ(1, blackboxGetRateDenom()); EXPECT_EQ(1, blackboxGetRateDenom());
// 0.126 PIDloop // 0.126 PIDloop
gyro.targetLooptime = 126; targetPidLooptime = 126;
blackboxConfigMutable()->p_ratio = 32; // 1kHz logging blackboxConfigMutable()->p_ratio = 32; // 1kHz logging
blackboxInit(); blackboxInit();
EXPECT_EQ(253, blackboxIInterval); EXPECT_EQ(253, blackboxIInterval);