第一章:CAN总线基础——从协议起源到物理层实战

大家好,我是你们的老朋友。

做电机控制这些年,我打交道最多的通信协议就是CAN。说实话,刚入行那会儿我也觉得CAN挺神秘的——两根线怎么就能在嘈杂的电机环境里稳定传数据?后来踩的坑多了,慢慢就摸透了它的脾气。

这一章,咱们就从CAN的根儿上聊起。不扯太虚的理论,重点讲清楚:这玩意儿到底怎么来的?物理层有啥门道?差分信号为啥抗干扰?

1.1 CAN协议的起源——为什么会有它?

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制……每个模块都自己拉一堆线。你想想看,一辆车光线束就几十公斤重,故障率还高。

当时德国博世公司就想:能不能搞一套总线,让所有节点共用两根线通信?1986年,CAN(Controller Area Network)就这么诞生了。

核心设计目标就三个:

  • 实时性——电机控制最怕延迟,CAN的优先级仲裁机制天生适合实时控制
  • 可靠性——差分信号+CRC校验,能在强电磁干扰下稳定工作
  • 低成本——两根双绞线就能挂几十个节点,布线成本直线下降

我个人习惯:每次选型时,先问自己三个问题——
① 节点数是否超过30个?
② 总线长度是否超过40米?
③ 波特率是否高于1Mbps?
如果答案都是“否”,经典CAN完全够用。否则,考虑CAN FD。

1.2 物理层特性——两根线里的大学问

CAN总线物理层,说白了就是一对双绞线:CAN_H和CAN_L。但别小看这两根线,里面的门道我当年可是交过学费的。

1.2.1 电平逻辑:显性与隐性

CAN总线没有“0”和“1”的直接说法,它用差分电压来表示两种状态:

  • 隐性(Recessive):CAN_H和CAN_L电压差≈0V,逻辑值为“1”
  • 显性(Dominant):CAN_H≈3.5V,CAN_L≈1.5V,电压差≈2V,逻辑值为“0”

为什么这样设计? 显性位会覆盖隐性位。多个节点同时发送时,谁发“0”谁就赢——这就是CAN的无损位仲裁机制的基础。

避坑指南:我曾经在项目里用错终端电阻,导致总线波形畸变。记住:
CAN总线两端必须各接一个120Ω电阻。少一个,信号反射;多一个,驱动电流不够。

1.2.2 差分信号——抗干扰的秘诀

电机控制环境有多恶劣?大功率IGBT开关时,瞬间电流变化率di/dt能产生几百伏的共模干扰。

差分信号的优势就在这里:

  • 干扰同时作用在CAN_H和CAN_L上,但差分电压不变
  • 接收器只关心两根线的电压差,共模噪声被抵消

我做过一个测试:在电机驱动器旁边用示波器看CAN波形,共模噪声峰峰值超过±7V,但差分信号依然清晰。换成单端信号,早就乱码了。

1.3 总线拓扑——怎么挂节点才靠谱?

CAN总线推荐直线型拓扑,也叫“菊花链”。每个节点通过短截线(Stub)连接到主干线。

关键参数:

参数 经典CAN CAN FD
最大波特率 1 Mbps 8 Mbps(数据段)
最大总线长度 40m @ 1Mbps 40m @ 5Mbps
最大节点数 30-110(取决于收发器) 同左
短截线最大长度 0.3m @ 1Mbps 0.1m @ 5Mbps

⚠️ 重要提醒:我曾经见过一个项目,为了布线方便用了星型拓扑。结果总线反射严重,波特率降到250k才能工作。记住:
CAN总线不是以太网,别用星型!

1.4 实战经验——物理层调试三板斧

做电机控制这些年,我总结了一套物理层调试方法,分享给大家:

  1. 看波形:用示波器测CAN_H和CAN_L对地波形。正常显性位时,CAN_H≈3.5V,CAN_L≈1.5V。如果幅值偏低,检查终端电阻和供电。
  2. 测差分:用示波器的数学通道做CAN_H - CAN_L。差分电压应该在0V(隐性)和2V(显性)之间跳变。如果波形有台阶或振铃,说明阻抗不匹配。
  3. 查共模:用示波器测CAN_H和CAN_L的平均电压。正常应该在2.5V左右。如果偏差超过0.5V,检查接地和屏蔽。

我的习惯:每次新板子回来,第一件事就是焊上两个120Ω电阻,用示波器看CAN_H和CAN_L的静态电压。如果不在2.5V±0.1V范围内,先查电源和收发器,别急着调软件。

1.5 本章小结

嗯,这一章咱们把CAN的底子打好了。记住几个关键点:

  • CAN是博世为汽车工业设计的实时可靠总线
  • 物理层靠差分信号抗干扰,靠显性/隐性位实现仲裁
  • 拓扑必须用直线型,终端电阻不能省
  • 调试时先看波形,再查共模,最后调软件

下一章,咱们聊聊CAN的数据链路层——报文格式、ID仲裁、位填充这些硬核内容。到时候我会拿一个电机控制的实际报文出来拆解,保证让你一看就懂。

咱们下章见。