最新更新:
20250824
1.修复了纯FDCAN时的负载计算
2.为文档添加了实测数据与理论计算数据的比较
3.添加了参数说明,点击计算器本体的表头即可查看
4.优化了文章大纲层级
本文 / 工具若对您有帮助,欢迎点赞、收藏、分享以便能够帮助更多的人(要是能在文章中给个引用就更好了);由于笔者水平有限,使用中遇问题或发现错误,敬请联系指正。
随着比赛总体技术水平的提高,对电机需求量也在随之增加。RM目前最常用的就是使用CAN通信的电机,而经典CAN协议最高只有1Mbps的波特率,在1000Hz的控制频率下并不能挂载很多电机,一条CAN只能挂载6~7个一拖四协议的电机。而目前各队最常使用的就是RoboMaster开发板A\C型,这两款开发板均只有两路CAN外设资源,若要使用CAN控制更多电机就只有两种思路,1是增加CAN外设的数目;2是通过降低控制频率,减少总线上数据量以降低总线负载。前者可以选择更高级芯片,比如STM32G4 STM32H7系列,有3路FDCAN外设资源;或是使用SPI转CAN、UART转CAN等模块来实现增加CAN外设的数目;后者降低总线占用率,但仍需另外计算才能确定具体还能传多少数据,本文就为计算CAN负载做了一个小工具,以便在机器人设计阶段就可以确定需要怎么分配CAN总线以达到控制需要。
(而且时常会在电控群里看到有人提问拖不动这么多电机怎么办之类的情况,然后就会有人把我早期有些计算错误的图拿出来讨论(虽然误差不大,但还是有一些区别)故作此篇)
使用本工具可将所有数据帧列出,通过总线负载排除潜在的CAN过载风险,在实际布线之前就完成CAN网络的分配。
(非常极端的8电机总线情况)(DJI一拖四控制协议)
输入区 结果区 发送频率(Hz) 数据段长度 相同帧数量 CAN帧类型 波特率(bps) 最小总线负载 平均总线负载 最大总线负载 1000 8 8 CAN标准帧 1000000 99.90% 108.00% 116.10% 500 8 2 CAN标准帧 1000000
此时总线最小负载高达99.9%,只要总线物理层有一点波动或是发送间隔不严格满足1ms就会导致丢帧,电机失控(其实只是没有超时保护,电机保持上次接收到的电流/电压指令继续输出(效果可参考高中物理题的“恒定功率启动”))

(来自麻神的好评)
一般计算出总线负载在80%以内是不会有问题的(其实通常情况下,计算出最小总线负载几乎顶满也没啥关系,只要严格保证发送间隔就好,不过最好还是留出大约一帧的空闲时间留给重传比较好,即使因为偶发错误导致需要重传也不至于导致数据挤压、总线崩溃),但是再提高的话,就需要考虑各种干扰因素导致丢包率的提高,导致总线实际波特率无法达到理论值,笔者水平有限,也没有学习过传输线理论相关知识,并不清楚具体有哪些因素会导致高速总线干扰,笔者这里提几点实践中得出的经验以供参考,如有错误还请见谅。
1.使总线电阻保持在60欧姆,原则上每条支路末端都需要终端电阻以消除信号反射,而RM比赛中,常见的连接方式都是星形网络,经过分线板就分出了若干支路,但经过测试,总线电阻在30~120欧姆之间都是能够通信的,不过40以下且总线负载较高时就已经不太稳定了,所以还是建议保持在60欧姆。终端电阻对通总线的具体影响可以参考下以下两篇文章。如发现更换电调后突然出现CAN无法通信的情况,请检查电调的终端电阻,确保只有一个终端电阻接入总线,使得总线电阻为60欧姆,笔者遇到多次这种问题,均通过此方式得到解决。测量方法:断电情况下直接用万用表电阻挡进行测量。
2.布线时使用双绞线,降低电磁干扰对差分信号的影响


3.2.1 实测负载与计算负载比较(测试数据来源于XRobot)
(由于该测试发送的数据为随机变量,因此无法确定实际位填充数量,最小总线负载的值为不考虑位填充的最理想负载) 此处也可看出青岛大学XRobot框架的运行效率非常的高,在CAN/FDCAN发送测试中可以逼近理论上限
8917包/s,每包108位,数据段的速率为0.57Mbps,最小总线负载接近100%
发送频率(Hz) 数据段长度 相同帧数量 CAN帧类型 波特率(bps) 最小总线负载 平均总线负载 最大总线负载 1000 8 8 CAN标准帧 1000000 98.98% 107.00% 115.03% 100 8 9 CAN标准帧 1000000 10 8 1 CAN标准帧 1000000 1 8 7 CAN标准帧 1000000
7401包/s,每包128位,数据段的速率为0.47Mbps,平均总线负载接近100%
发送频率(Hz) 数据段长度 相同帧数量 CAN帧类型 波特率(bps) 最小总线负载 平均总线负载 最大总线负载 1000 8 7 CAN拓展帧 1000000 94.73% 98.80% 102.87% 100 8 4 CAN拓展帧 1000000 10 8 0 CAN拓展帧 1000000 1 8 1 CAN拓展帧 1000000
3929包/s,数据段的速率为2.01Mbps,平均总线负载接近100%
发送频率(Hz) 数据段长度 相同帧数量 CAN帧类型 波特率(bps) 最小总线负载 平均总线负载 最大总线负载 1000 64 3 FDCAN 2500000 89.90% 98.62% 107.34% 100 64 9 FDCAN 2500000 10 64 2 FDCAN 2500000 1 64 9 FDCAN 2500000
参考仓库内Excel
请使用2019及以上版本Excel打开,否则可能会遇到公式中函数不兼容的问题
具体计算原理可查看表格中公式,本文不再赘述。由于笔者目前还没遇到使用远程帧的场景所以本计算器只考虑了经典CAN的标准帧格式,如有需要可自行修改。(20250416版本已经更新)
表格中有具体帧格式,和一些关于CAN总线的说明。
这里还有一份由 lc6464 制作的网页版本(目前没有同步20250416版本新增的功能),全平台可用 https://lc6464.github.io/CANbus-Load-Calculator/
(记录下下载量,重新上传文档会清除原有下载量——截止20250825)

(20250825新增功能)
点击表头即会弹出参数说明(如下图所示)

(这篇文章刚写完就有人遇到这个问题然后来问我了)(聊天记录已征得本人同意)




具体布线以及关于总线电阻的研究可以看看这两篇文章,CAN应用笔记-ADI.pdf
ZLG-工程应用笔记 -CAN-bus 电缆插座布线规范.pdf
还有一篇来自达妙科技关于CAN终端电阻对波形的影响研究(链接被吞了,我这里放个附件)5. 电机上手流程(五)-CAN总线波形的简单测试.pdf
感谢 福建理工大学的同学 提供的CAN电阻案例一份。
感谢 达妙科技 小红帽 为我提供CAN相关规范的解答。
感谢 lc6464 制作了网页版本计算器。 https://lc6464.github.io/CANbus-Load-Calculator/
感谢 XRobot 提供的 CAN/FDCAN 实测数据。 https://xrobot-org.github.io/docs/perf/perf-can
20250308
- 添加了一个总线电阻过低导致CAN通信失败的例子,以及CAN总线布线规范。新增了致谢部分。
20250311
- 添加了由 lc6464 制作的网页版本计算器
20250416
-
新增FDCAN以及经典CAN的拓展帧部分计算;
-
新增位填充对实际帧长度的影响,并修复了经典CAN帧长度的一个错误:
-
没有考虑帧间间隔,帧间间隔也应作为帧结构的一部分,新增输入数据不合法报错处理优化了交互界面;
20250824
-
修复了纯FDCAN时的负载计算
-
为文档添加了实测数据(来源于XRobot)与理论计算数据的比较
-
添加了参数说明
-
优化了文章大纲层级
原文需登录,本仓库提供了一个mhtml格式的网页快照可下载直接浏览
原文链接:【RM2025-西南石油大学-铁人】CAN负载计算器和提高CAN总线利用率技巧分享
