AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Формирование кадра DShot

Сборка 16-битного кадра DShot с телеметрийным битом и CRC.

DMC.15 · Моторы и ESC · ATmega328P

Задача

Собрать кадр DShot: 11 бит значения, бит телеметрии, 4 бита CRC.

Алгоритм

value(11) + telemetry(1) => 12 бит; CRC = XOR тетрад значения (& 0xF). Итог 16 бит для побитовой выдачи.

Исходный код (C, avr-gcc)

⇩ Скачать 15-dshot-frame.c

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>

uint16_t dshot_frame(uint16_t value, uint8_t telem){
  uint16_t v = (value<<1) | (telem?1:0);          // 12 бит
  uint8_t crc = (v ^ (v>>4) ^ (v>>8)) & 0x0F;      // CRC4
  return (v<<4) | crc;                             // 16 бит
}
int main(void){
  volatile uint16_t f = dshot_frame(1046, 0);      // пример команды
  (void)f;
  for(;;){}
}

Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf

Пояснения

Побитовая передача таймингозависима (DShot300/600) и требует подгонки задержек под F_CPU — здесь готовится кадр.

Смотрите также

DShot и RPM-фильтр