mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-09 22:49:53 +08:00
[dshot] fix dshot telemetry and provide pprz message support (#3033)
* [dshot] fix dshot telemetry and provide pprz message support each dshot driver supports it's own telemetry uart pprz message ESC can be sent over telemetry or flight recorder configuration is done by giving the uart number * [dshot] send RPM Abi message from DSHOT driver
This commit is contained in:
committed by
GitHub
parent
5dacd6a666
commit
e7781e7b87
@@ -202,6 +202,7 @@
|
||||
<message name="IMU_ACCEL_SCALED" period=".075"/>
|
||||
<message name="IMU_MAG_SCALED" period=".2"/>
|
||||
<message name="LIDAR" period="0.05"/>
|
||||
<message name="ESC" period="0.05"/>
|
||||
</mode>
|
||||
</process>
|
||||
|
||||
|
||||
@@ -27,11 +27,23 @@
|
||||
|
||||
#include "modules/actuators/actuators_dshot.h"
|
||||
#include "modules/actuators/esc_dshot.h"
|
||||
#include "modules/core/abi.h"
|
||||
#include "mcu_periph/ram_arch.h"
|
||||
#include "mcu_periph/gpio.h"
|
||||
#include BOARD_CONFIG
|
||||
|
||||
uint16_t actuators_dshot_values[ACTUATORS_DSHOT_NB];
|
||||
#if PERIODIC_TELEMETRY
|
||||
#include "modules/datalink/telemetry.h"
|
||||
#include "modules/energy/electrical.h"
|
||||
#endif
|
||||
|
||||
struct dshot_private {
|
||||
DSHOTDriver *driver;
|
||||
uint32_t channel;
|
||||
};
|
||||
|
||||
struct dshot actuators_dshot_values[ACTUATORS_DSHOT_NB];
|
||||
struct dshot_private actuators_dshot_private[ACTUATORS_DSHOT_NB];
|
||||
|
||||
#if DSHOT_CONF_TIM1
|
||||
static DSHOTDriver DSHOTD1;
|
||||
@@ -69,47 +81,153 @@ static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot9DmaBuffer);
|
||||
static DSHOTConfig dshotcfg9 = DSHOT_CONF9_DEF;
|
||||
#endif
|
||||
|
||||
#if PERIODIC_TELEMETRY
|
||||
static void esc_msg_send(struct transport_tx *trans, struct link_device *dev) {
|
||||
for (uint8_t i = 0; i < ACTUATORS_DSHOT_NB; i++) {
|
||||
if (actuators_dshot_values[i].activated) {
|
||||
const DshotTelemetry *dtelem = dshotGetTelemetry(actuators_dshot_private[i].driver, actuators_dshot_private[i].channel);
|
||||
|
||||
actuators_dshot_values[i].current = (float)dtelem->current * 0.01f;
|
||||
actuators_dshot_values[i].voltage = (float)dtelem->voltage * 0.01f;
|
||||
actuators_dshot_values[i].rpm = (float)dtelem->rpm;
|
||||
float bat_voltage = electrical.vsupply;
|
||||
float power = actuators_dshot_values[i].current * bat_voltage;
|
||||
float energy = (float)dtelem->consumption;
|
||||
pprz_msg_send_ESC(trans, dev, AC_ID,
|
||||
&actuators_dshot_values[i].current,
|
||||
&bat_voltage,
|
||||
&power,
|
||||
&actuators_dshot_values[i].rpm,
|
||||
&actuators_dshot_values[i].voltage,
|
||||
&energy,
|
||||
&i);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void dshot_init_struct(struct dshot * ds)
|
||||
{
|
||||
ds->cmd = 0;
|
||||
ds->rpm = 0;
|
||||
ds->current = 0;
|
||||
ds->voltage = 0;
|
||||
ds->activated = false;
|
||||
}
|
||||
|
||||
static void dshot_set_struct(struct dshot * ds, struct dshot_private * dsp, DSHOTDriver * driver, uint32_t channel)
|
||||
{
|
||||
ds->activated = true;
|
||||
dsp->driver = driver;
|
||||
dsp->channel = channel;
|
||||
}
|
||||
|
||||
#define _CONCAT_GPIO(num, name) UART ## num ## _GPIO_ ## name
|
||||
#define CONCAT_GPIO(num, name) _CONCAT_GPIO(num, name)
|
||||
|
||||
void actuators_dshot_arch_init(void)
|
||||
{
|
||||
// init dshot structure to zero
|
||||
for (int i = 0; i < ACTUATORS_DSHOT_NB; i++) {
|
||||
dshot_init_struct(&actuators_dshot_values[i]);
|
||||
}
|
||||
|
||||
// configure telemetry pin if needed
|
||||
// the serial device interface might have to be activated
|
||||
// by hand (ChibiOS HAL), but PPRZ one disabled
|
||||
#ifdef DSHOT_TIM1_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM1_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM1_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM1_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
#ifdef DSHOT_TIM2_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM2_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM2_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM2_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
#ifdef DSHOT_TIM3_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM3_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM3_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM3_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
#ifdef DSHOT_TIM4_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM4_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM4_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM4_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
#ifdef DSHOT_TIM5_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM5_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM5_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM5_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
#ifdef DSHOT_TIM8_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM8_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM8_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM8_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
#ifdef DSHOT_TIM9_TELEMETRY_NUM
|
||||
gpio_setup_pin_af(
|
||||
CONCAT_GPIO(DSHOT_TIM9_TELEMETRY_NUM, PORT_RX),
|
||||
CONCAT_GPIO(DSHOT_TIM9_TELEMETRY_NUM, RX),
|
||||
CONCAT_GPIO(DSHOT_TIM9_TELEMETRY_NUM, AF), FALSE);
|
||||
#endif
|
||||
|
||||
/*----------------
|
||||
* Configure GPIO
|
||||
*----------------*/
|
||||
#ifdef DSHOT_SERVO_0
|
||||
gpio_setup_pin_af(DSHOT_SERVO_0_GPIO, DSHOT_SERVO_0_PIN, DSHOT_SERVO_0_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_0], &actuators_dshot_private[DSHOT_SERVO_0], &DSHOT_SERVO_0_DRIVER, DSHOT_SERVO_0_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_1
|
||||
gpio_setup_pin_af(DSHOT_SERVO_1_GPIO, DSHOT_SERVO_1_PIN, DSHOT_SERVO_1_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_1], &actuators_dshot_private[DSHOT_SERVO_1], &DSHOT_SERVO_1_DRIVER, DSHOT_SERVO_1_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_2
|
||||
gpio_setup_pin_af(DSHOT_SERVO_2_GPIO, DSHOT_SERVO_2_PIN, DSHOT_SERVO_2_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_2], &actuators_dshot_private[DSHOT_SERVO_2], &DSHOT_SERVO_2_DRIVER, DSHOT_SERVO_2_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_3
|
||||
gpio_setup_pin_af(DSHOT_SERVO_3_GPIO, DSHOT_SERVO_3_PIN, DSHOT_SERVO_3_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_3], &actuators_dshot_private[DSHOT_SERVO_3], &DSHOT_SERVO_3_DRIVER, DSHOT_SERVO_3_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_4
|
||||
gpio_setup_pin_af(DSHOT_SERVO_4_GPIO, DSHOT_SERVO_4_PIN, DSHOT_SERVO_4_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_4], &actuators_dshot_private[DSHOT_SERVO_4], &DSHOT_SERVO_4_DRIVER, DSHOT_SERVO_4_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_5
|
||||
gpio_setup_pin_af(DSHOT_SERVO_5_GPIO, DSHOT_SERVO_5_PIN, DSHOT_SERVO_5_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_5], &actuators_dshot_private[DSHOT_SERVO_5], &DSHOT_SERVO_5_DRIVER, DSHOT_SERVO_5_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_6
|
||||
gpio_setup_pin_af(DSHOT_SERVO_6_GPIO, DSHOT_SERVO_6_PIN, DSHOT_SERVO_6_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_6], &actuators_dshot_private[DSHOT_SERVO_6], &DSHOT_SERVO_6_DRIVER, DSHOT_SERVO_6_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_7
|
||||
gpio_setup_pin_af(DSHOT_SERVO_7_GPIO, DSHOT_SERVO_7_PIN, DSHOT_SERVO_7_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_7], &actuators_dshot_private[DSHOT_SERVO_7], &DSHOT_SERVO_7_DRIVER, DSHOT_SERVO_7_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_8
|
||||
gpio_setup_pin_af(DSHOT_SERVO_8_GPIO, DSHOT_SERVO_8_PIN, DSHOT_SERVO_8_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_8], &actuators_dshot_private[DSHOT_SERVO_8], &DSHOT_SERVO_8_DRIVER, DSHOT_SERVO_8_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_9
|
||||
gpio_setup_pin_af(DSHOT_SERVO_9_GPIO, DSHOT_SERVO_9_PIN, DSHOT_SERVO_9_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_9], &actuators_dshot_private[DSHOT_SERVO_9], &DSHOT_SERVO_9_DRIVER, DSHOT_SERVO_9_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_10
|
||||
gpio_setup_pin_af(DSHOT_SERVO_10_GPIO, DSHOT_SERVO_10_PIN, DSHOT_SERVO_10_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_10], &actuators_dshot_private[DSHOT_SERVO_10], &DSHOT_SERVO_10_DRIVER, DSHOT_SERVO_10_CHANNEL);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_11
|
||||
gpio_setup_pin_af(DSHOT_SERVO_11_GPIO, DSHOT_SERVO_11_PIN, DSHOT_SERVO_11_AF, true);
|
||||
dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_11], &actuators_dshot_private[DSHOT_SERVO_11], &DSHOT_SERVO_11_DRIVER, DSHOT_SERVO_11_CHANNEL);
|
||||
#endif
|
||||
|
||||
/*---------------
|
||||
@@ -136,46 +254,50 @@ void actuators_dshot_arch_init(void)
|
||||
#if DSHOT_CONF_TIM9
|
||||
dshotStart(&DSHOTD9, &dshotcfg9);
|
||||
#endif
|
||||
|
||||
#if PERIODIC_TELEMETRY
|
||||
register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_ESC, esc_msg_send);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void actuators_dshot_arch_commit(void)
|
||||
{
|
||||
#ifdef DSHOT_SERVO_0
|
||||
dshotSetThrottle(&DSHOT_SERVO_0_DRIVER, DSHOT_SERVO_0_CHANNEL, actuators_dshot_values[DSHOT_SERVO_0]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_0_DRIVER, DSHOT_SERVO_0_CHANNEL, actuators_dshot_values[DSHOT_SERVO_0].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_1
|
||||
dshotSetThrottle(&DSHOT_SERVO_1_DRIVER, DSHOT_SERVO_1_CHANNEL, actuators_dshot_values[DSHOT_SERVO_1]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_1_DRIVER, DSHOT_SERVO_1_CHANNEL, actuators_dshot_values[DSHOT_SERVO_1].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_2
|
||||
dshotSetThrottle(&DSHOT_SERVO_2_DRIVER, DSHOT_SERVO_2_CHANNEL, actuators_dshot_values[DSHOT_SERVO_2]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_2_DRIVER, DSHOT_SERVO_2_CHANNEL, actuators_dshot_values[DSHOT_SERVO_2].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_3
|
||||
dshotSetThrottle(&DSHOT_SERVO_3_DRIVER, DSHOT_SERVO_3_CHANNEL, actuators_dshot_values[DSHOT_SERVO_3]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_3_DRIVER, DSHOT_SERVO_3_CHANNEL, actuators_dshot_values[DSHOT_SERVO_3].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_4
|
||||
dshotSetThrottle(&DSHOT_SERVO_4_DRIVER, DSHOT_SERVO_4_CHANNEL, actuators_dshot_values[DSHOT_SERVO_4]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_4_DRIVER, DSHOT_SERVO_4_CHANNEL, actuators_dshot_values[DSHOT_SERVO_4].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_5
|
||||
dshotSetThrottle(&DSHOT_SERVO_5_DRIVER, DSHOT_SERVO_5_CHANNEL, actuators_dshot_values[DSHOT_SERVO_5]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_5_DRIVER, DSHOT_SERVO_5_CHANNEL, actuators_dshot_values[DSHOT_SERVO_5].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_6
|
||||
dshotSetThrottle(&DSHOT_SERVO_6_DRIVER, DSHOT_SERVO_6_CHANNEL, actuators_dshot_values[DSHOT_SERVO_6]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_6_DRIVER, DSHOT_SERVO_6_CHANNEL, actuators_dshot_values[DSHOT_SERVO_6].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_7
|
||||
dshotSetThrottle(&DSHOT_SERVO_7_DRIVER, DSHOT_SERVO_7_CHANNEL, actuators_dshot_values[DSHOT_SERVO_7]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_7_DRIVER, DSHOT_SERVO_7_CHANNEL, actuators_dshot_values[DSHOT_SERVO_7].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_8
|
||||
dshotSetThrottle(&DSHOT_SERVO_8_DRIVER, DSHOT_SERVO_8_CHANNEL, actuators_dshot_values[DSHOT_SERVO_8]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_8_DRIVER, DSHOT_SERVO_8_CHANNEL, actuators_dshot_values[DSHOT_SERVO_8].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_9
|
||||
dshotSetThrottle(&DSHOT_SERVO_9_DRIVER, DSHOT_SERVO_9_CHANNEL, actuators_dshot_values[DSHOT_SERVO_9]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_9_DRIVER, DSHOT_SERVO_9_CHANNEL, actuators_dshot_values[DSHOT_SERVO_9].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_10
|
||||
dshotSetThrottle(&DSHOT_SERVO_10_DRIVER, DSHOT_SERVO_10_CHANNEL, actuators_dshot_values[DSHOT_SERVO_10]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_10_DRIVER, DSHOT_SERVO_10_CHANNEL, actuators_dshot_values[DSHOT_SERVO_10].cmd);
|
||||
#endif
|
||||
#ifdef DSHOT_SERVO_11
|
||||
dshotSetThrottle(&DSHOT_SERVO_11_DRIVER, DSHOT_SERVO_11_CHANNEL, actuators_dshot_values[DSHOT_SERVO_11]);
|
||||
dshotSetThrottle(&DSHOT_SERVO_11_DRIVER, DSHOT_SERVO_11_CHANNEL, actuators_dshot_values[DSHOT_SERVO_11].cmd);
|
||||
#endif
|
||||
|
||||
#if DSHOT_CONF_TIM1
|
||||
@@ -199,4 +321,13 @@ void actuators_dshot_arch_commit(void)
|
||||
#if DSHOT_CONF_TIM9
|
||||
dshotSendFrame(&DSHOTD9);
|
||||
#endif
|
||||
|
||||
uint16_t rpm_list[ACTUATORS_DSHOT_NB] = { 0 };
|
||||
for (uint8_t i = 0; i < ACTUATORS_DSHOT_NB; i++) {
|
||||
if (actuators_dshot_values[i].activated) {
|
||||
const DshotTelemetry *dtelem = dshotGetTelemetry(actuators_dshot_private[i].driver, actuators_dshot_private[i].channel);
|
||||
rpm_list[i] = dtelem->rpm;
|
||||
}
|
||||
}
|
||||
AbiSendMsgRPM(RPM_DSHOT_ID, rpm_list, ACTUATORS_DSHOT_NB);
|
||||
}
|
||||
|
||||
@@ -126,9 +126,9 @@ void dshotStart(DSHOTDriver *driver, const DSHOTConfig *config)
|
||||
|
||||
static const SerialConfig tlmcfg = {
|
||||
.speed = DSHOT_TELEMETRY_BAUD,
|
||||
.cr1 = 0, // pas de parité
|
||||
.cr1 = 0, // pas de parité
|
||||
.cr2 = USART_CR2_STOP1_BITS, // 1 bit de stop
|
||||
.cr3 = 0 // pas de controle de flux hardware (CTS, RTS)
|
||||
.cr3 = 0 // pas de controle de flux hardware (CTS, RTS)
|
||||
};
|
||||
|
||||
driver->config = config;
|
||||
@@ -341,7 +341,7 @@ uint32_t dshotGetCrcErrorsCount(DSHOTDriver *driver)
|
||||
*/
|
||||
const DshotTelemetry *dshotGetTelemetry(const DSHOTDriver *driver, const uint32_t index)
|
||||
{
|
||||
return &driver->dshotMotors.dt[index];
|
||||
return &driver->dshotMotors.dt[index - DSHOT_CHANNEL_FIRST_INDEX];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -364,46 +364,65 @@
|
||||
/*
|
||||
* SERIAL driver system settings.
|
||||
*/
|
||||
#ifndef STM32_SERIAL_USE_USART1
|
||||
#if USE_UART1
|
||||
#define STM32_SERIAL_USE_USART1 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_USART1 FALSE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_USART2
|
||||
#if USE_UART2
|
||||
#define STM32_SERIAL_USE_USART2 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_USART2 FALSE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_USART3
|
||||
#if USE_UART3
|
||||
#define STM32_SERIAL_USE_USART3 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_USART3 FALSE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_UART4
|
||||
#if USE_UART4
|
||||
#define STM32_SERIAL_USE_UART4 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_UART4 FALSE
|
||||
#endif
|
||||
#if USE_UART5
|
||||
#define STM32_SERIAL_USE_UART5 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_UART5 FALSE
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_UART5
|
||||
#define STM32_SERIAL_USE_UART5 TRUE // enabled by default for dshot telemetry
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_USART6
|
||||
#if USE_UART6
|
||||
#define STM32_SERIAL_USE_USART6 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_USART6 FALSE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_UART7
|
||||
#if USE_UART7
|
||||
#define STM32_SERIAL_USE_UART7 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_UART7 FALSE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef STM32_SERIAL_USE_UART8
|
||||
#if USE_UART8
|
||||
#define STM32_SERIAL_USE_UART8 TRUE
|
||||
#else
|
||||
#define STM32_SERIAL_USE_UART8 FALSE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* SPI driver system settings.
|
||||
|
||||
@@ -378,10 +378,22 @@
|
||||
/**
|
||||
* DSHOT
|
||||
*/
|
||||
#ifndef DSHOT_TELEMETRY_DEV
|
||||
#define DSHOT_TELEMETRY_DEV NULL
|
||||
#ifdef DSHOT_TIM4_TELEMETRY_NUM
|
||||
#define DSHOT_TIM4_TELEMETRY_DEV CONCAT_BOARD_PARAM(&SD, DSHOT_TIM4_TELEMETRY_NUM)
|
||||
#else
|
||||
#define DSHOT_TIM4_TELEMETRY_DEV NULL
|
||||
#endif
|
||||
|
||||
#ifdef DSHOT_TIM1_TELEMETRY_NUM
|
||||
#define DSHOT_TIM1_TELEMETRY_DEV CONCAT_BOARD_PARAM(&SD, DSHOT_TIM1_TELEMETRY_NUM)
|
||||
#else
|
||||
#define DSHOT_TIM1_TELEMETRY_DEV NULL
|
||||
#endif
|
||||
|
||||
// macros for possible dshot telemetry
|
||||
#define DSHOT_TLM_RX 5
|
||||
#define DSHOT_TLM_AUX_RX 4
|
||||
|
||||
#ifndef USE_DSHOT_TIM4
|
||||
#define USE_DSHOT_TIM4 1 // use SRVb for DShot by default
|
||||
#endif
|
||||
@@ -422,7 +434,7 @@
|
||||
.dma_stream = STM32_PWM4_UP_DMA_STREAM, \
|
||||
.dma_channel = STM32_PWM4_UP_DMA_CHANNEL, \
|
||||
.pwmp = &PWMD4, \
|
||||
.tlm_sd = DSHOT_TELEMETRY_DEV, \
|
||||
.tlm_sd = DSHOT_TIM4_TELEMETRY_DEV, \
|
||||
.dma_buf = &dshot4DmaBuffer, \
|
||||
.dcache_memory_in_use = false \
|
||||
}
|
||||
@@ -464,7 +476,7 @@
|
||||
.dma_stream = STM32_PWM1_UP_DMA_STREAM, \
|
||||
.dma_channel = STM32_PWM1_UP_DMA_CHANNEL, \
|
||||
.pwmp = &PWMD1, \
|
||||
.tlm_sd = DSHOT_TELEMETRY_DEV, \
|
||||
.tlm_sd = DSHOT_TIM1_TELEMETRY_DEV, \
|
||||
.dma_buf = &dshot1DmaBuffer, \
|
||||
.dcache_memory_in_use = false \
|
||||
}
|
||||
@@ -510,6 +522,14 @@
|
||||
#define UART4_GPIO_RX PAL_PAD(LINE_AUX_A2)
|
||||
#define UART4_GPIO_AF AUX_A1_UART_AF
|
||||
|
||||
/**
|
||||
* UART5 on SRVB (DSHOT telemetry)
|
||||
*/
|
||||
|
||||
#define UART5_GPIO_PORT_RX PAL_PORT(LINE_DSHOT_RX)
|
||||
#define UART5_GPIO_RX PAL_PAD(LINE_DSHOT_RX)
|
||||
#define UART5_GPIO_AF AF_DSHOT_RX
|
||||
|
||||
/**
|
||||
* SBUS / Spektrum port
|
||||
*
|
||||
|
||||
@@ -46,7 +46,15 @@
|
||||
#define ACTUATORS_DSHOT_NB (8+1)
|
||||
#endif
|
||||
|
||||
extern uint16_t actuators_dshot_values[ACTUATORS_DSHOT_NB];
|
||||
struct dshot {
|
||||
float cmd; ///< command
|
||||
float rpm; ///< rpm
|
||||
float current; ///< current
|
||||
float voltage; ///< motor current
|
||||
bool activated; ///< current dshot channel is activated
|
||||
};
|
||||
|
||||
extern struct dshot actuators_dshot_values[ACTUATORS_DSHOT_NB];
|
||||
|
||||
/** Arch dependent init
|
||||
*/
|
||||
@@ -55,8 +63,8 @@ extern void actuators_dshot_arch_commit(void);
|
||||
|
||||
/* Actuator macros */
|
||||
#define ActuatorDShotSet(_i, _v) { \
|
||||
if (_v == 0) { actuators_dshot_values[_i] = 0; } \
|
||||
else { actuators_dshot_values[_i] = _v + ACTUATORS_DSHOT_OFFSET; } \
|
||||
if (_v == 0) { actuators_dshot_values[_i].cmd = 0; } \
|
||||
else { actuators_dshot_values[_i].cmd = _v + ACTUATORS_DSHOT_OFFSET; } \
|
||||
}
|
||||
#define ActuatorsDShotInit() actuators_dshot_arch_init()
|
||||
#define ActuatorsDShotCommit() actuators_dshot_arch_commit()
|
||||
|
||||
@@ -463,6 +463,10 @@
|
||||
#define RPM_SENSOR_ID 1
|
||||
#endif
|
||||
|
||||
#ifndef RPM_DSHOT_ID
|
||||
#define RPM_DSHOT_ID 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDs of THRUST increment calculation (message 16)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user