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

16位命令帧¶
逻辑字段为:
前12位通常先由:
形成,再对这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的高电平比例较短;
- 一帧后保持规定的帧间隔。
DShot150、DShot300、DShot600等名称表示不同位速率等级。更高速率会缩短脉宽和边沿余量,对时钟、DMA、布线、信号质量和电子调速器支持提出更高要求。
输出生成¶
飞控常使用:
- 定时器和DMA;
- 精确位缓冲;
- 定时器比较输出;
- 针对多个电机的并行波形;
- 双向模式下的输出/输入切换。
实现审查要检查:
- 定时器时钟和分频;
- 缓冲长度;
- DMA完成时刻;
- 缓存一致性;
- 帧间隔;
- 输出空闲状态;
- 多电机通道同步;
- 任务抢占是否影响波形。
应用循环频率不等于DShot帧率;协议速率也不等于油门更新率。
遥测请求位¶
第12位是传统独立电子调速器遥测的单次请求字段;Betaflight在组帧后会清除该次请求。它不是双向DShot的回包使能位,双向模式由反相波形、反相校验和线路换向建立,兼容电子调速器会对有效命令帧在同一信号线上返回。该位无论如何都不表示:
- 已经收到遥测;
- 返回CRC正确;
- 返回数据与该电机对应;
- 返回值仍然新鲜;
- 电子调速器支持所请求模式。
系统应分别记录请求计数、实际响应计数、解码成功、校验错误、超时和最后更新时间。
独立遥测与双向DShot¶
传统组合可以通过独立串行遥测线返回电压、电流、温度和转速。双向DShot则在发送命令后:
- 飞控完成16位输出;
- 释放或切换同一信号线为输入;
- 等待电子调速器返回;
- 捕获返回脉冲;
- 解码并校验;
- 在下一发送周期前恢复输出。
双向链路对换向时间和线状态敏感。飞控与电子调速器同时驱动会形成争用;切换过慢则会丢失响应前部。
eRPM¶
双向返回在线路上不是直接发送一个16位转速值。电子调速器先形成12位数据和4位校验,再经4b/5b组编码(GCR,Group Coded Recording)及差分编码形成返回线序。Betaflight解码后要求四个半字节异或结果为0xF,再去除低4位校验。
双向DShot的基础返回通常用于电气转速(eRPM,Electrical Revolutions Per Minute)相关周期信息。基础数据区以3位指数和9位尾数编码换相周期:
0xFFF表示停转,展开周期为0则无效。Betaflight内部按周期换算电气转速;机械转速还要除以电机极对数:
必须使用电机实际磁极数,而不是定子型号、槽数或厂商营销名称。飞控用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节,并按抓包、解码、一致性与版本迁移固定证据方法。前置不满足时只运行离线编码与解析测试。
使用示波器或逻辑分析仪时:
- 确认探头和地参考安全;
- 记录飞控版本、电子调速器固件和DShot等级;
- 捕获完整命令、间隔和返回窗口;
- 按高电平占空时间解码16位;
- 重算4位校验;
- 核对数值、请求位和目标电机;
- 双向模式下观察线路释放和返回;
- 统计响应率、错误率和最大连续丢失;
- 与飞控内部计数和eRPM日志交叉验证。
只保存解码数字不足以检查边沿、脉宽、争用和换向。
测试矩阵¶
先把离线编码测试和真实电子调速器测试分开。数值1至47属于特殊命令,不能因为它们是协议边界就在实物上逐值发送。
| 环境 | 类别 | 用例 |
|---|---|---|
| 离线编码器/解析器 | 边界数值 | 0、1、47、48、2047和越界输入全部覆盖,但不连接真实电子调速器 |
| 离线编码器/解析器 | 校验 | 普通、双向取反、单比特错误 |
| 无功率级波形负载 | 时序 | 各支持速率、最短帧间隔、30微秒EDT返回边界 |
| 无功率级波形负载 | 换向 | 正常、提前、延迟、争用和无响应 |
| 拆桨隔离台架 | 普通油门 | 仅0及48以上经批准的最低测试值 |
| 拆桨隔离台架 | 单个特殊命令 | 记录命令名称、目标电机、重复次数、前置状态、预期副作用和可逆性 |
| 拆桨隔离台架 | 映射 | 每个电机单独命令与单独返回 |
| 拆桨隔离台架 | EDT | 命令13/14、版本帧、支持类型、未知类型、比例和范围 |
| 所有适用环境 | 新鲜度与资源 | 间歇响应、持续丢失、恢复、多电机并发、DMA冲突和CPU高负载 |
主动测试只在拆桨、固定、限流并可快速断电的台架执行;涉及畸形时序或争用的测试应使用不连接真实功率级的测试负载。
任何特殊命令实物测试完成后都要:
- 停止输出并断开全部电源;
- 冷启动电子调速器;
- 重新核对每个电机方向;
- 重新读取或验证EDT、3D模式和其他持久状态;
- 执行最低值停止与映射回归;
- 未能证明恢复已知基线时保持阻断。
常见误判¶
- 把DShot当作普通PWM脉宽;
- 认为数字协议不受信号质量影响;
- 把遥测请求位当作返回成功位;
- 把eRPM直接当作机械RPM;
- 用错误磁极数配置动态陷波;
- 认为双向DShot自动包含所有EDT字段;
- 只看平均响应率,不看连续丢失;
- 在装桨状态发送特殊命令;
- 选择更高速率却不验证时序余量。
检查理解¶
- DShot 16位分别由哪些字段组成?
- 数值47和48为什么处于不同语义区间?
- 双向DShot为什么需要精确换向?
- 遥测请求位置位为什么不能证明收到遥测?
- eRPM转换为机械转速还需要什么信息?