Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
actuators_dshot_arch.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018 Gautier Hattenberger <gautier.hattenberger@enac.fr>
3  *
4  * This file is part of paparazzi
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
30 #include "modules/core/abi.h"
31 #include "mcu_periph/ram_arch.h"
32 #include "mcu_periph/gpio.h"
33 #include BOARD_CONFIG
34 
35 #if PERIODIC_TELEMETRY
38 #endif
39 
40 struct dshot_private {
43 };
44 
47 
48 #if DSHOT_CONF_TIM1
49 static DSHOTDriver DSHOTD1;
50 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot1DmaBuffer);
51 static DSHOTConfig dshotcfg1 = DSHOT_CONF1_DEF;
52 #endif
53 #if DSHOT_CONF_TIM2
54 static DSHOTDriver DSHOTD2;
55 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot2DmaBuffer);
56 static DSHOTConfig dshotcfg2 = DSHOT_CONF2_DEF;
57 #endif
58 #if DSHOT_CONF_TIM3
59 static DSHOTDriver DSHOTD3;
60 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot3DmaBuffer);
61 static DSHOTConfig dshotcfg3 = DSHOT_CONF3_DEF;
62 #endif
63 #if DSHOT_CONF_TIM4
64 static DSHOTDriver DSHOTD4;
65 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot4DmaBuffer);
66 static DSHOTConfig dshotcfg4 = DSHOT_CONF4_DEF;
67 #endif
68 #if DSHOT_CONF_TIM5
69 static DSHOTDriver DSHOTD5;
70 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot5DmaBuffer);
71 static DSHOTConfig dshotcfg5 = DSHOT_CONF5_DEF;
72 #endif
73 #if DSHOT_CONF_TIM8
74 static DSHOTDriver DSHOTD8;
75 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot8DmaBuffer);
76 static DSHOTConfig dshotcfg8 = DSHOT_CONF8_DEF;
77 #endif
78 #if DSHOT_CONF_TIM9
79 static DSHOTDriver DSHOTD9;
80 static IN_DMA_SECTION_NOINIT(DshotDmaBuffer dshot9DmaBuffer);
81 static DSHOTConfig dshotcfg9 = DSHOT_CONF9_DEF;
82 #endif
83 
84 #if PERIODIC_TELEMETRY
85 static void esc_msg_send(struct transport_tx *trans, struct link_device *dev) {
86  for (uint8_t i = 0; i < ACTUATORS_DSHOT_NB; i++) {
87  if (actuators_dshot_values[i].activated) {
89 
90  actuators_dshot_values[i].current = (float)dtelem->current * 0.01f;
91  actuators_dshot_values[i].voltage = (float)dtelem->voltage * 0.01f;
92  actuators_dshot_values[i].rpm = (float)dtelem->rpm;
93  float bat_voltage = electrical.vsupply;
94  float power = actuators_dshot_values[i].current * bat_voltage;
95  float energy = (float)dtelem->consumption;
96  float temp = dtelem->temp;
97  float temp_dev = 0;
98  pprz_msg_send_ESC(trans, dev, AC_ID,
99  &actuators_dshot_values[i].current,
100  &bat_voltage,
101  &power,
103  &actuators_dshot_values[i].voltage,
104  &energy,
105  &temp,
106  &temp_dev,
107  &i,
108  &i);
109  }
110  }
111 }
112 #endif
113 
114 static void dshot_init_struct(struct dshot * ds)
115 {
116  ds->cmd = 0;
117  ds->rpm = 0;
118  ds->current = 0;
119  ds->voltage = 0;
120  ds->activated = false;
121 }
122 
123 static void dshot_set_struct(struct dshot * ds, struct dshot_private * dsp, DSHOTDriver * driver, uint32_t channel)
124 {
125  ds->activated = true;
126  dsp->driver = driver;
127  dsp->channel = channel;
128 }
129 
130 #define _CONCAT_GPIO(num, name) UART ## num ## _GPIO_ ## name
131 #define CONCAT_GPIO(num, name) _CONCAT_GPIO(num, name)
132 
134 {
135  // init dshot structure to zero
136  for (int i = 0; i < ACTUATORS_DSHOT_NB; i++) {
138  }
139 
140  // configure telemetry pin if needed
141  // the serial device interface might have to be activated
142  // by hand (ChibiOS HAL), but PPRZ one disabled
143 #ifdef DSHOT_TIM1_TELEMETRY_NUM
145  CONCAT_GPIO(DSHOT_TIM1_TELEMETRY_NUM, PORT_RX),
146  CONCAT_GPIO(DSHOT_TIM1_TELEMETRY_NUM, RX),
147  CONCAT_GPIO(DSHOT_TIM1_TELEMETRY_NUM, AF), FALSE);
148  PRINT_CONFIG_VAR(DSHOT_TIM1_TELEMETRY_NUM);
149 #endif
150 #ifdef DSHOT_TIM2_TELEMETRY_NUM
152  CONCAT_GPIO(DSHOT_TIM2_TELEMETRY_NUM, PORT_RX),
153  CONCAT_GPIO(DSHOT_TIM2_TELEMETRY_NUM, RX),
154  CONCAT_GPIO(DSHOT_TIM2_TELEMETRY_NUM, AF), FALSE);
155 #endif
156 #ifdef DSHOT_TIM3_TELEMETRY_NUM
158  CONCAT_GPIO(DSHOT_TIM3_TELEMETRY_NUM, PORT_RX),
159  CONCAT_GPIO(DSHOT_TIM3_TELEMETRY_NUM, RX),
160  CONCAT_GPIO(DSHOT_TIM3_TELEMETRY_NUM, AF), FALSE);
161 #endif
162 #ifdef DSHOT_TIM4_TELEMETRY_NUM
164  CONCAT_GPIO(DSHOT_TIM4_TELEMETRY_NUM, PORT_RX),
165  CONCAT_GPIO(DSHOT_TIM4_TELEMETRY_NUM, RX),
166  CONCAT_GPIO(DSHOT_TIM4_TELEMETRY_NUM, AF), FALSE);
167  PRINT_CONFIG_VAR(DSHOT_TIM4_TELEMETRY_NUM);
168 #endif
169 #ifdef DSHOT_TIM5_TELEMETRY_NUM
171  CONCAT_GPIO(DSHOT_TIM5_TELEMETRY_NUM, PORT_RX),
172  CONCAT_GPIO(DSHOT_TIM5_TELEMETRY_NUM, RX),
173  CONCAT_GPIO(DSHOT_TIM5_TELEMETRY_NUM, AF), FALSE);
174 #endif
175 #ifdef DSHOT_TIM8_TELEMETRY_NUM
177  CONCAT_GPIO(DSHOT_TIM8_TELEMETRY_NUM, PORT_RX),
178  CONCAT_GPIO(DSHOT_TIM8_TELEMETRY_NUM, RX),
179  CONCAT_GPIO(DSHOT_TIM8_TELEMETRY_NUM, AF), FALSE);
180 #endif
181 #ifdef DSHOT_TIM9_TELEMETRY_NUM
183  CONCAT_GPIO(DSHOT_TIM9_TELEMETRY_NUM, PORT_RX),
184  CONCAT_GPIO(DSHOT_TIM9_TELEMETRY_NUM, RX),
185  CONCAT_GPIO(DSHOT_TIM9_TELEMETRY_NUM, AF), FALSE);
186 #endif
187 
188  /*----------------
189  * Configure GPIO
190  *----------------*/
191 #ifdef DSHOT_SERVO_0
194 #endif
195 #ifdef DSHOT_SERVO_1
198 #endif
199 #ifdef DSHOT_SERVO_2
202 #endif
203 #ifdef DSHOT_SERVO_3
206 #endif
207 #ifdef DSHOT_SERVO_4
210 #endif
211 #ifdef DSHOT_SERVO_5
214 #endif
215 #ifdef DSHOT_SERVO_6
216  gpio_setup_pin_af(DSHOT_SERVO_6_GPIO, DSHOT_SERVO_6_PIN, DSHOT_SERVO_6_AF, true);
217  dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_6], &actuators_dshot_private[DSHOT_SERVO_6], &DSHOT_SERVO_6_DRIVER, DSHOT_SERVO_6_CHANNEL);
218 #endif
219 #ifdef DSHOT_SERVO_7
222 #endif
223 #ifdef DSHOT_SERVO_8
226 #endif
227 #ifdef DSHOT_SERVO_9
230 #endif
231 #ifdef DSHOT_SERVO_10
234 #endif
235 #ifdef DSHOT_SERVO_11
236  gpio_setup_pin_af(DSHOT_SERVO_11_GPIO, DSHOT_SERVO_11_PIN, DSHOT_SERVO_11_AF, true);
237  dshot_set_struct(&actuators_dshot_values[DSHOT_SERVO_11], &actuators_dshot_private[DSHOT_SERVO_11], &DSHOT_SERVO_11_DRIVER, DSHOT_SERVO_11_CHANNEL);
238 #endif
239 
240  /*---------------
241  * Configure DSHOT
242  *---------------*/
243 #if DSHOT_CONF_TIM1
244  dshotStart(&DSHOTD1, &dshotcfg1);
245 #endif
246 #if DSHOT_CONF_TIM2
247  dshotStart(&DSHOTD2, &dshotcfg2);
248 #endif
249 #if DSHOT_CONF_TIM3
250  dshotStart(&DSHOTD3, &dshotcfg3);
251 #endif
252 #if DSHOT_CONF_TIM4
253  dshotStart(&DSHOTD4, &dshotcfg4);
254 #endif
255 #if DSHOT_CONF_TIM5
256  dshotStart(&DSHOTD5, &dshotcfg5);
257 #endif
258 #if DSHOT_CONF_TIM8
259  dshotStart(&DSHOTD8, &dshotcfg8);
260 #endif
261 #if DSHOT_CONF_TIM9
262  dshotStart(&DSHOTD9, &dshotcfg9);
263 #endif
264 
265 #if PERIODIC_TELEMETRY
267 #endif
268 }
269 
270 
272 {
273 #ifdef DSHOT_SERVO_0
275 #endif
276 #ifdef DSHOT_SERVO_1
278 #endif
279 #ifdef DSHOT_SERVO_2
281 #endif
282 #ifdef DSHOT_SERVO_3
284 #endif
285 #ifdef DSHOT_SERVO_4
287 #endif
288 #ifdef DSHOT_SERVO_5
290 #endif
291 #ifdef DSHOT_SERVO_6
292  dshotSetThrottle(&DSHOT_SERVO_6_DRIVER, DSHOT_SERVO_6_CHANNEL, actuators_dshot_values[DSHOT_SERVO_6].cmd);
293 #endif
294 #ifdef DSHOT_SERVO_7
296 #endif
297 #ifdef DSHOT_SERVO_8
299 #endif
300 #ifdef DSHOT_SERVO_9
302 #endif
303 #ifdef DSHOT_SERVO_10
305 #endif
306 #ifdef DSHOT_SERVO_11
307  dshotSetThrottle(&DSHOT_SERVO_11_DRIVER, DSHOT_SERVO_11_CHANNEL, actuators_dshot_values[DSHOT_SERVO_11].cmd);
308 #endif
309 
310 #if DSHOT_CONF_TIM1
311  dshotSendFrame(&DSHOTD1);
312 #endif
313 #if DSHOT_CONF_TIM2
314  dshotSendFrame(&DSHOTD2);
315 #endif
316 #if DSHOT_CONF_TIM3
317  dshotSendFrame(&DSHOTD3);
318 #endif
319 #if DSHOT_CONF_TIM4
320  dshotSendFrame(&DSHOTD4);
321 #endif
322 #if DSHOT_CONF_TIM5
323  dshotSendFrame(&DSHOTD5);
324 #endif
325 #if DSHOT_CONF_TIM8
326  dshotSendFrame(&DSHOTD8);
327 #endif
328 #if DSHOT_CONF_TIM9
329  dshotSendFrame(&DSHOTD9);
330 #endif
331 
332 
333  struct act_feedback_t feedback[ACTUATORS_DSHOT_NB] = { 0 };
334  for (uint8_t i = 0; i < ACTUATORS_DSHOT_NB; i++) {
335  feedback[i].idx = ACTUATORS_DSHOT_OFFSET + i;
336  if (actuators_dshot_values[i].activated) {
338  feedback[i].rpm = dtelem->rpm;
339  feedback[i].set.rpm = true;
340  }
341  }
342  AbiSendMsgACT_FEEDBACK(ACT_FEEDBACK_DSHOT_ID, feedback, ACTUATORS_DSHOT_NB);
343 }
Main include for ABI (AirBorneInterface).
#define ACT_FEEDBACK_DSHOT_ID
bool activated
current dshot channel is activated
float cmd
command
float current
current
float voltage
motor current
#define ACTUATORS_DSHOT_NB
Maxnum number of DSHOT commands This should be large enough for max applications: 8 motors +1 in case...
float rpm
rpm
#define ACTUATORS_DSHOT_OFFSET
In normal DSHOT, first 48 values are special commands this offset allow to use 0 as the no-throttle c...
#define DSHOT_SERVO_2_GPIO
Definition: board.h:353
#define DSHOT_SERVO_4_DRIVER
Definition: board.h:328
#define DSHOT_SERVO_2_CHANNEL
Definition: board.h:357
#define DSHOT_SERVO_2_AF
Definition: board.h:355
#define DSHOT_SERVO_5_DRIVER
Definition: board.h:334
#define DSHOT_SERVO_0_AF
Definition: board.h:349
#define DSHOT_SERVO_3_GPIO
Definition: board.h:359
#define DSHOT_CONF2_DEF
Definition: board.h:337
#define DSHOT_SERVO_2
Definition: board.h:352
#define DSHOT_SERVO_5_GPIO
Definition: board.h:331
#define DSHOT_SERVO_5
Definition: board.h:330
#define DSHOT_SERVO_1_DRIVER
Definition: board.h:322
#define DSHOT_SERVO_0_PIN
Definition: board.h:348
#define DSHOT_SERVO_1_PIN
Definition: board.h:320
#define DSHOT_SERVO_0_DRIVER
Definition: board.h:350
#define DSHOT_SERVO_3_PIN
Definition: board.h:360
#define DSHOT_SERVO_1_AF
Definition: board.h:321
#define DSHOT_SERVO_5_CHANNEL
Definition: board.h:335
#define DSHOT_CONF3_DEF
Definition: board.h:374
#define DSHOT_SERVO_0_CHANNEL
Definition: board.h:351
#define DSHOT_SERVO_1
Definition: board.h:318
#define DSHOT_SERVO_1_GPIO
Definition: board.h:319
#define DSHOT_SERVO_3_CHANNEL
Definition: board.h:363
#define DSHOT_SERVO_4_PIN
Definition: board.h:326
#define DSHOT_SERVO_3
Definition: board.h:358
#define DSHOT_SERVO_2_PIN
Definition: board.h:354
#define DSHOT_SERVO_1_CHANNEL
Definition: board.h:323
#define DSHOT_SERVO_3_AF
Definition: board.h:361
#define DSHOT_SERVO_5_PIN
Definition: board.h:332
#define DSHOT_SERVO_4
Definition: board.h:324
#define DSHOT_SERVO_0_GPIO
Definition: board.h:347
#define DSHOT_SERVO_5_AF
Definition: board.h:333
#define DSHOT_SERVO_3_DRIVER
Definition: board.h:362
#define DSHOT_SERVO_4_CHANNEL
Definition: board.h:329
#define DSHOT_SERVO_2_DRIVER
Definition: board.h:356
#define DSHOT_SERVO_4_AF
Definition: board.h:327
#define DSHOT_SERVO_4_GPIO
Definition: board.h:325
#define DSHOT_SERVO_0
Definition: board.h:346
void gpio_setup_pin_af(ioportid_t port, uint16_t pin, uint8_t af, bool is_output)
Setup a gpio for input or output with alternate function.
Definition: gpio_arch.c:61
void actuators_dshot_arch_init(void)
Arch dependent init.
struct dshot_private actuators_dshot_private[ACTUATORS_DSHOT_NB]
#define CONCAT_GPIO(num, name)
static void dshot_set_struct(struct dshot *ds, struct dshot_private *dsp, DSHOTDriver *driver, uint32_t channel)
struct dshot actuators_dshot_values[ACTUATORS_DSHOT_NB]
static void dshot_init_struct(struct dshot *ds)
static void esc_msg_send(struct transport_tx *trans, struct link_device *dev)
void actuators_dshot_arch_commit(void)
DSHOTDriver * driver
struct Electrical electrical
Definition: electrical.c:92
Interface for electrical status: supply voltage, current, battery status, etc.
float vsupply
supply voltage in V
Definition: electrical.h:45
void dshotStart(DSHOTDriver *driver, const DSHOTConfig *config)
Configures and activates the DSHOT peripheral.
Definition: esc_dshot.c:138
void dshotSetThrottle(DSHOTDriver *driver, const uint8_t index, const uint16_t throttle)
prepare throttle order for specified ESC
Definition: esc_dshot.c:230
void dshotSendFrame(DSHOTDriver *driver)
send throttle order
Definition: esc_dshot.c:322
const DshotTelemetry * dshotGetTelemetry(const DSHOTDriver *driver, const uint32_t index)
return last received telemetry data
Definition: esc_dshot.c:362
DSHOT driver based on ChibiOS.
DSHOT Driver configuration structure.
Definition: esc_dshot.h:155
telemetry packed as sent by some KISS ESC
Definition: esc_dshot.h:125
Some architecture independent helper functions for GPIOs.
#define DSHOT_SERVO_10_AF
#define DSHOT_SERVO_9_PIN
#define DSHOT_SERVO_9_DRIVER
#define DSHOT_SERVO_8
#define DSHOT_SERVO_7_GPIO
#define DSHOT_SERVO_8_CHANNEL
#define DSHOT_SERVO_8_AF
#define DSHOT_SERVO_8_PIN
#define DSHOT_SERVO_7_AF
#define DSHOT_SERVO_9_AF
#define DSHOT_SERVO_7_PIN
#define DSHOT_SERVO_10_PIN
#define DSHOT_SERVO_7_CHANNEL
#define DSHOT_SERVO_10_GPIO
#define DSHOT_SERVO_9_CHANNEL
#define DSHOT_CONF4_DEF
#define DSHOT_SERVO_9_GPIO
#define DSHOT_SERVO_10
#define DSHOT_SERVO_10_CHANNEL
#define DSHOT_SERVO_8_DRIVER
#define DSHOT_SERVO_8_GPIO
#define DSHOT_SERVO_9
#define DSHOT_SERVO_7_DRIVER
#define DSHOT_SERVO_10_DRIVER
#define DSHOT_SERVO_7
int32_t rpm
RPM.
Definition: actuators.h:51
struct act_feedback_t::act_feedback_set_t set
Bitset registering what is set as feedback.
uint8_t idx
General index of the actuators (generated in airframe.h)
Definition: actuators.h:45
Specific RAM section for DMA usage on F7.
#define IN_DMA_SECTION_NOINIT(var)
Definition: ram_arch.h:85
uint16_t rpm
Definition: rpm_sensor.c:33
#define FALSE
Definition: std.h:5
static const struct usb_device_descriptor dev
Definition: usb_ser_hw.c:74
DSHOT driver structure.
Definition: esc_dshot.h:239
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Definition: telemetry.c:51
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
Definition: telemetry.h:66
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
Definition: vl53l1_types.h:78
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98