Foreword
很久之前写过DSHOT,这次捡起来实现单线DSHOT
https://elmagnifico.tech/2020/06/03/DSHOT-STM32-PWM-HAL/
单线DSHOT由于单线复用,实现起来非常麻烦,要考虑的东西很多。而相关文章又非常少,只能挨个翻看git issues,搜索零星的信息组合在一起。
某种程度上说DSHOT+BLH ESC有点类似现在的FOC驱动器,只不过是比较挫、弱化版、便宜版的FOC,任何使用BLH ESC的电机都能使用的。
当然实际的DSHOT,无法精准控制电机的转速,得到的电机转速也是有限制的,不能趋近于0
bi-directional DSHOT
https://github.com/betaflight/betaflight/pull/8554#issuecomment-512507625
总结一下,这个DSHOT实现,是反转了DSHOT协议,并且有些和标准的DSHOT实现是不一样的,其实可以认为是一个变种DSHOT
飞控发送 DSHOT帧,但是最低的4bit,与另外4bit做异或
如果ESC检测到了这个情况,也就是最低一字节的上半字节和下半字节是异或关系,那么就会发送一个telemetry 包
然后这个telemetry包是这么解析的
c c c c e e e m m m m m m m m m
前4个c是异或和的校验码
中间3个e是预周期的位移量,叫做左移位数E
最后9个m是预周期值,这个值需要左移E次,才能得到实际的周期数值
这样实现了仅仅用12位表示接近16位整数的范围的值,实际能表示大概为1-65408,对应可以测量到的电机最小转速就是1000000/65408=15.28886Hz
然后这个16bit的数值,会被GCR转换成20bit,转成的20bit,还非常特殊,他会让二进制中不会出现两个连续的0
死区
显然,用单线做收发,不可避免地要遇到死区的问题,PWM的死区比普通GPIO好一点,是相对优化过的,但是普通GPIO,从输出转换到输入,需要一定时间,并且连接的器件也要同时切换,否则有可能出现小短路的情况。
名词解释
- GCR,应该是一种编码方式,可以用来扩大数值所需要的bit数或者缩小数值所需要的bit数
- bit bang/bit-bang 其实就是GPIO,比如软I2C,软SPI,这种用普通GPIO模拟某种协议的方式,就叫bit-bang
- 3x,一般来说如果你想解码一个信号,最低要求你获取信号的频率是原始信号的3倍,你才能得到一个比较好的解码效果
- 5/4,其实就是逆GCR,扩大数值的bit数
- DSHOT bidir,双向DSHOT,也就是单线DSHOT,实现转速可读
- Run-length limited,其实就是在带宽有限的通信链路上,如何压缩数据,并且还能保证数据长度的传输方式
实现方式
一般来说DSHOT都是通过PWM+DMA实现的,但是众所周知H7以下的STM32板子DMA通道都是固定的,如果一开始设计的时候没有考虑到这个事情,就很有可能会出现DMA冲突,PWM+DMA实现不了,进而导致DSHOT无法使用,也就没法推进了。
看了一下老的issues,发现他们提出来了一种解决办法,通过普通GPIO+DMA实现DSHOT,这相当于是说就算PWM用不了,他也能直接做GPIO去实现,或者直接利用空闲的GPIO实现DSHOT,而不需要被DMA或者PWM通道绑定给卡住。
Run-length limited
几种常见的压缩方式
其他相关问题
如果ESC种设置了,Auto Telemetry
,那么如果不使用Dshot协议,这个Telemetry也会自动返回相关信息,所以对其他协议更友好了。
https://github.com/iNavFlight/inav/issues/5165
esc configurator
https://esc-configurator.com/
https://github.com/stylesuxx/esc-configurator
发现个有意思的,有人写了blh的配置器,还是web版本的,还开源,想想我的逆向,想死
Summary
未完待续
Quote
https://www.bilibili.com/read/cv16042826/
https://github.com/betaflight/betaflight/pull/8554
https://zhuanlan.zhihu.com/p/520878086
https://en.wikipedia.org/wiki/Run-length_limited#GCR:_(0,2)_RLL
https://github.com/iNavFlight/inav/issues/2710
https://github.com/iNavFlight/inav/issues/5165
https://github.com/iNavFlight/inav/pull/5674
https://youtu.be/sPktdBh2Gcw
https://github.com/mathiasvr/bluejay/issues/1
https://github.com/bitdump/BLHeli/issues/513
https://betaflight.com/docs/wiki/archive/DSHOT-ESC-Protocol
https://betaflight.com/docs/development/Dshot
https://betaflight.com/docs/tuning/4.2-Tuning-Notes#dshot-settings