跳转至

DShot、双向遥测与扩展遥测

数字油门协议(DShot,Digital Shot)把飞控的电机命令编码为固定16位帧。它消除了传统模拟油门端点校准,但仍依赖正确的时序、电气信号、输出映射和电子调速器固件。

DShot收发时序

16位命令帧

逻辑字段为:

[11位数值][1位遥测请求][4位校验]

前12位通常先由:

packet_data = (value << 1) | telemetry_request

形成,再对这12位的三个4位半字节执行异或,得到低4位校验。

数值范围

数值 语义
0 停止或无油门值
1至47 特殊命令空间
48至2047 油门值

特殊命令是否支持、需要重复多少次、是否要求电机停止以及命令后的等待时间,由电子调速器协议实现决定。不能把任意1至47直接当作一次性安全命令发送。

校验

普通单向DShot的4位校验来自12位数据的三个半字节异或。Betaflight固定版本在双向DShot模式下同时使用反相发送波形,并对这4位结果取反,用于与双向工作方式配套。

4位校验只能检测有限的传输错误:

  • 不提供发送者身份;
  • 不防止重放;
  • 不防止知道算法的主动构造;
  • 不能证明电子调速器执行了命令。

位编码

DShot通过每个位周期内高电平持续时间区分0和1,不是普通UART:

  • 0和1具有相同总位周期;
  • 1的高电平比例较长;
  • 0的高电平比例较短;
  • 一帧后保持规定的帧间隔。

DShot150DShot300DShot600等名称表示不同位速率等级。更高速率会缩短脉宽和边沿余量,对时钟、DMA、布线、信号质量和电子调速器支持提出更高要求。

输出生成

飞控常使用:

  • 定时器和DMA;
  • 精确位缓冲;
  • 定时器比较输出;
  • 针对多个电机的并行波形;
  • 双向模式下的输出/输入切换。

实现审查要检查:

  • 定时器时钟和分频;
  • 缓冲长度;
  • DMA完成时刻;
  • 缓存一致性;
  • 帧间隔;
  • 输出空闲状态;
  • 多电机通道同步;
  • 任务抢占是否影响波形。

应用循环频率不等于DShot帧率;协议速率也不等于油门更新率。

遥测请求位

第12位是传统独立电子调速器遥测的单次请求字段;Betaflight在组帧后会清除该次请求。它不是双向DShot的回包使能位,双向模式由反相波形、反相校验和线路换向建立,兼容电子调速器会对有效命令帧在同一信号线上返回。该位无论如何都不表示:

  • 已经收到遥测;
  • 返回CRC正确;
  • 返回数据与该电机对应;
  • 返回值仍然新鲜;
  • 电子调速器支持所请求模式。

系统应分别记录请求计数、实际响应计数、解码成功、校验错误、超时和最后更新时间。

独立遥测与双向DShot

传统组合可以通过独立串行遥测线返回电压、电流、温度和转速。双向DShot则在发送命令后:

  1. 飞控完成16位输出;
  2. 释放或切换同一信号线为输入;
  3. 等待电子调速器返回;
  4. 捕获返回脉冲;
  5. 解码并校验;
  6. 在下一发送周期前恢复输出。

双向链路对换向时间和线状态敏感。飞控与电子调速器同时驱动会形成争用;切换过慢则会丢失响应前部。

eRPM

双向返回在线路上不是直接发送一个16位转速值。电子调速器先形成12位数据和4位校验,再经4b/5b组编码(GCR,Group Coded Recording)及差分编码形成返回线序。Betaflight解码后要求四个半字节异或结果为0xF,再去除低4位校验。

双向DShot的基础返回通常用于电气转速(eRPM,Electrical Revolutions Per Minute)相关周期信息。基础数据区以3位指数和9位尾数编码换相周期:

period = mantissa << exponent

0xFFF表示停转,展开周期为0则无效。Betaflight内部按周期换算电气转速;机械转速还要除以电机极对数:

机械RPM = eRPM ÷ (电机磁极数 ÷ 2)

必须使用电机实际磁极数,而不是定子型号、槽数或厂商营销名称。飞控用eRPM建立动态陷波时,还需验证:

  • 电机索引对应正确;
  • 返回率足够;
  • 零值和无效值被区别;
  • 极对数配置正确;
  • 丢帧时滤波器安全退化;
  • 频率落在物理合理范围。

一个看似稳定但映射到错误电机的eRPM,会让滤波器追踪错误频率。

扩展DShot遥测

扩展DShot遥测(EDT,Extended DShot Telemetry)在兼容实现中复用某次双向返回的数据区表达更多状态,例如:

  • 温度;
  • 电压;
  • 电流;
  • 状态或调试值;
  • eRPM。

EDT不是在同一返回中给eRPM追加字段,而是占用原本可以返回eRPM的一个时隙。具体数据类型、编码和发送调度取决于电子调速器固件、EDT规范版本与飞控实现。不能从“支持双向DShot”推导“支持全部EDT字段”。

接收端要区分:

  • 当前返回是eRPM还是扩展数据;
  • 扩展类型是否受支持;
  • 值的单位、比例和范围;
  • 更新周期;
  • 未知类型;
  • 扩展值与上一次eRPM之间的新鲜度。

EDT v2.1.1启用与发现

本专题固定EDT规范提交438b87983b58369e3e46068b0b975634f4ea5416,对应v2.1.1:

  • DShot命令13用于请求启用EDT;
  • DShot命令14用于请求禁用EDT;
  • 规范要求相应命令至少连续发送6次;
  • 电子调速器启用后用一个版本帧报告版本;
  • 禁用后用约定的禁用帧确认;
  • Betaflight 2026.6.2固定实现发送10次,属于满足“至少6次”的平台行为。

收到普通EDT状态字段不能替代版本发现。测试记录必须保存启停命令、重复次数、版本帧、未知版本处理和冷启动后的实际状态。

EDT v2.1.1还规定电子调速器在DShot帧释放后30微秒发送双向响应,该间隔不随DShot150、300或600改变。捕获测试要分别测量:

  • 最后一个发送位到线路释放;
  • 线路释放到返回起始;
  • 30微秒目标与测量误差;
  • 不同DShot等级下换向是否保持;
  • 过早或过晚响应的拒绝和计数。

带宽和调度

每个电机每次更新至少需要:

  • 16个位周期;
  • 帧间隔;
  • 双向时的输出释放;
  • 响应窗口;
  • 解码和处理。

多个电机可能由硬件并行发送,但返回捕获、DMA资源和CPU处理仍有限。提高控制循环或DShot速率前要证明:

  • 定时器和DMA资源没有冲突;
  • 每个电机响应窗口完整;
  • CPU负载和中断延迟有余量;
  • 错误率不随负载显著上升;
  • 其他外设定时不被破坏。

失效语义

应区分:

状态 含义 处理
命令已生成 软件产生了目标值 尚未证明线上发送
帧已发送 DMA或定时器完成 尚未证明电调收到
遥测已请求 请求位置位 尚未证明有响应
响应已捕获 看到返回脉冲 尚未证明解码正确
响应有效 编码和校验通过 还需检查范围与新鲜度
遥测超时 没有有效返回 不必然等于命令输出中断

失去遥测不能自动解释为电机已经停止;命令输出正常也不能说明功率级或电机实际工作正常。

特殊命令安全

特殊命令可能改变:

  • 电机方向;
  • 蜂鸣;
  • 3D模式;
  • 设置保存;
  • 遥测模式;
  • 电子调速器状态。

发送前应检查:

  • 螺旋桨已拆除;
  • 动力级是否需要供电;
  • 油门值为零;
  • 命令重复次数;
  • 命令间隔;
  • 目标电机;
  • 固件支持;
  • 是否可逆;
  • 是否需要断电保存。

批量广播前先对单个隔离电子调速器验证。任何可能转动电机的命令都按执行器测试管理。

捕获验证

执行波形输出或连接真实电子调速器前,必须先完成协议审查与测试卡第0节,并按抓包、解码、一致性与版本迁移固定证据方法。前置不满足时只运行离线编码与解析测试。

使用示波器或逻辑分析仪时:

  1. 确认探头和地参考安全;
  2. 记录飞控版本、电子调速器固件和DShot等级;
  3. 捕获完整命令、间隔和返回窗口;
  4. 按高电平占空时间解码16位;
  5. 重算4位校验;
  6. 核对数值、请求位和目标电机;
  7. 双向模式下观察线路释放和返回;
  8. 统计响应率、错误率和最大连续丢失;
  9. 与飞控内部计数和eRPM日志交叉验证。

只保存解码数字不足以检查边沿、脉宽、争用和换向。

测试矩阵

先把离线编码测试和真实电子调速器测试分开。数值1至47属于特殊命令,不能因为它们是协议边界就在实物上逐值发送。

环境 类别 用例
离线编码器/解析器 边界数值 0、1、47、48、2047和越界输入全部覆盖,但不连接真实电子调速器
离线编码器/解析器 校验 普通、双向取反、单比特错误
无功率级波形负载 时序 各支持速率、最短帧间隔、30微秒EDT返回边界
无功率级波形负载 换向 正常、提前、延迟、争用和无响应
拆桨隔离台架 普通油门 仅0及48以上经批准的最低测试值
拆桨隔离台架 单个特殊命令 记录命令名称、目标电机、重复次数、前置状态、预期副作用和可逆性
拆桨隔离台架 映射 每个电机单独命令与单独返回
拆桨隔离台架 EDT 命令13/14、版本帧、支持类型、未知类型、比例和范围
所有适用环境 新鲜度与资源 间歇响应、持续丢失、恢复、多电机并发、DMA冲突和CPU高负载

主动测试只在拆桨、固定、限流并可快速断电的台架执行;涉及畸形时序或争用的测试应使用不连接真实功率级的测试负载。

任何特殊命令实物测试完成后都要:

  1. 停止输出并断开全部电源;
  2. 冷启动电子调速器;
  3. 重新核对每个电机方向;
  4. 重新读取或验证EDT、3D模式和其他持久状态;
  5. 执行最低值停止与映射回归;
  6. 未能证明恢复已知基线时保持阻断。

常见误判

  • 把DShot当作普通PWM脉宽;
  • 认为数字协议不受信号质量影响;
  • 把遥测请求位当作返回成功位;
  • 把eRPM直接当作机械RPM;
  • 用错误磁极数配置动态陷波;
  • 认为双向DShot自动包含所有EDT字段;
  • 只看平均响应率,不看连续丢失;
  • 在装桨状态发送特殊命令;
  • 选择更高速率却不验证时序余量。

检查理解

  1. DShot 16位分别由哪些字段组成?
  2. 数值47和48为什么处于不同语义区间?
  3. 双向DShot为什么需要精确换向?
  4. 遥测请求位置位为什么不能证明收到遥测?
  5. eRPM转换为机械转速还需要什么信息?

主要参考