fix pwm_out: ensure up_pwm_servo_arm() is never continuously called

This happened with multi-instance, when the second instance did not load
a mixer. Then the first instance would always return false in
update_pwm_out_state, and continuously call up_pwm_servo_arm.
This led to irregular pulses, e.g. with an output set to fixed 1500us, I
saw pulses of e.g. 1800us occationally (they were in a range of
[1500-2100]).
This commit is contained in:
Beat Küng 2021-09-20 07:34:17 +02:00 committed by Daniel Agar
parent 838ec5d485
commit 8b3ab7e36d
1 changed files with 11 additions and 4 deletions

View File

@ -35,7 +35,7 @@
pthread_mutex_t pwm_out_module_mutex = PTHREAD_MUTEX_INITIALIZER;
static px4::atomic<PWMOut *> _objects[PWM_OUT_MAX_INSTANCES] {};
static px4::atomic<int> _all_instances_ready {0};
static px4::atomic_bool _require_arming[PWM_OUT_MAX_INSTANCES] {};
static bool is_running()
{
@ -394,7 +394,13 @@ bool PWMOut::update_pwm_out_state(bool on)
set_pwm_rate(get_alt_rate_channels(), get_default_rate(), get_alt_rate());
_pwm_initialized = true;
_all_instances_ready.fetch_add(1);
// Other instances need to call up_pwm_servo_arm again after we initialized
for (int i = 0; i < PWM_OUT_MAX_INSTANCES; i++) {
if (i != _instance) {
_require_arming[i].store(true);
}
}
} else {
PX4_ERR("up_pwm_servo_init failed (%i)", ret);
@ -402,8 +408,9 @@ bool PWMOut::update_pwm_out_state(bool on)
}
}
_require_arming[_instance].store(false);
up_pwm_servo_arm(on, _pwm_mask);
return _all_instances_ready.load() == PWM_OUT_MAX_INSTANCES || _mixing_output.useDynamicMixing();
return true;
}
bool PWMOut::updateOutputs(bool stop_motors, uint16_t outputs[MAX_ACTUATORS],
@ -461,7 +468,7 @@ void PWMOut::Run()
bool pwm_on = _mixing_output.armed().armed || (_num_disarmed_set > 0) || _mixing_output.useDynamicMixing()
|| _mixing_output.armed().in_esc_calibration_mode;
if (_pwm_on != pwm_on) {
if (_pwm_on != pwm_on || _require_arming[_instance].load()) {
if (update_pwm_out_state(pwm_on)) {
_pwm_on = pwm_on;