不接也能通,为什么还非接不可?
CAN 上那两个 120 欧电阻,一次讲明白
刚接触 CAN 的人,多半都干过这么一件事。
手头两台设备,随手拿两根线一接,通了,数据也读出来了,心想这玩意儿挺简单。等到现场上了七八台设备、线拉了几十米,问题就来了:数据时有时无,错误计数一直涨,重启一下好一会儿,过阵子又不行。
翻手册,上面写着两端要各接一个 120 欧的电阻。可当初不接不也通了吗?为什么现在非接不可?
一、电信号是跑过去的,不是瞬间到的
先纠正一个很多人下意识的想法:以为信号一发出去,整根线上立刻就都是这个电平了。
实际不是。电信号在双绞线里跑,速度大约是光速的三分之二,换算下来一米要花五纳秒左右。线长十米,信号从这头跑到那头就要五十纳秒。
这个数听着很小,但要跟通信速度比才有意义。CAN 跑 1M 波特率的时候,一位的时间是一微秒,也就是一千纳秒。信号在线上来回一趟要一百纳秒,已经占了一位时间的十分之一。线再长一点、速度再高一点,这个比例就很可观了。
所以在讨论电阻之前,得先接受一件事:线不是一根导线,它更像一条跑道。信号要在上面跑一段时间才能到对面。
二、跑到头没人接着,就弹回来了
那跑到线的尽头会怎么样?
▲ 线尾空着,信号原路弹回来
如果线尾是空的,信号到那儿发现没路了,就会原路弹回来。这个现象叫反射,跟你在山谷里喊一嗓子有回声是一个道理。
麻烦的是,弹回来的信号会和后面正在发的信号叠在一起。原本干干净净的方波,被叠加之后就变成了下面这个样子。
▲ 同一个信号,接没接电阻差这么多
上面那条抖来抖去的就是有反射的情况。业内管这个叫振铃,看着挺形象。
接收方判断 0 还是 1,是看电平有没有过那条门槛线。波形抖成这样,在门槛附近来回穿,就可能被读成一串莫名其妙的位。这就是为什么错误计数会一直涨。
那为什么短距离低速的时候不接也能通?因为信号跑一趟太快了,反射来回几次早就衰减没了,等到采样的那一刻,波形已经稳住了。线一长、速度一高,来不及稳,问题就出来了。
所以「不接也能通」不是说明电阻没用,只是说明你当时的条件太宽松,没把问题逼出来而已。
三、为什么偏偏是 120
这个数不是拍脑袋定的,它跟线本身有关。
每种线都有一个属于自己的参数,叫特性阻抗。它不是你用万用表能量出来的那个电阻,而是描述「信号在这根线上跑的时候感受到的阻力」。这个值由线的粗细、两根线的间距、外面包的绝缘材料决定,跟线有多长没关系。
CAN 用的双绞线,标准里规定这个值是 120 欧。
而反射发生的条件是:信号跑着跑着,前面的阻力突然变了。线尾空着,相当于阻力一下子变成无穷大,所以全反射回来。如果在线尾接一个跟线本身一样是 120 欧的电阻,信号跑到那儿感觉不出有什么变化,就一头扎进电阻里被消耗掉了,不再往回弹。
说白了,这个 120 欧不是随便挑的阻值,它是在配合线。用别的阻值,比如 100 或者 150,反射会少一些但不会消失,效果就打了折扣。
四、为什么是两端各一个
既然是防反射,那哪儿有线头就该在哪儿接。一根总线有两个头,所以是两端各一个。
▲ 两个 120 并起来,万用表读 60
中间那些设备,一个都不用接。有些设备内部自带这个电阻,用拨码开关或者跳线控制,装在中间的话记得把它关掉。
为什么不能每台都接?因为这些电阻是并联在总线上的。两个 120 并联是 60 欧,四个并联就只有 30 欧了。收发器要驱动的负载越来越重,输出的差分电压幅度会被压下来,接收方本来就在跟干扰较劲,信号还变小了,那更容易出错。
这里正好带出一个特别实用的检查方法。
五、拿万用表量一下就知道
把整个网络断电,万用表打到电阻档,量 CANH 和 CANL 两根线之间。
万用表读到 | 说明 | 怎么办 |
约 60 欧 | 两端各一个,正确 | 不用动 |
约 120 欧 | 只接了一个 | 另一头补上 |
约 40 欧或更低 | 接多了 | 把中间设备的电阻关掉 |
几百欧甚至断路 | 一个都没接 | 两头各接一个 |
接近 0 欧 | CANH 和 CANL 短路了 | 先查线,别急着找电阻 |
这个方法的好处是快,不用拆线不用示波器,蹲下来量一下就有结论。
有两个前提别忘了。一是必须断电,带电量出来的数不能看。二是有些设备内部会有别的电路挂在总线上,读数可能会偏离一点,接近就行,不用纠结小数点。
六、四种常见的接错
▲ 四种接错,前三种一量就知道
只接一头是最常见的。装的时候两个人各装一半,都以为对方装了。这种情况反射只减了一半,剩下那一半照样捣乱。<o:page></o:page>
每台都接是另一个极端。有人觉得多接几个更保险,结果适得其反。前面说了,并联之后阻值变低,信号幅度被压小。
接在中间设备上也很常见。有人把电阻接在了某台设备的接线端子上,但那台设备装在网络中间,两头还是空的,等于白接。电阻要接在物理上最靠边的那两个位置。
最后一种是从总线中间拉了根长支线出去。CAN 要求手拉手串下去,如果非要拉个分支,这个分支要尽量短,越快的速率要求越短。分支太长,它的尾巴也会反射。
七、还有几个相关的点
●RS485 也是同一回事。Modbus RTU 跑的 RS485 一样要两端各接一个终端电阻,阻值同样是 120 欧,道理完全一样。前面讲 Modbus 那篇提过一次,这里正好解释了为什么。
●电阻功率不用大。这条线上流的电流很小,普通的四分之一瓦贴片电阻就够了,不需要用大功率的。
●有一种做法是把 120 拆成两个 60 串联,中间点通过一个电容接地。这叫分裂终端,作用是把共模干扰也一起吃掉,对通过 EMC 测试有帮助。原理上跟单个 120 是一样的。
●线本身要用带屏蔽的双绞线,而且必须是标称 120 欧的那种。用随便一根线,特性阻抗对不上,接了电阻效果也打折。
●接线要手拉手串下去,不能接成星型。星型的每个分支都是一根有尾巴的线,都会反射,而且你没法在每个尾巴上都接电阻。
●现场排查通信问题,建议把这个 60 欧作为第一件要确认的事。它检查起来最快,而且出错的概率最高。确认完再去查波特率、查地址、查程序。
回到开头那个问题:不接也能通,为什么还非接不可?因为短距离低速的时候,反射还来不及捣乱就消失了,你看到的是一个被条件掩盖了的假象。等条件一变严苛,这个问题就会跳出来,而且以「时好时坏」这种最难查的形式出现。
后面我们打算讲讲伺服本身的东西:增益怎么调、惯量比意味着什么、振动了从哪儿下手。欢迎关注我们,一起把这些看着唬人的技术名词一个个拆明白。
<o:page></o:page>