Dshot数字电调协议的介绍

Dshot是一种新型数字电调协议,由Flyduino和Betaflight团队共同研发。该协议采用16位信号,包括11位油门信号、1位遥测请求及4位CRC校验。Dshot相比PWM等模拟信号协议,具有无需校准、信号精确、分辨率高等优势,并且内置CRC校验确保传输安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         Dshot,一种全新的电调协议。穿越机,真的是航模发展的奇迹之一。         Cleanflight,Raceflight,Betaflight,Kiss,四大开发团队,发展目标不太一样。大家知道,在遥控接收机上面,有PWM,PPM,这些都是模拟信号;而SBUS和IBUS等这些xxxBus协议就是数字协议,走的是单片机的串行接收端口。那么由Futaba和Frsky等遥控器厂家大力推行串行数字接收协议,大家也看到他们的牛逼之处。但是我们现在用的电调都是模拟PWM方波信号,于是,由Flyduino(Kiss飞控的公司)联合Betaflight开发团队共同研发了Dshot数字电调协议。

数字电调协议的组成
16位 = 11位油门信号 + 1位电调信息回传 + 4位循环冗余校验

  • 11位  - 2048步骤的分辨率油门值
  •   1位  -遥测要求
  •   4位  - CRC校验(检查信号的正确性)
  •  


 


如何代表0和1呢?
拿Dshot600来说,一位信号就大概是1.67微秒,那么通过对时间的占空比代表0或者1.
如果表示0:高电平占据625纳秒,
如果表示1:高电平占据1250纳秒
 



Dshot数字电调协议的优点
1.不再需要校准电调油门行程
2.精准的电调信号,数字信号的最大优点,由于PWM是模拟信号,容易出现传输过程中出现的波形变形问题
3.相比目前“1000-2000”的值,Dshot的行程由“0-2048”扩展(从00000000000到11111111111),毕竟有11位二进制数,2的11次方就是2048
4.速度上面,比Oneshot电调协议快太多
5.安全性,Dshot自带四位循环冗余校验(CRC)

与Oneshot和Mutishot的对比
       Dshot完全是数字信号,Oneshot和Mutishot是模拟信号,如果在使用上,电调硬件或者软件多多少少需要进行滤波设置,去除由于传输过程中带来的噪声,大家如果想用bls电调升级到dshot,估计就得手动把电调是的电容去除掉,而这颗电容或电阻就是用于硬件滤波的,而Dshot除了省去校准电调行程外,在传输过程中根本不需要进行滤波!毕竟0就是0,1就是1,且带有循环冗余校验位,很爽。

速度对比(全油门情况下的对比)

  • Oneshot125 – 250 uS
  • DShot150 – 106.7 uS
  • Oneshot42 – 84 uS
  • DShot300 – 53.3 uS
  • DShot600 – 26.7 uS
  • Multishot – 25 uS

 

 

         可以看出,Dshot600已经很接近Mutishot的速度了,而且kiss开发团队正在尝试Dshot1200,估计以后就是他们的天下啊,集合速度和安全一体的电调协议,爽!



数字电调支持的电调
1.BB21类:BLS电调(部分电调需要手动去除输入滤波电容)
2.STM32类:Kiss 24A(原厂支持,以后将会上Dshot1200)     这里补充说明一句,不是说8位单片机就不行,32位单片机就很牛逼,还是看各家对电调程序的优化能力了。BLS作者目前已经推送了Dshot600的固件到github上,欢迎各位折腾,小白还是别折腾了,等正式版推开吧。

### STM32实现DSHOT300协议的方法 #### 协议简介 DSHOT 是一种用于控制无刷电机的数字信号调制方式,相比传统的PWM具有更高的分辨率和更少的电磁干扰。DSHOT300是其中的一种变体,提供每秒300次更新的能力。 #### 硬件准备 为了在STM32上实现DSHOT300通信,需要确保所使用的微控制器具备足够的处理能力和定时器资源来生成精确的时间脉冲序列[^1]。 #### 软件配置 通过TIMx高级定时器可以方便地设置DSHOT输出。具体来说,可以通过DMA传输机制配合定时器中断完成数据发送任务。下面是一个简单的初始化过程: ```c // 初始化 TIMx 作为 DSHOT 输出通道 void DSHOT_Init(TIM_HandleTypeDef *htim){ __HAL_TIM_SET_COUNTER(htim, 0); // 清零计数器 htim->Instance->ARR = 49; // 自动重装载值 (ARR),对应于8us周期下的最大占空比 htim->Instance->PSC = 79; // 预分频系数,假设系统时钟为8MHz,则得到8us时间基底 HAL_TIM_PWM_Start_DMA(htim, TIM_CHANNEL_1, (uint32_t*)dshot_buffer, BUFFER_SIZE); } ``` 上述代码片段展示了如何利用STM32的标准外设库API来进行基本的硬件设定。这里假定系统的主频率为8 MHz,并选择了合适的预分频比例使得每个滴答代表大约8微秒的时间间隔。这有助于构建所需的位流模式。 对于实际应用中的编码部分,考虑到DSHOT采用的是基于宽度调制的方式表示二进制数值,在编写具体的帧格式化程序之前应当先了解其详细的比特映射规则以及同步头的要求。 #### 示例代码 下面是简化版的单个字节写入函数示例,它会按照指定的数据包结构填充缓冲区并触发一次完整的发送操作: ```c #define DSHOT_TELEMETRY_BIT 0b00000001 // 启用遥测标志位 static uint16_t dshot_encode(uint8_t throttle_value) { uint16_t encoded_data; // 构建有效载荷(含校验) encoded_data = ((throttle_value & 0xFF) << 1) | DSHOT_TELEMETRY_BIT; return encoded_data ^ 0xFFFF; // 取反以适应接收端解码需求 } void send_dshot_frame(uint8_t motor_id, uint8_t throttle) { static const int FRAME_LENGTH = 16; volatile uint16_t* buffer_ptr = dshot_buffer + motor_id * FRAME_LENGTH; for(int i=0;i<FRAME_LENGTH;++i){ *buffer_ptr++ = dshot_encode(throttle); } // 触发 DMA 发送 __HAL_TIM_SetCounter(&htim1, 0); HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t*)dshot_buffer, MOTOR_COUNT * FRAME_LENGTH); } ``` 这段C语言源代码实现了向特定编号马达发送指令的功能,其中包括了对油门参数`throttle`进行适当转换的过程。注意这里的`MOTOR_COUNT`应该被定义成实际连接到MCU上的电调数量;而`dshot_buffer[]`则用来暂存待发出的所有命令副本。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值