非常好 👍
我们来系统讲一下 DShot(Digital Shot)协议数据帧格式 —— 这是一个专门为 无刷电机(Brushless Motor)电子调速器(ESC) 设计的数字通信协议,用来替代早期的 PWM、OneShot、MultiShot 等模拟信号。


🧩 一、DShot 简介

DShot = Digital + Shot,由 KISS/Betaflight 团队推出,目的:

  • 让电机控制更精准、低延迟
  • 避免模拟 PWM 信号存在的误差、漂移
  • 提供CRC 校验来防止信号误触发。

DShot 是一种**单线、单向(也可双向)**的 数字协议,通过 MCU 的 GPIO 直接输出定时波形(通常使用 DMA + 定时器输出)。


⚙️ 二、数据帧结构(DShot150/300/600/1200 均相同)

每一帧固定为 16 位(bit)

|<---- 11 bits ---->|<- 1 bit ->|<- 4 bits ->|
|     Throttle      | Telemetry |   CRC(4bit) |

1️⃣ Throttle(油门值 / 命令码)[11 bits]

  • 范围:0 ~ 2047

  • 含义:

    • 0 表示电机停止
    • 1 ~ 47:保留,用作命令(非油门)
    • 48 ~ 2047:有效油门值(线性控制电机输出)
值范围 含义
0 电机关闭
1–47 特殊命令(例如反转、保存设置、蜂鸣器等)
48–2047 油门值(48=最低油门)

2️⃣ Telemetry(遥测标志)[1 bit]

  • 0 = 不请求遥测
  • 1 = 请求 ESC 返回遥测数据(电流、电压、转速、温度等)

⚠️ 双向 DShot 模式(如 DShot600 bidir)时才会用到此位。


3️⃣ CRC(校验)[4 bits]

  • CRC = 对前 12 位(Throttle + Telemetry)进行 4-bit 校验。
  • 算法是简单的异或混合校验:
uint8_t dshot_crc(uint16_t value)
{
    uint8_t crc = 0;
    for (int i = 0; i < 3; i++) {
        crc ^= (value >> (i * 4)) & 0xF;  // 每4位异或
    }
    return crc & 0xF;
}

📶 三、信号波形编码方式

DShot 的每个 bit 都是通过不同的高电平时间表示的(数字编码方式):

Bit 高电平时间占比 低电平时间占比
1 约 75% 高电平 25% 低电平
0 约 37.5% 高电平 62.5% 低电平

例如(以 DShot600 为例):

  • 每 bit 总时长 = 1.67 µs;

    • Bit1:高电平 ≈ 1.25 µs
    • Bit0:高电平 ≈ 0.625 µs

这就要求输出定时非常精准,因此 MCU 通常使用 定时器 + DMA 自动输出。


🔢 四、完整帧示例

假设发送油门值 = 100,Telemetry = 1:

Throttle: 000001100100 (100)
Telemetry: 1
组合12位: 0000011001001
CRC(4bit): 0110
最终帧16位: 00000110010010110

发送顺序:MSB 先发


⚡ 五、不同速率版本

版本 Bitrate (bps) 每帧周期 (µs) 典型用途
DShot150 150k ~106 慢,兼容性好
DShot300 300k ~53 平衡性能
DShot600 600k ~26 常用
DShot1200 1200k ~13 高速,需硬件支持

🧠 六、DShot 命令示例(油门值 < 48)

命令值 含义
1 电机反转方向
2 反转方向永久保存
3 蜂鸣器启用
4 停止蜂鸣器
5 保存设置
6 启用 3D 模式
7 禁用 3D 模式

📡 七、双向 DShot(Bidirectional DShot)

在常规单向 DShot 中,信号仅从 MCU → ESC。
双向模式下,MCU 在发送一帧后,会在指定时隙切换为输入模式接收 ESC 返回的遥测数据(RPM、电流、电压等)。

  • 常见:Bidirectional DShot300 / DShot600
  • 用于实时转速反馈,实现闭环控制(如 RPM 过滤器)。

✅ 总结

字段 位宽 说明
Throttle / Command 11 bits 油门值或命令码
Telemetry 1 bit 遥测请求标志
CRC 4 bits 校验
合计 16 bits 一帧固定长度

是否希望我帮你画一张 DShot16 位帧结构图 + 波形时序图(带高低电平比例标注)?这样更直观。




是的 ✅,
在 DShot 协议中——

低 4 bit(最低 4 位)确实是 CRC 校验位。


具体结构如下(从高位到低位发送):

|<----- 高位在前 MSB ----->|
[15:5]   [4]       [3:0]
Throttle Telemetry  CRC

也就是说:

位区间 位数 含义
bit15–bit5 11 bits 油门值 / 命令码(Throttle / Command)
bit4 1 bit Telemetry 请求位
bit3–bit0 4 bits CRC 校验位(对前 12 位计算)

🧮 CRC 计算方式(4-bit)
CRC 对前 12 位(Throttle + Telemetry)进行计算:

uint8_t dshot_crc(uint16_t value)
{
    uint8_t crc = 0;
    for (int i = 0; i < 3; i++) {
        crc ^= (value >> (i * 4)) & 0xF;  // 每4位异或
    }
    return crc & 0xF;  // 保留低4bit
}

例如:

假设要发送的 12 位数据(Throttle + Telemetry)是:

0b0000011001001

分为三组:

0000 0110 0100 1xxx   (补齐为 12 位)

异或后得到 4bit CRC,比如 0110
则最终 16bit 帧为:

0000 0110 0100 1 0110

→ 低 4 bit 0110 就是 CRC 校验码。


所以总结一句:

✅ DShot 帧的 最低 4 位CRC 校验位,用于检测前 12 位(油门 + 遥测位)是否正确。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐