mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-03 14:58:53 +08:00
RPMCapture: much better timeout scheduling
Not timing out based on a random interval but based on the time after the last inerrupt.
This commit is contained in:
@@ -43,7 +43,7 @@ RPMCapture::RPMCapture() :
|
|||||||
ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::hp_default)
|
ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::hp_default)
|
||||||
{
|
{
|
||||||
_pwm_input_pub.advertise();
|
_pwm_input_pub.advertise();
|
||||||
ScheduleOnInterval(1_s);
|
ScheduleNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
RPMCapture::~RPMCapture()
|
RPMCapture::~RPMCapture()
|
||||||
@@ -104,6 +104,7 @@ void RPMCapture::Run()
|
|||||||
hrt_abstime now = hrt_absolute_time();
|
hrt_abstime now = hrt_absolute_time();
|
||||||
|
|
||||||
if (!_value_processed.load()) {
|
if (!_value_processed.load()) {
|
||||||
|
// There was an interrupt
|
||||||
_period = _hrt_timestamp - _hrt_timestamp_prev;
|
_period = _hrt_timestamp - _hrt_timestamp_prev;
|
||||||
_hrt_timestamp_prev = _hrt_timestamp;
|
_hrt_timestamp_prev = _hrt_timestamp;
|
||||||
_value_processed.store(true);
|
_value_processed.store(true);
|
||||||
@@ -114,15 +115,23 @@ void RPMCapture::Run()
|
|||||||
pwm_input.error_count = _error_count;
|
pwm_input.error_count = _error_count;
|
||||||
_pwm_input_pub.publish(pwm_input);
|
_pwm_input_pub.publish(pwm_input);
|
||||||
|
|
||||||
} else if (now > _hrt_timestamp_prev + 1_s) {
|
// Schedule for next timeout
|
||||||
|
ScheduleClear();
|
||||||
|
ScheduleDelayed(RPM_PULSE_TIMEOUT);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Timeout for no interrupts
|
||||||
_period = 0;
|
_period = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
float rpm_raw{0.f};
|
float rpm_raw{0.f};
|
||||||
|
|
||||||
if ((1 < _period) && (_period < 1_s)) {
|
if ((1 < _period) && (_period < RPM_PULSE_TIMEOUT)) {
|
||||||
// 1'000'000 / [us] -> pulses per second * 60 -> pulses per minute
|
// 1'000'000 / [us] -> pulses per second * 60 -> pulses per minute
|
||||||
rpm_raw = 60.f * 1e6f / (static_cast<float>(_period) * 1.f);
|
rpm_raw = 60.f * 1e6f / (static_cast<float>(_period) * 1.f);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_rpm_filter.reset(rpm_raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float dt = math::constrain((now - _timestamp_last_update) * 1e-6f, 0.01f, 1.f);
|
const float dt = math::constrain((now - _timestamp_last_update) * 1e-6f, 0.01f, 1.f);
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ public:
|
|||||||
static void stop();
|
static void stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static constexpr hrt_abstime RPM_PULSE_TIMEOUT = 1_s;
|
||||||
|
|
||||||
void Run() override;
|
void Run() override;
|
||||||
|
|
||||||
int _channel{-1};
|
int _channel{-1};
|
||||||
|
|||||||
Reference in New Issue
Block a user