嵌入式开发DShot协议
DShot 协议通过全数字、高速率的设计,解决了传统电机控制协议的延迟和抗干扰问题,成为高端无人机(尤其是穿越机)的主流选择。其核心是通过简洁的帧结构和差分编码,在单线上实现可靠的高速通信,同时支持双向数据反馈,为精准控制和状态监控提供了可能。
DShot 协议是一种专为无刷电机电调(电子调速器)设计的数字通信协议,由德国厂商 Betaflight 团队主导开发,旨在替代传统的 PWM、OneShot 等模拟 / 半数字协议。它的核心优势是高速率、抗干扰、低延迟,广泛应用于穿越机、无人机等对响应速度和可靠性要求极高的场景。
一、DShot 的核心特点
-
全数字通信传统 PWM 或 OneShot 协议通过电压 / 脉冲宽度传递电机转速指令(模拟或半数字信号),易受电磁干扰(EMI)影响;而 DShot 采用数字信号(高低电平表示二进制),抗干扰能力极强,尤其适合多电机、高功率的穿越机环境。
-
高速率与低延迟DShot 有多个速率版本:
- DShot150:150kbps(每帧约 36μs)
- DShot300:300kbps(每帧约 18μs)
- DShot600:600kbps(每帧约 9μs)
- DShot1200:1200kbps(每帧约 4.5μs)远快于传统 PWM(约 20ms 周期)和 OneShot125(125μs 周期),能显著降低电机响应延迟。
-
单总线通信每个电调仅需一根信号线与飞控连接(无需共地之外的额外线路),简化布线,尤其适合穿越机等空间紧凑的设备。
-
双向通信支持(DShot Bi-Directional)部分高级版本(如 DShot600/1200)支持双向通信,电调可向飞控反馈电机转速、温度、电压等数据,便于飞控实现更精准的控制和故障诊断。
二、DShot 协议帧结构
DShot 指令以帧(Frame) 为单位传输,每帧包含 16 个 bits,结构如下:
| 位范围(bit) | 含义 | 说明 |
|---|---|---|
| 0~10 | 油门值(Throttle) | 共 11 位,取值范围 0~2047:- 0:电机停止(特殊值,强制刹车)- 1~2047:对应电机转速(1 为最小,2047 为最大) |
| 11~13 | 功能位(Telemetry) | 3 位,用于控制双向通信(如是否请求电调回传数据),或扩展功能(如校准、转速限制等)。 |
| 14~15 | 校验位(CRC) | 2 位循环冗余校验,用于验证数据传输的正确性(防止干扰导致指令错误)。 |
帧编码规则:
- 11 位油门值 + 3 位功能位 = 14 位数据(称为 “数据段”)。
- 校验位由数据段的前 12 位计算得出:将前 12 位按每 4 位分组求和,取结果的低 2 位作为 CRC。
- 最终 16 位帧通过差分编码(每个 bit 用高低电平的持续时间表示)传输:
- 逻辑 “1”:高电平持续 1.25μs,低电平持续 1.25μs(总周期 2.5μs)。
- 逻辑 “0”:高电平持续 0.625μs,低电平持续 1.875μs(总周期 2.5μs)。这种编码方式能减少信号线上的直流分量,降低 EMI 干扰。
三、通信流程
- 飞控发送指令:飞控按固定频率(如 4kHz)向电调发送 16 位 DShot 帧,包含目标油门值和功能指令。
- 电调解析与执行:电调接收帧后,通过 CRC 校验确认数据有效性,解析出油门值并驱动无刷电机旋转(通过内部的 FOC 或方波驱动算法)。
- 双向反馈(可选):若启用双向通信,电调在接收到指令后,会通过同一根信号线向飞控回传状态数据(如实际转速、温度),此时飞控需切换为接收模式。
四、DShot 与其他协议的对比
| 协议 | 类型 | 速率 | 抗干扰性 | 布线复杂度 | 适用场景 |
|---|---|---|---|---|---|
| PWM | 模拟 | ~50Hz | 差 | 多线(每电调 3 线) | 入门级无人机、玩具 |
| OneShot125 | 半数字 | 8kHz | 中 | 单线(每电调 1 线) | 中端穿越机、航模 |
| DShot300 | 全数字 | 300kbps | 强 | 单线 | 高端穿越机、竞速无人机 |
| DShot1200 | 全数字 | 1200kbps | 强 | 单线 | 专业级竞速、高响应需求 |
五、实际应用注意事项
- 硬件支持:飞控和电调必须同时支持 DShot 协议(需芯片定时器 / 外设支持高速信号生成与解析)。
- 速率选择:速率越高,延迟越低,但对信号线长度和抗干扰要求越高(如 DShot1200 需短距离布线)。
- 校准:使用前需通过飞控软件(如 Betaflight Configurator)对电调进行 DShot 校准,确保油门值与转速线性对应。
- 信号完整性:信号线建议使用屏蔽线,避免与电源 / 电机线并行,减少干扰。
总结
DShot 协议通过全数字、高速率的设计,解决了传统电机控制协议的延迟和抗干扰问题,成为高端无人机(尤其是穿越机)的主流选择。其核心是通过简洁的帧结构和差分编码,在单线上实现可靠的高速通信,同时支持双向数据反馈,为精准控制和状态监控提供了可能。
六、在无人机中的应用实例(DSHOT300)
电机控制流程图:

CUBEMX配置:
将TIM8作为通信的定时器,其主频为168MHZ
将预分频系数配0,自动重装载值配559 (向上计数),
最终PWM频率为300KHZ
一个周期脉冲代表一个bit,通过占空比来表示发送0或1
DShot协议中的0或1的占空比:
逻辑1对应PWM占空比为75%
逻辑0对应PWM占空比为37.5%
函数接口:
MotorInterface_t UserDshotMotor = {
.init = motor_init,
.set_target = pwmWriteDigital,
};
发送油门信号函数流程图:

PWM占空比:
//PWM 75% = 420/560 占空比为逻辑1
#define ESC_BIT_1 420
//PWM 37.5% = 210/560 占空比为逻辑0
#define ESC_BIT_0 210
/*Dshot数据包编码函数
将油门值和遥测标志 编码为DShot协议格式
参数:要传输给电机的数据结构体
返回值:构造好的一个DSHOT数据包
*/
static uint16_t DshotDecode(dshotMotorVal_t val)
{
//构造数据包前12位:油门值左移1位+遥测标志位
// 油门数据长度为11位 所以这里先左移一位 添加上请求回传标志共12位
uint16_t packet = (val.throttle << 1) | (val.Telemetry ? 1 : 0);
//构造数据包后4位
//计算CRC校验码
uint8_t crc = ( packet^(packet>>4)^(packet>>8) ) & 0x0F;
//11+1+4
//将CRC校验码附加到数据包的低四位
packet = (packet << 4) | crc;
//返回构造好的16位DSHOT数据包
return packet;
}
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)