4、CAN网络设计:节点配置、终端电阻、总线长度与波特率计算

好,咱们今天聊聊CAN网络设计里最实在的几个参数。节点怎么配、终端电阻怎么放、总线能拉多长、波特率怎么算——这些搞不清楚,你的CAN总线跑起来就是各种玄学问题。我做了这么多年ECU通信,见过太多因为这几个基础参数没搞对,导致整车网络瘫痪的案例。

4.1 节点配置:不是随便挂上去就行

CAN总线上的节点,说白了就是一个个ECU。但每个ECU怎么挂到总线上,是有讲究的。

节点数量限制

标准CAN(ISO 11898)规定,一条总线上最多挂110个节点。但这是理论值。我个人习惯,实际项目中超过30个节点就要小心了。为什么?因为每个节点都会给总线增加电容负载,节点多了,信号边沿会变缓,通信质量就下降了。

实际经验:我在一个商用车项目中,一条动力CAN挂了42个节点。结果高速运行时频繁出现位错误。后来拆分成两条子总线,问题就解决了。所以别迷信理论值,30个以内比较稳妥。

节点电气参数

每个CAN节点都有输入阻抗、输出差分电压这些参数。设计时要注意:

  • 输入阻抗:标准是20kΩ左右,但不同芯片有差异
  • 共模电压范围:一般要求-2V到+7V
  • 输出差分电压:显性位至少1.5V,隐性位接近0V

嗯,这里要注意:不同厂家的CAN收发器混用时,一定要检查它们的电气参数是否匹配。我曾经在一个项目中混用了NXP和TI的收发器,结果隐性电平不一致,导致总线一直处于显性状态——说白了就是总线被锁死了。

4.2 终端电阻:两个120Ω的故事

终端电阻是CAN网络里最容易出错的地方。标准做法是在总线两端各放一个120Ω电阻。为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω,终端匹配就是为了消除信号反射。

终端电阻的作用

  • 吸收信号反射,防止波形畸变
  • 提供显性位的回流路径
  • 保证总线空闲时隐性电平稳定

常见错误:很多人以为每个节点都要加终端电阻。不是的!只有总线物理上的两端才需要。中间节点加了反而会拉低总线阻抗,导致信号幅度不够。我曾经见过一个项目,每个ECU都焊了120Ω电阻,结果总线等效电阻只有十几Ω,显性位电压根本达不到阈值。

终端电阻的放置位置

终端电阻应该放在总线的最远端。怎么确定最远端?用万用表量一下,从总线一端到另一端,电阻最小的路径就是。我建议在PCB设计时就把终端电阻做成可选的,用0Ω电阻或跳线来控制。这样调试时方便切换。

小技巧:如果总线长度超过100米,可以考虑用分裂终端(split termination)。就是把120Ω拆成两个60Ω,中间加一个电容到地。这样能改善共模噪声抑制。我在一个混合动力项目中用过这个方案,EMC测试一次通过。

4.3 总线长度:能拉多长?

CAN总线的长度和波特率是强相关的。波特率越低,总线可以越长。为什么?因为信号在总线上的传播速度是有限的,大约5ns/m。波特率高了,位时间短了,信号还没传到远端,下一个位就来了——这肯定乱套。

经验公式

总线最大长度 ≈ (位时间 - 环路延迟) / (2 × 单位长度延迟)

简化一下,实际工程中常用这个对照表:

波特率 最大总线长度 典型应用
1 Mbps 40 m 动力总成、高速控制
500 kbps 100 m 车身控制、诊断
250 kbps 250 m 工业控制、楼宇
125 kbps 500 m 远程I/O、传感器网络
50 kbps 1000 m 长距离监控

你想想看,为什么1Mbps只能拉40米?因为位时间只有1μs,信号来回传播的时间就占了很大比例。我做过一个测试,在50米长的1Mbps总线上,信号反射已经严重到无法正常通信了。

避坑指南:我曾经在一个项目中,客户要求1Mbps跑100米。我说不行,他不信。结果现场调试时,总线错误帧满天飞。最后只能降到500kbps才稳定。所以别挑战物理极限,留20%的余量比较安全。

4.4 波特率计算:别靠猜

CAN的波特率不是随便设的,它和晶振频率、分频系数、时间段设置都有关系。标准CAN控制器(如SJA1000)的波特率计算公式:

波特率 = 晶振频率 / (分频系数 × (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2))

其中:
- Sync_Seg = 1 TQ(固定)
- Prop_Seg = 1~8 TQ
- Phase_Seg1 = 1~8 TQ
- Phase_Seg2 = 1~8 TQ
- 采样点 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 总TQ数

采样点的选择

采样点最好在85%左右。为什么?因为信号在总线上的传播延迟和上升时间会导致位边沿偏移,采样点靠后一些能避开这些不稳定区域。

举个例子,假设晶振16MHz,目标波特率500kbps:

总TQ数 = 16MHz / 500kbps = 32 TQ
分频系数 = 1(不分频)
分配:
  Sync_Seg = 1 TQ
  Prop_Seg = 7 TQ
  Phase_Seg1 = 8 TQ
  Phase_Seg2 = 16 TQ
采样点 = (1+7+8)/32 = 50%  ← 这个太靠前了,不好

嗯,这个配置采样点只有50%,太差了。我建议调整分频系数:

分频系数 = 2
总TQ数 = 16MHz / (2 × 500kbps) = 16 TQ
分配:
  Sync_Seg = 1 TQ
  Prop_Seg = 5 TQ
  Phase_Seg1 = 8 TQ
  Phase_Seg2 = 2 TQ
采样点 = (1+5+8)/16 = 87.5%  ← 这个就合理了

我的习惯:设计CAN网络时,我会先用Excel做个波特率计算表,把晶振频率、分频系数、各时间段都列出来,自动计算采样点。然后根据总线长度调整Prop_Seg的值。总线越长,Prop_Seg就要设得越大,以补偿传播延迟。

4.5 综合设计实例

假设我们要设计一个车身CAN网络,要求:

  • 节点数:15个ECU
  • 总线长度:80米
  • 波特率:500kbps
  • 晶振:8MHz

设计步骤:

  1. 节点配置:15个节点没问题,注意每个节点的CAN收发器要选同一家或兼容的型号
  2. 终端电阻:在总线两端各放一个120Ω电阻,中间节点不加
  3. 总线长度:80米在500kbps的100米限制内,但余量不大。我建议用屏蔽双绞线,线径0.5mm²以上
  4. 波特率计算:
    分频系数 = 1
    总TQ数 = 8MHz / 500kbps = 16 TQ
    分配:
      Sync_Seg = 1 TQ
      Prop_Seg = 6 TQ(80米传播延迟约400ns,需要6个TQ)
      Phase_Seg1 = 7 TQ
      Phase_Seg2 = 2 TQ
    采样点 = (1+6+7)/16 = 87.5%

最后提醒:设计完成后一定要做实物测试。用示波器看CAN_H和CAN_L的差分信号,检查显性位幅度是否大于1.5V,隐性位是否接近0V。再测一下总线上的信号边沿时间,上升沿和下降沿不要超过位时间的5%。我见过太多设计文档写得漂亮,一上示波器就原形毕露的案例了。

好了,CAN网络设计的核心参数就这些。节点别贪多、终端电阻放两端、总线长度别超标、波特率算清楚——做到这四点,你的CAN网络基本就稳了。下一章咱们聊聊CAN的报文格式和ID分配策略,那个更有意思。