AP_HAL_QURT: Added support for PWM channels 4 to 8 when using the IO board

This commit is contained in:
Eric Katzfey 2024-12-23 11:18:13 -08:00 committed by Andrew Tridgell
parent 94eaa71182
commit 5a8bc16170
2 changed files with 9 additions and 11 deletions

View File

@ -153,7 +153,7 @@ void RCOutput::send_esc_command(void)
// We don't set any LEDs // We don't set any LEDs
data[4] = 0; data[4] = 0;
for (uint8_t i=0; i<channel_count; i++) { for (uint8_t i=0; i<esc_channel_count; i++) {
data[i] = pwm_to_esc(pwm_output[i]); data[i] = pwm_to_esc(pwm_output[i]);
// Make sure feedback request bit is cleared for all ESCs // Make sure feedback request bit is cleared for all ESCs
data[i] &= 0xFFFE; data[i] &= 0xFFFE;
@ -186,13 +186,9 @@ void RCOutput::send_io_command(void)
// Resolution of commands in the packet is 0.05us = 50ns // Resolution of commands in the packet is 0.05us = 50ns
// Convert from standard 1us resolution to IO command resolution // Convert from standard 1us resolution to IO command resolution
for (uint32_t idx=0; idx<channel_count; idx++) { for (uint32_t idx=0; idx<io_channel_count; idx++) {
hires_pwm_cmd.vals[idx] = pwm_output[idx] * 20; hires_pwm_cmd.vals[idx] = pwm_output[idx] * 20;
} }
// Channels 4 - 8 not supported right now
for (uint32_t idx=4; idx<8; idx++) {
hires_pwm_cmd.vals[idx] = 0;
}
send_packet(IO_PACKET_TYPE_PWM_HIRES_CMD, (uint8_t *) &hires_pwm_cmd, sizeof(hires_pwm_cmd)); send_packet(IO_PACKET_TYPE_PWM_HIRES_CMD, (uint8_t *) &hires_pwm_cmd, sizeof(hires_pwm_cmd));
} }
@ -207,7 +203,7 @@ void RCOutput::send_pwm_output(void)
safety_mask = boardconfig->get_safety_mask(); safety_mask = boardconfig->get_safety_mask();
} }
for (uint8_t i=0; i<channel_count; i++) { for (uint8_t i=0; i<max_channel_count; i++) {
uint16_t v = period[i]; uint16_t v = period[i];
if (safety_on && (safety_mask & (1U<<i)) == 0) { if (safety_on && (safety_mask & (1U<<i)) == 0) {
// when safety is on we send 0, which allows us to still // when safety is on we send 0, which allows us to still
@ -307,7 +303,7 @@ void RCOutput::handle_version_feedback(const struct extended_version_info &pkt)
void RCOutput::handle_esc_feedback(const struct esc_response_v2 &pkt) void RCOutput::handle_esc_feedback(const struct esc_response_v2 &pkt)
{ {
const uint8_t idx = pkt.id_state>>4; const uint8_t idx = pkt.id_state>>4;
if (idx >= ARRAY_SIZE(period)) { if (idx >= esc_channel_count) {
return; return;
} }
update_rpm(idx, pkt.rpm); update_rpm(idx, pkt.rpm);

View File

@ -105,9 +105,11 @@ private:
int fd = -1; int fd = -1;
uint16_t enable_mask; uint16_t enable_mask;
static const uint8_t channel_count = 4; static const uint8_t max_channel_count = 8;
uint16_t period[channel_count]; static const uint8_t esc_channel_count = 4;
uint16_t pwm_output[channel_count]; static const uint8_t io_channel_count = 8;
uint16_t period[max_channel_count];
uint16_t pwm_output[max_channel_count];
volatile bool need_write; volatile bool need_write;
bool corked; bool corked;
HAL_Semaphore mutex; HAL_Semaphore mutex;