阅读本文后,您将了解到DShot协议的基础知识,以及它在Betaflight固件中是如何与电调进行通信的具体内容。
DShot是一种用于电子速度控制器(ESC)的数字协议,专为多旋翼飞行器如穿越机设计。它由Felix(KISS团队的一员)开发,并在betaflight和其他开源飞控固件的支持下得到了广泛应用。DShot的特点是高可靠性、扩展性和性能,相比传统的PWM协议,它提供了更精确的控制和更高的数据传输速率。
优势在不需要像模拟信号那样进行电调校准。提供比模拟信号更高的分辨率,允许更精细的电机控制。由于采用数字信号和CRC校验,具有更好的抗干扰能力。支持遥测功能,能够获取ESC的状态信息,比如RPM(每分钟转速)。
除了标准的从飞行控制器到ESC的单向通信外,还有双向的DShot协议,支持ESC向飞行控制器发送电机电调的实时数据。
01、Dshot的版本
DShot协议主要包括四个版本:DShot150、DShot300、DShot600以及DShot1200。这些版本主要通过传输速率来区分:
● DShot150:每秒传输150,000位数据。
● DShot300:每秒传输300,000位数据。
● DShot600:每秒传输600,000位数据。
● DShot1200:每秒传输1,200,000位数据。
尽管这些版本都基于相同的底层技术,但它们的数据传输速率不同,这意味着更高的版本能够提供更快的响应时间和更精细的控制。
较低版本如DShot150适合那些不需要极高反应速度的应用场景;而较高版本如DShot600或DShot1200,则更适合于高性能飞行器,它们需要快速响应和精确控制来完成复杂的飞行动作。
但是,随着传输速率的增加,对连接稳定性的要求也随之提高。因此,在选择更高版本的DShot时,确保所有相关硬件(包括飞行控制器、接收机和ESC)都能支持所选版本,并且连线尽可能短且避免干扰是非常重要的。
DShot的不同版本提供了从基础到高级的各种选项,满足了从小型玩具无人机到专业级竞速飞行器等广泛的应用需求。理解和正确选择适合自己项目的DShot版本,不仅能提升设备的整体性能,还能确保更加流畅和可靠的飞行体验。同时,记住在DShot协议中,尽管波特率和比特率是两个不同的概念,但在数值上它们是相等的这一特点,有助于更好地把握该协议的技术细节。
02、Dshot数据帧结构
每个DShot数据帧包含16位,其中前11位用于油门信号,接下来的1位用于请求电调回传信息(遥测),接下就是最后4位用于循环冗余校验(CRC),以确保数据完整性。
● 数据:
最小值 00000000000(二进制)、0(十进制)
最大值 11111111111(二进制)、2047(十进制)
● 方向:
0(二进制)、0(十进制):飞控→电调
1(二进制)、1(十进制):飞控←电调
● CRC校验:
这4个校验位是对数据的11个油门值+1个方向问这12个位按每组4位分3组,然后把三组4位的数据进行异或计算(C语言运算符就是^),计算结果取低4位作为这串数据的校验码插入。
假设有12位数据为 1101 1010 1110 (即二进制表示),我们可以按照上面的方法来计算CRC
①分组:G1 = 1101, G2 = 1010, G3 = 1110
②异或:R1 = G1 XOR G2 = 0111, R2 = G2 XOR G3 = 0100
③最终CRC:CRC = R1 XOR R2 = 0011
因此,在发送时,完整的16位数据帧将是原始的12位数据加上计算出的4位CRC值 1101 1010 1110 0011
至于程序的实现方法就很各自各样了。
03、Dshot电平特性
DShot使用单线双向通信,通过改变高低电平的时间来表示二进制的0和1。用DShot600举例,一位时间大约为1.67微秒(1667纳秒),其中0表示高电平时间为625纳秒,1表示高电平时间为1250纳秒。
一位Dshot信号的波形图
一帧Dshot信息的波形图
04、BateFlight中的Dshot协议
DShot-output
从介绍(https://betaflight.com/docs/development/dshot)中我们可以看出Batefilght中的Dshot协议有别与一般的Dshot协议用法,Batefilght在0 到47 设定了一些列的指令,从48 到 2047是留给油门的,一共2000个分辨率。进一步通过查看Batefilght源代码我们可以知道 0 到47分别代表什么指令。
dshot_command.h中对0到47的命令定义
DShot-capture
通常情况下,帧之间会有至少2微秒的暂停来指示帧重置。重置仅仅表示一个帧的结束,因此任何未来的位都是新帧的开始。由于DShot发生在PID循环的末尾,这个暂停实际上要长得多。如果DShot被设置为连续输出信号,则需要这种延迟。