dshot协议数据帧格式
非常好 👍
我们来系统讲一下 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 位(油门 + 遥测位)是否正确。