总线28讲,CAN总线两端,到底为什么要加120欧姆电阻?
我们通常情况下都会有这样的经验,给网络加上一个120欧的电阻,报文就能发出去了,把电阻拿掉,报文就发不出去了,所以我们也就习惯了直接给他加上一个120欧的电阻,然后就能通信上了。 好像一切都是那么习以为常,就好像每天早上起床之后要刷牙、蹲坑一样,习惯了,也就不在乎是它是为什么了…… 但是这到底是为什么呢?我们今天就来深入探究一下。我们的方法为:看波形!因为,多数时候,总线电阻为40、80甚至30欧姆的时候,报文都是可以发出去的,但是这并不意味着网络可靠性也是一样的,我们必须用波形说话。先来一个正确的 搞个标准的波形,两端均接了120Ω电阻,如下图: 看,多么优雅,多么标准?比师娘还要优雅…… 你看它陡峭的峰,看它波澜不惊的平,看它2.3V的差分电压,简直是教科书般的优秀! 到这里,我们只是看到了,正确的CAN报文长什么样,接下来,我们将要分析一下错误的报文是什么样的,以及,它为什么是错误的? 缺少终端电阻的CAN报文 当当当当! 如下图所示,就是一个缺少终端电阻的CAN报文波形: 好了,至此,真相大白,我们能一目了然地看出来,为什么不加终端电阻,报文会发不出去! 对于一个bit,它的上升沿没有任何问题,还是那么陡峭,横看成岭侧成峰,但是,它的下降沿出现了很大的问题,它下不去! 那么,我们就要关心一下它了,琢磨一下,它为什么下不去……师子一号认为,这是RC电路的放电效应导致的,此时的R值基本上就是CAN端口的差分阻抗,这个阻值是相当的大。 因为R值过大,无法快速消耗掉总线等效电容上的电能,所以导致放电曲线特别平缓,电压迟迟下不来。发送节点破坏掉报文这个实验中,我们的波特率是500k,师子一号在上面搞了一个时间区间,是一个bit的位宽,我们可以清楚地看到,在该CANL位宽的末尾处,差分电压仍然高达2.247伏,这毫无疑问会被发送节点当成发送错误来处理掉,我发的是隐性,为何总线上是显性?肯定是出问题了,我要报一个主动错误出去!关于错误帧的成因,可以参考下面的文章。总线30讲,关于错误帧,我们要解决引发原因,而不是错误帧本身 这就是为什么,不接终端电阻,CAN报文发不出去……根本原因被找到了…电压过高 此外,我们还发现,无论是CANH的电压,还是差分电压,都比2个120Ω终端电阻时要高很多,这是电路的电流源效应导致的,但是由于驱动能力有限,它又不能保持恒流…… 搞个小电阻试试 既然电阻过大不行,那我能不能把电阻搞得尽可能小呢? 常识告诉我们,肯定是不行的,太小了就短路了。 那么,电阻比较小的时候,究竟是什么样的呢?下图是个总线总电阻为4欧姆的波形: 我们可以清楚地看到,波形已经进入了PID调节模型,你已经看不出它是数字波形了。 CANH、CANL、差分,电压统统波澜不惊,总线完全瘫痪! 它的驱动能力也决定了,此时不可能有差分电压。 把电阻加大一些 20欧姆 我们把总线电阻搞成20欧姆试试: 微观波形 宏观波形 我不知道别的CAN卡结果会怎么样,反正我用的同星的CAN卡,20欧姆的时候是可以正常发送并识别报文的,不知道这在业内算不算优秀水平…… 不服可以来辨一辩 但是,这个时候的波形,显然不是可靠的波形,本身已经很紊乱了,到了车上,再叠加点别的干扰,很有可能就会出问题! 30欧姆 我们把总线电阻搞成30欧姆试试: 微观波形 宏观波形 30欧姆时的波形,已经基本上可以使用了,估计对大多数CAN卡都能识别了,毕竟它的差分电压已经达到了1.5V。 为什么是120? 一位大神给出了理论推导,如下图所示。 经过一堆复杂的公式推导,最终得出如下结论: 当Rb=Z时,R1=Rb=Z,即无反射。 如何测试CAN双绞线的特性阻抗呢? 使双绞线终端断开,用万用表电容档测量其阻抗得到Z1;使双绞线短接,用万用表电感档测量其阻抗得到Z2。 则双绞线的阻抗Z为Z1乘以Z2的开方。
大家都说“信号反射”、“阻抗匹配”,我也不太明白本质意义到底是什么,到底在反射什么……我只知道,电阻太大太小都不行,2个120欧姆刚刚好,用邱关源老师的知识来解释,延伸至电阻对波形的影响,我反而觉得更接地气一些。 |