DShot 协议是一种专为无刷电机电调(电子调速器)设计的数字通信协议,由德国厂商 Betaflight 团队主导开发,旨在替代传统的 PWM、OneShot 等模拟 / 半数字协议。它的核心优势是高速率、抗干扰、低延迟,广泛应用于穿越机、无人机等对响应速度和可靠性要求极高的场景。

一、DShot 的核心特点

  1. 全数字通信传统 PWM 或 OneShot 协议通过电压 / 脉冲宽度传递电机转速指令(模拟或半数字信号),易受电磁干扰(EMI)影响;而 DShot 采用数字信号(高低电平表示二进制),抗干扰能力极强,尤其适合多电机、高功率的穿越机环境。

  2. 高速率与低延迟DShot 有多个速率版本:

    • DShot150:150kbps(每帧约 36μs)
    • DShot300:300kbps(每帧约 18μs)
    • DShot600:600kbps(每帧约 9μs)
    • DShot1200:1200kbps(每帧约 4.5μs)远快于传统 PWM(约 20ms 周期)和 OneShot125(125μs 周期),能显著降低电机响应延迟。
  3. 单总线通信每个电调仅需一根信号线与飞控连接(无需共地之外的额外线路),简化布线,尤其适合穿越机等空间紧凑的设备。

  4. 双向通信支持(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 干扰。

三、通信流程

  1. 飞控发送指令:飞控按固定频率(如 4kHz)向电调发送 16 位 DShot 帧,包含目标油门值和功能指令。
  2. 电调解析与执行:电调接收帧后,通过 CRC 校验确认数据有效性,解析出油门值并驱动无刷电机旋转(通过内部的 FOC 或方波驱动算法)。
  3. 双向反馈(可选):若启用双向通信,电调在接收到指令后,会通过同一根信号线向飞控回传状态数据(如实际转速、温度),此时飞控需切换为接收模式。

四、DShot 与其他协议的对比

协议 类型 速率 抗干扰性 布线复杂度 适用场景
PWM 模拟 ~50Hz 多线(每电调 3 线) 入门级无人机、玩具
OneShot125 半数字 8kHz 单线(每电调 1 线) 中端穿越机、航模
DShot300 全数字 300kbps 单线 高端穿越机、竞速无人机
DShot1200 全数字 1200kbps 单线 专业级竞速、高响应需求

五、实际应用注意事项

  1. 硬件支持:飞控和电调必须同时支持 DShot 协议(需芯片定时器 / 外设支持高速信号生成与解析)。
  2. 速率选择:速率越高,延迟越低,但对信号线长度和抗干扰要求越高(如 DShot1200 需短距离布线)。
  3. 校准:使用前需通过飞控软件(如 Betaflight Configurator)对电调进行 DShot 校准,确保油门值与转速线性对应。
  4. 信号完整性:信号线建议使用屏蔽线,避免与电源 / 电机线并行,减少干扰。

总结

DShot 协议通过全数字、高速率的设计,解决了传统电机控制协议的延迟和抗干扰问题,成为高端无人机(尤其是穿越机)的主流选择。其核心是通过简洁的帧结构和差分编码,在单线上实现可靠的高速通信,同时支持双向数据反馈,为精准控制和状态监控提供了可能。

六、在无人机中的应用实例(DSHOT300)

电机控制流程图:

CUBEMX配置:

将TIM8作为通信的定时器,其主频为168MHZ

将预分频系数配0,自动重装载值配559 (向上计数),

最终PWM频率为300KHZ

一个周期脉冲代表一个bit,通过占空比来表示发送01

DShot协议中的01的占空比:

  逻辑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;
}

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐