DShot
DShot 是 Felix (KISS) 为新数字 ESC 协议创造的名称,Felix (KISS) 正在与 Boris 和 betaflight 团队的其他成员合作,Steffen (BLHeli) 也在发挥自己的作用,并将该协议引入 BLHeli_S。
有关通过双向 DShot 进行 RPM 噪声滤波,请参阅 DSHOT RPM 滤波。
注:BLHeli 是 Brush Less Helicopters 的缩写。
毫无疑问(尽管有些人这么说),尽管该协议使用微控制器的 PWM(脉冲宽度调制)功能,但它实际上是数字的。每个脉冲代表一个比特。该脉冲的时序(如持续时间)与脉冲之间的总周期相关,决定了该位是“开”还是“关”,即位值是“0”还是“1”。微控制器只是使用直接内存访问和微控制器内的定时器功能来在电机引脚上生成必要的信号,从而最大限度地减少 CPU 利用率。
与当前协议有什么区别?
非数字 PWM 协议,例如 Multishot、Oneshot42、Oneshot125 等,仅依靠脉冲宽度来指示油门位置。这具有许多显着的缺点。在这些模拟协议中,微妙的时序变化是我们都知道的抖动现象。这是信号围绕所需点跳跃的地方。脉冲宽度越短,这种抖动的可能性和影响就越大。我们都在相应 xFlight 地面站的接收机选项卡中看到过抖动的示例。脉冲宽度的变化还会导致未知的零油门和未知的最大油门。因此,使用 PWM 时需要对电调进行校准。
几乎所有数字通信都使用针对某种形式的参考(通常是接地)的时序和电压电平来指示位值。串行(例如 RS232、RS485 等)使用高电平(电压 > 参考值)来表示位值 1,使用低电平(电压非常接近参考值或 < 参考值)来表示位值 0。在串行情况下,通信的每一端都需要知道使用的时序,因为处于 1 状态的连续位仅仅是连续的高电平(无脉冲)。因此波特率至关重要。对于 DShot 来说,时机并不那么重要。其原因是脉冲宽度(持续时间)占总周期的比例表示位值。这与 WS2811/2 LED 灯条的工作方式非常相似。事实上,除了时间不同之外,它几乎是相同的。
名称含义
对于 DSHOT600,600 表示比特率(以千位为单位),因此它每秒可以发送 600 千位。对于 DSHOT300 和 DSHOT150,其本质上是相同的,但比特率变慢,对于 300(每秒 300 千位),速度慢 2 倍,对于 150(每秒 150 千位),速度慢 4 倍。这意味着上面的计时对于 300 来说只是 x2,对于 150 来说是 x4。引入 DSHOT300 和 DSHOT150 是为了确保对旧功能较差的 ESC 的支持,以便飞行者能够获得数字精度的好处。
DShot 的命名规律与 OneShot(包括 Multishot)相反:数字越大速度越快;OneShot 协议以更小的数字表示更高速度。
技术细节是什么?
对于 DSHOT600,时序输出如下:
DShot 序列
位长度(总计时周期)为 1.67 微秒(T0H + T0L 或 T1H + T1L)。 对于位为 0 的情况,脉冲宽度为 625 纳秒(T0H – 位值为 0 时脉冲为高电平的时间) 对于位为 1 的情况,脉冲宽度为 1250 纳秒(T1H – 位值为 1 时脉冲为高电平的时间) 位 0 和位 1 值的脉冲长度存在差异的原因是,在确定该值时允许相当大的容差。因此,这些时间可能会略有偏差,但结果仍然相同。与任何协议一样,需要有一个比特通信流,它将被解释为发生某些结果。对于 DShot 的情况,电机更新信号由 16 位(一帧)组成。前 11 位是实际油门值。下一位是向 ESC 发送信号以提供遥测更新(使用单独的返回通道),其余 4 位是校验和。
DShot 输出
11 位的油门值的分辨率为 2048。建议保留第一个值(可能用于启动音或命令),因此 0 表示已上锁。因此,如果保留 1 到 47,则 48-2047 就是油门位置 – 提供 2000 级分辨率。
在帧的油门值部分中,最高有效位在前,因此第一个值为 1 的位表示油门至少为一半,即 1024,第二位代表 512,第三个位代表 256,依此类推,直到第 11 位代表值 1。因此位序列 11111111111 代表全油门,10000000000 代表半油门。下图是 DSHOT600 在 BluejayF4 上运行的截图:
DShot 波形捕获
帧之间通常有至少 2 微秒的暂停,以指示帧重置。复位仅表示一帧的结束,因此任何未来的位都是新帧的开始。由于 DShot 发生在 PID 循环结束时,此暂停实际上要长得多。如果要使 DShot 连续输出信号,则需要此延迟。
这是最有效的吗?
当然应该注意的是,DShot 并不是表示串行流中比特值的绝对最有效的协议,但采用该方法而不是其他选项的原因是为了确保多旋翼上非常嘈杂的环境中的准确性。话虽如此,它当然也毫不逊色。它达到了当前的作物,DSHOT600 仅比全油门的 Multishot 慢 1 微秒。甚至 DSHOT150 也能与 Oneshot42 相媲美。下图表示当前协议的全油门时序:
DShot 没有真正的最小和最大计时持续时间的概念,它毕竟是一个数字协议。解除油门值 0 与全油门值所需的通信时间相同。
我的电调或飞控是否受支持?
KISS 固件和 Betaflight 正在努力支持这一新协议,到目前为止,测试看起来非常有希望。由于硬件的直接内存访问要求,F1 处理器(Naze、CC3D 等)不太可能支持它。这些处理器只是没有足够的可用 DMA 通道。 F3、F4、F7 都绰绰有余。然而,在这些处理器内部,定时器、DMA 和实际引脚之间存在某些映射,因此我们可能会找到一个目标,您将无法简单地使用电机输出 1 至 4,而可能必须移动到电机 1、2、4 和 5(作为示例)。 Betaflight 3.1 发布后的资源重新映射将使这项任务变得轻松简单(除了需要时的任何焊接)。
对于 ESC,硬件要求意味着 BLHeli_s 或更好。还有基于 ARM 的 ESC,例如 KISS 24A RACE,将支持 DShot 或能够升级以支持它。不幸的是,旧的 ATMEL 和较慢的基于 SILAB 的 ESC 不太可能拥有支持 DSHOT 所需的电源或定时硬件。无论哪种方式,都意味着固件升级,在某些情况下,如果 ESC 没有允许简化固件更新的引导加载程序,这将意味着焊接。
有哪些优势?
数字通信中,重复发送同一信息不会增加数值精度,因此 DShot 的输出是准确的,不存在由时序造成的油门抖动;信号损坏时,ESC 可通过校验和检测。许多人认为 32kHz 电机更新更平顺,很可能是重复信号被有效“平均”,从而滤除了抖动。DShot 消除了这种 PWM 抖动,因此电机更新频率无需超过电机实际可物理改变转速的频率;电机转速变化本身存在物理上限。
当然,另一个好处是无需校准。在数字世界中,零就是零。
因此,PWM 可以退场了,DShot 是更准确的替代方案。
Joe Lucid 更进一步,推出了双向 DShot
DShot bidir 使用反转信号电平(空闲为 1)。 FC 到 ESC 使用 dshot 帧,但最低 4 位保存其他半字节异或在一起的补码(正常 dshot 不补码异或和)。 ESC 根据反转检测到必须发送遥测数据包。
收到 dshot 帧后 30us,电调响应遥测帧。从逻辑上讲,遥测帧是一个 16 位值,最低 4 位再次保存补码的异或半字节。
高 12 位包含按位编码的 eperiod(1/erps):
e e e m m m m m m m m m
9 位数值 M 左移 E 次后得到以微秒计的周期,范围为 1 us 至 65408 us。这相当于最低电频率 15.29 Hz;对于 14 极电机,最低机械频率为 3.82 Hz。
然后,通过按半字节应用以下映射,将此 16 位值 GCR 编码为 20 位值:
0 -> 19
1 -> 1b
2 -> 12
3 -> 13
4 -> 1d
5 -> 15
6 -> 16
7 -> 17
8 -> 1a
9 -> 09
a -> 0a
b -> 0b
c -> 1e
d -> 0d
e -> 0e
f -> 0f
这将创建一个 20 位值,其中连续零不超过两个。该值被映射到新的 21 位值,方法是从位值 0 开始,如果传入值中的当前位为 1,则更改下一位中的位值,否则重复前一个位值。示例:
1 0 1 1 1 0 0 1 1 0 将变为 0 1 1 0 1 0 0 0 1 0 0。
随后,该 21 位值以 5/4 * DShot 比特率 的速率不反相发送。因此 DShot 300 使用 375 kbit,DShot 600 使用 750 kbit。
电调需要在 40us + 1 个 dshot 帧长度后准备好才能接收下一个 dshot 数据包。
有关 GCR 编码的更多信息,见 https://en.wikipedia.org/wiki/Run-length_limited#GCR:_(0,2)_RLL。