mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-22 00:28:30 -04:00
AP_HAL: always choose high for dshot prescaler calculation
This commit is contained in:
parent
e0e60c8654
commit
85d73eeb5c
@ -86,8 +86,15 @@ uint32_t AP_HAL::RCOutput::calculate_bitrate_prescaler(uint32_t timer_clock, uin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// find the closest value
|
|
||||||
const uint32_t freq = timer_clock / prescaler;
|
const uint32_t freq = timer_clock / prescaler;
|
||||||
|
// if using dshot then always pick the high value. choosing low seems to not agree with some
|
||||||
|
// ESCs despite the fact that BLHeli32 is supposed not to care what the bitrate is
|
||||||
|
if (is_dshot) {
|
||||||
|
if (freq < target_frequency) {
|
||||||
|
prescaler--;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// find the closest value
|
||||||
const float delta = fabsf(float(freq) - target_frequency);
|
const float delta = fabsf(float(freq) - target_frequency);
|
||||||
if (freq > target_frequency
|
if (freq > target_frequency
|
||||||
&& delta > fabsf(float(timer_clock / (prescaler+1)) - target_frequency)) {
|
&& delta > fabsf(float(timer_clock / (prescaler+1)) - target_frequency)) {
|
||||||
@ -96,6 +103,7 @@ uint32_t AP_HAL::RCOutput::calculate_bitrate_prescaler(uint32_t timer_clock, uin
|
|||||||
&& delta > fabsf(float(timer_clock / (prescaler-1)) - target_frequency)) {
|
&& delta > fabsf(float(timer_clock / (prescaler-1)) - target_frequency)) {
|
||||||
prescaler--;
|
prescaler--;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return prescaler;
|
return prescaler;
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ protected:
|
|||||||
const uint32_t prescaler = AP_HAL::RCOutput::calculate_bitrate_prescaler(clock, target_rate, is_dshot);
|
const uint32_t prescaler = AP_HAL::RCOutput::calculate_bitrate_prescaler(clock, target_rate, is_dshot);
|
||||||
// we would like at most a 1% discrepancy in target versus actual
|
// we would like at most a 1% discrepancy in target versus actual
|
||||||
const float rate_delta = fabsf(float(clock / prescaler) - target_rate) / target_rate;
|
const float rate_delta = fabsf(float(clock / prescaler) - target_rate) / target_rate;
|
||||||
EXPECT_TRUE(rate_delta < 0.13f);
|
EXPECT_TRUE(rate_delta < 0.20f);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user