当前位置:首页 > 硬件踩坑实录 > 正文内容

CAN 总线调试实录:为什么我的舵机集体装死

那天晚上,六个舵机在我眼前集体装死。它们不上报、不应答、不发错帧,就像从没接过电一样安静。

而我知道它们早上还是好的。因为我什么都没改——这才是最让人崩溃的部分。

症状:不是报错,是彻底安静

CAN 总线最坑的一点是:它坏得很安静。I2C 还会给你个 NACK,串口至少会有乱码,CAN 断的时候啥都没有。

我用的调试流程是这样的(建议直接拿去用):

  1. 用万用表量 CAN_H 和 CAN_L 之间的电阻。断电,量。正常应该接近 60Ω(两端各一个 120Ω 终端电阻并联)。我量出来是 120Ω。

  2. 120Ω 意味着只有一个终端电阻工作,或者线中间断了。这一条直接排除了海量可疑代码。

结果呢?我把终端电阻都焊了,但其中一个我走的是一段细细的杜邦线,从主控板一直拉到尾巴。那段线,在我排练动作的时候被扯掉了一根铜芯。

坑一:终端电阻不是"可以装",是"必须两端"

很多人以为终端电阻是抗干扰的"保险",不装顶多多丢几帧——错。CAN 是差分总线,两端各一个 120Ω 的作用是消除信号在总线尽头的反射。缺一个,信号会在线上来回弹,采样点上的电平就像水面上的倒影一样抖。

低速短距离时你确实可能"裸跑没事",于是你会以为它不需要,直到你把波特率从 500k 提到 1M,或者线从 20cm 拉到 1m。然后就开始玄学丢包。

自检办法:断电量电阻,不是 55~65Ω 就先去修硬件,别先去看代码。

坑二:所有节点的地必须真连在一起

我一开始每个舵机单独从电源模块拉电,地线各自回到电源,看起来挺规范。但主控板和舵机之间的地足足差了 0.4V——因为其中一段地线路上走了大电流。

差分总线对共模电压是有容忍度的,但不多。地不平的时候,CAN_H 和 CAN_L 会被整个抬高或压低,接收器就在阈值边缘反复横跳。

做法:把地线做成星形,功率地和信号地分开,最后单点汇合。这条听起来像玄学,但它是真的。

坑三:ID 冲突比你想的更容易发生

CAN 靠 ID 仲裁,两个节点发同一个 ID,不会报错,只会互相覆盖。表现就是:你觉得某个舵机"时好时坏"。

我第一次批量配置的时候,把六个舵机接到同一条总线上同时改 ID。改完发现只剩一个能通——因为它们在改之前 ID 全是 1,指令下去的瞬间场上乱成一锅粥。

正确姿势:一次只接一个,改完拔下来贴标签,再接下一个。麻烦二十分钟,省下两小时。

坑四:波特率容差没那么宽容

理论容差是 0.5%。听起来挺宽松,但如果你用的是内部 RC 振荡器而不是外部晶振,温飘 + 分频误差很容易把它吃掉一半。

我碰到过一次:室温 20℃ 时全通,跑了十分钟驱动器一热,开始偶发丢帧。查到最后是时钟源的问题。

一张排查清单

  • 断电量 CAN_H-CAN_L 电阻,应接近 60Ω

  • 确认两个终端电阻分别在总线物理两端,不是都堆在同一块板上

  • 所有节点共地,且地线上不跑大电流

  • ID 逐个配,配完记录

  • 波特率全场一致(包括主控)

  • 总线长度与波特率匹配:1Mbps 下总长控制在 40m 以内,实际工程建议更短

  • 最后才怀疑代码

六个舵机现在是活的。它们之所以活,不是因为我改对了什么代码,而是因为我重新焊了一根杜邦线。

硬件工程的一大半时间,都花在承认"是我接错了"上面。

扫描二维码推送至手机访问。

版权声明:本文由紫宝石DIY发布,如需转载请注明出处。

本文链接:https://www.zibaoshi.com/post/5.html

分享给朋友: