Browse Source

AP_HAL_ChibiOS: ensure that non-dshot modes get regular 1Khz updates

zr-v5.1
Andy Piper 4 years ago committed by Andrew Tridgell
parent
commit
cb3b37d181
  1. 22
      libraries/AP_HAL_ChibiOS/RCOutput.cpp

22
libraries/AP_HAL_ChibiOS/RCOutput.cpp

@ -189,7 +189,9 @@ void RCOutput::rcout_thread() @@ -189,7 +189,9 @@ void RCOutput::rcout_thread()
// now unlock everything
dshot_collect_dma_locks(time_out_us);
_dshot_cycle = (_dshot_cycle + 1) % _dshot_rate;
if (_dshot_rate > 0) {
_dshot_cycle = (_dshot_cycle + 1) % _dshot_rate;
}
}
// process any pending RC output requests
@ -416,7 +418,8 @@ void RCOutput::set_default_rate(uint16_t freq_hz) @@ -416,7 +418,8 @@ void RCOutput::set_default_rate(uint16_t freq_hz)
}
/*
Set the dshot rate as a multiple of the loop rate
Set the dshot rate as a multiple of the loop rate.
This is called late after init_ardupilot() so groups will have been setup
*/
void RCOutput::set_dshot_rate(uint8_t dshot_rate, uint16_t loop_rate_hz)
{
@ -427,6 +430,17 @@ void RCOutput::set_dshot_rate(uint8_t dshot_rate, uint16_t loop_rate_hz) @@ -427,6 +430,17 @@ void RCOutput::set_dshot_rate(uint8_t dshot_rate, uint16_t loop_rate_hz)
chEvtSignal(rcout_thread_ctx, EVT_PWM_START);
return;
}
// if there are non-dshot channels then do likewise
for (auto &group : pwm_group_list) {
if (group.current_mode == MODE_PWM_ONESHOT ||
group.current_mode == MODE_PWM_ONESHOT125 ||
group.current_mode == MODE_PWM_BRUSHED) {
_dshot_period_us = 1000UL;
_dshot_rate = 0;
chEvtSignal(rcout_thread_ctx, EVT_PWM_START);
return;
}
}
uint16_t drate = dshot_rate * loop_rate_hz;
_dshot_rate = dshot_rate;
@ -1126,8 +1140,7 @@ void RCOutput::timer_tick(uint32_t time_out_us) @@ -1126,8 +1140,7 @@ void RCOutput::timer_tick(uint32_t time_out_us)
if (min_pulse_trigger_us == 0) {
return;
}
#if !APM_BUILD_TYPE(APM_BUILD_ArduCopter)
// this exists simply to cater for non-multirotors whose loop rate might be 50Hz
uint32_t now = AP_HAL::micros();
if (now > min_pulse_trigger_us &&
@ -1135,7 +1148,6 @@ void RCOutput::timer_tick(uint32_t time_out_us) @@ -1135,7 +1148,6 @@ void RCOutput::timer_tick(uint32_t time_out_us)
// trigger at a minimum of 250Hz
trigger_groups();
}
#endif
}
// send dshot for all groups that support it

Loading…
Cancel
Save