3. CAN物理层:差分信号、CAN_H/CAN_L电平、终端电阻、总线拓扑与线缆选择
好,咱们今天聊聊CAN物理层。说实话,很多工程师做BMS开发,天天跟CAN报文打交道,但一提到物理层就有点含糊。我刚开始做BMS那会儿也是这样,总觉得物理层是硬件工程师的事,软件不用管。直到有一次,一台样车在EMC测试时频频丢帧,排查了三天,最后发现是终端电阻焊错了位置……嗯,从那以后,我再也不敢小看物理层了。
3.1 差分信号:为什么CAN要用两根线?
CAN总线用两根线——CAN_H和CAN_L,传输的是差分信号。说白了,就是信号不是对地测量的,而是看两根线之间的电压差。
为什么非要用差分? 你想想看,BMS工作环境里,电机驱动器、DC-DC变换器、空调压缩机……到处都是强干扰源。单端信号(比如UART)在这种环境里,就像在菜市场里小声说话,根本听不清。差分信号就不一样了——干扰同时作用在两根线上,但电压差基本不变。这就是所谓的共模抑制。
我在项目中遇到过一件事:某款BMS在整车测试时,CAN通信偶尔会出乱码。我们用示波器一抓,发现CAN_H和CAN_L上叠加了很大的共模噪声,但差分电压波形却非常干净。这就是差分信号的厉害之处。
关键点: CAN总线传输的是差分电压,不是对地电压。CAN_H和CAN_L之间的电压差决定了总线状态。
3.2 CAN_H/CAN_L电平:显性与隐性
CAN总线只有两种状态:显性(Dominant)和隐性(Recessive)。
- 隐性状态: CAN_H和CAN_L电压都约为2.5V,差分电压≈0V。此时总线处于空闲状态。
- 显性状态: CAN_H电压升至约3.5V,CAN_L电压降至约1.5V,差分电压≈2V。此时总线被某个节点驱动。
这里有个重要的逻辑:显性位会覆盖隐性位。也就是说,如果多个节点同时发送,只要有一个节点发送显性位,总线就是显性状态。这就是CAN总线仲裁的基础——谁先发显性位,谁就赢得总线控制权。
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 隐性(Recessive) | 2.5V | 2.5V | ≈0V |
| 显性(Dominant) | 3.5V | 1.5V | ≈2V |
个人经验: 我建议你在BMS的CAN接口处加一个TVS管,钳位电压选在±36V左右。为什么?因为BMS经常在高压环境下工作,一旦高压串扰到CAN线上,没有保护的话,收发器瞬间就烧了。我曾经吃过这个亏,一块板子烧了三个收发器才找到原因。
3.3 终端电阻:为什么必须是120Ω?
终端电阻是CAN总线里最容易出问题的地方。标准规定,CAN总线两端各接一个120Ω电阻,并联后等效60Ω。
为什么是120Ω? 因为CAN总线使用的双绞线特性阻抗大约是120Ω。终端电阻的作用就是匹配阻抗,防止信号反射。如果没有终端电阻,或者阻值不对,信号会在总线末端反射回来,造成波形畸变,导致通信错误。
我见过不少新手工程师犯一个错误:在总线中间也加了终端电阻。结果总线等效电阻变成了40Ω(三个120Ω并联),驱动能力下降,总线长度稍微一长就丢帧。记住:终端电阻只能加在总线两端,而且必须严格120Ω,±1%精度。
避坑指南: 我曾经在一个项目中,发现CAN通信在低温下偶尔失败。查了半天,发现终端电阻用的是普通贴片电阻,温漂太大。低温时阻值变了,阻抗不匹配。后来换成高精度低温漂电阻,问题解决。所以,终端电阻别省钱,买好一点的。
3.4 总线拓扑:直线型才是王道
CAN总线的拓扑结构,说白了就是一根主干线,所有节点都挂在这根线上。这就是直线型(总线型)拓扑。
为什么不能用星型或树型? 因为CAN总线要求信号在两端之间传播,不能有分支过长。如果某个节点用很长的分支线(stub)连到主干线上,这个分支就会像一根天线,反射信号,破坏总线波形。
ISO 11898标准规定:分支长度不能超过0.3米。在BMS应用中,我建议你尽量控制在0.1米以内。如果实在没办法,比如电池模组分布比较散,可以用CAN中继器或CAN Hub来扩展。
我的建议: 设计BMS的CAN网络时,尽量把CAN收发器放在靠近总线接口的位置。我见过一些设计,CAN收发器放在板子中间,走线绕了一大圈才到连接器,结果分支长度超标,通信不稳定。记住:走线越短越好。
3.5 线缆选择:双绞线是标配
CAN总线用的线缆,首选双绞线(Twisted Pair)。为什么?因为双绞线能有效抑制共模干扰。两根线绞在一起,外部磁场在两根线上感应的噪声大小相等、方向相反,互相抵消。
具体选型时,注意以下几点:
- 特性阻抗: 必须120Ω ± 10%。别用普通网线代替,网线特性阻抗是100Ω,不匹配。
- 线径: 一般用AWG 22~24。BMS应用里,如果总线长度超过100米,建议用AWG 20或更粗的线,减小压降。
- 屏蔽: 在强干扰环境下(比如BMS靠近电机控制器),建议用屏蔽双绞线。屏蔽层单端接地,避免形成地环路。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 特性阻抗 | 120Ω ± 10% | 必须匹配终端电阻 |
| 线径 | AWG 22~24 | 长距离用更粗的线 |
| 绞距 | ≤ 50mm | 绞得越密,抗干扰越好 |
| 屏蔽 | 可选 | 强干扰环境建议使用 |
一个小技巧: 如果你在BMS项目里用非屏蔽双绞线,布线时尽量远离高压线束,至少保持10cm以上的距离。如果实在避不开,交叉走线比平行走线好得多。我有个项目就是靠调整走线方向,把CAN通信的误码率从10⁻⁴降到了10⁻⁷以下。
3.6 总结与实战建议
CAN物理层看似简单,但往往是BMS通信故障的根源。我总结几条实战经验:
- 终端电阻必须焊在总线两端,别偷懒焊在板子上。如果BMS是总线中间节点,不要加终端电阻。
- 分支线越短越好,超过0.3米就要考虑用中继器。
- 线缆选型别省钱,120Ω双绞线是底线。屏蔽层单端接地。
- 上电前先测波形,用示波器看CAN_H和CAN_L的差分波形,显性位电压差应该在1.5V~2.5V之间。
嗯,物理层就聊到这儿。下一章咱们进数据链路层,看看CAN帧结构是怎么把数据装进这些电平里的。