第2章:CAN协议基础:CAN总线的发展历史、CAN的物理层特性、CAN的差分信号与总线拓扑
各位同学,咱们今天聊聊CAN总线。说实话,在呼吸机这类医疗设备里,CAN总线几乎是标配。我这些年经手的呼吸机项目,从主控板到传感器模块,内部通信基本都靠它。为什么?因为它可靠、实时、还抗干扰。咱们一步步来看。
2.1 CAN总线的发展历史:从汽车到呼吸机
CAN总线,全称是Controller Area Network。1983年,德国博世公司为了解决汽车内部线束太多、通信不可靠的问题,开始研发这个协议。1986年正式发布,1993年成为国际标准ISO 11898。
你想想看,一辆高档汽车里有多少个ECU?发动机、变速箱、ABS、气囊……每个模块都要互相通信。用传统点对点连线,线束比人胳膊还粗。CAN总线用两根线就把所有节点串起来了,省线、轻量、还可靠。
后来,医疗设备行业也盯上了它。为什么?因为呼吸机里也有类似的需求:主控MCU、流量传感器、压力传感器、比例阀驱动、报警模块……这些模块之间需要实时交换数据。而且医疗设备对可靠性要求极高,CAN总线的错误检测和重发机制正好满足需求。
我个人习惯,在呼吸机内部用CAN总线做传感器数据采集和控制指令下发。外部通信才用以太网。这样分工明确,互不干扰。
关键时间节点:
- 1983年:博世公司启动CAN研发
- 1986年:CAN协议正式发布
- 1993年:ISO 11898国际标准
- 2000年后:医疗设备开始广泛采用
- 2012年:CAN FD(灵活数据速率)发布
2.2 CAN的物理层特性:电压、速率与节点
CAN的物理层,说白了就是规定了信号怎么在线上跑。咱们最常用的是ISO 11898-2标准,也就是高速CAN。
电压特性:
CAN总线用两根线:CAN_H和CAN_L。显性电平(逻辑0)时,CAN_H约3.5V,CAN_L约1.5V,差分电压约2V。隐性电平(逻辑1)时,两根线都是2.5V,差分电压接近0V。
为什么会这样设计?我刚开始学的时候也纳闷。后来在项目中调试时遇到过一个问题:呼吸机旁边的电机一启动,通信就丢包。查了半天,发现是共模干扰把信号电平抬高了。CAN的差分信号天生就能抑制共模干扰,这就是它抗噪的秘诀。
| 参数 | 高速CAN(ISO 11898-2) | 低速CAN(ISO 11898-3) |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 显性电平(CAN_H) | 3.5V | 3.6V |
| 显性电平(CAN_L) | 1.5V | 1.4V |
| 隐性电平 | 2.5V(两线相同) | 2.5V(两线相同) |
| 总线长度(1 Mbps时) | 约40米 | 约500米 |
速率与距离的关系:
这里有个经验公式:速率越快,距离越短。1 Mbps时,总线长度别超过40米。呼吸机内部走线一般就一两米,所以用1 Mbps完全没问题。但如果你要连接多个病床的呼吸机到中央监护系统,距离长了就得降速。
节点数量:
标准CAN最多支持110个节点(取决于收发器驱动能力)。呼吸机内部一般也就5-10个节点:主控、流量传感器、压力传感器、比例阀驱动、报警模块、人机界面。绰绰有余。
实战经验: 我建议你在设计呼吸机CAN网络时,预留20%的节点余量。万一后期要加个氧浓度传感器或者二氧化碳监测模块,不用重新布线。
2.3 CAN的差分信号:为什么它抗干扰这么强?
差分信号,说白了就是用两根线的电压差来表示数据。CAN_H和CAN_L绞在一起走线,外部干扰对两根线的影响几乎相同。接收器只看差值,共模干扰就被抵消了。
举个例子:假设外部来了一个+1V的共模干扰。CAN_H从3.5V变成4.5V,CAN_L从1.5V变成2.5V。差分电压呢?4.5 - 2.5 = 2V,没变!数据照样正确接收。
我曾经在一个项目中遇到过:呼吸机放在ICU里,旁边就是高频电刀。电刀一开机,整个病房的电磁环境恶劣得不行。普通RS485通信直接瘫痪,但CAN总线纹丝不动。这就是差分信号的威力。
差分信号的关键要点:
- 两根线必须绞在一起(双绞线),间距尽量小
- 阻抗匹配:通常120Ω终端电阻
- 避免分支过长,否则信号反射
- 布线远离电源线和电机驱动线
注意: 差分信号虽然抗干扰强,但不是万能的。如果CAN_H和CAN_L的走线长度不一致,或者绞距不均匀,共模抑制能力会下降。我在一个呼吸机项目中就吃过这个亏——布线时偷懒没绞线,结果EMC测试死活过不了。
2.4 CAN的总线拓扑:线性总线与终端电阻
CAN总线推荐用线性拓扑,也叫总线型拓扑。所有节点都挂在一根主干线上,每个节点用短支线连接。
为什么不能用星型或树型? 因为信号反射。CAN总线要求阻抗连续,分支会产生阻抗不连续点,信号会反射回来干扰正常通信。你想想看,呼吸机里如果通信时不时丢一帧,报警延迟几毫秒,后果可能很严重。
终端电阻:
在总线两端各接一个120Ω电阻。为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω。终端电阻的作用是吸收信号能量,防止反射。
我记得有一次,一个同事调试呼吸机样机,发现通信偶尔出错。查了半天,发现终端电阻只接了一个,而且焊在了中间节点上。我告诉他:终端电阻必须在总线两端,而且只能有两个。改完之后,通信稳如老狗。
总线拓扑设计要点:
- 主干线长度:1 Mbps时不超过40米
- 支线长度:尽量短,最好不超过30cm
- 终端电阻:两端各一个120Ω,精度1%
- 节点间距:尽量均匀分布
- 线缆类型:CAN专用双绞线,屏蔽层单端接地
关于屏蔽:
医疗设备对EMC要求很高。我建议在呼吸机内部使用屏蔽双绞线。屏蔽层在CAN收发器端单点接地,不要两端都接,否则会产生地环路电流,反而引入干扰。
2.5 小结:CAN物理层在呼吸机中的实战考量
好了,咱们把CAN物理层的关键点串一下:
- 差分信号是CAN抗干扰的核心,双绞线+终端电阻是标配
- 速率选1 Mbps,呼吸机内部距离足够
- 线性拓扑,支线尽量短
- 终端电阻必须两端各一个,别偷懒
- 屏蔽层单端接地,别搞成地环路
下一章,咱们会深入CAN的数据链路层,看看报文是怎么组织的,以及那个经典的仲裁机制是怎么工作的。到时候我会拿呼吸机里的实际数据帧来举例,保证你一听就懂。
嗯,今天就到这儿。有什么问题,咱们课程群里聊。