第一章:高压系统CAN总线基础
大家好,我是老张。在车载嵌入式这行摸爬滚打了十几年,从最早的12V低压CAN做到现在800V高压平台,踩过的坑确实不少。今天咱们开始这门《高压系统CAN通信诊断与标定实战》的第一课——先把地基打牢。
说实话,很多工程师一上来就急着写代码、调参数,结果在物理层上栽跟头。我见过太多因为终端电阻没配好、或者差分信号布线不规范导致的通信故障。所以这一章,咱们老老实实把CAN总线的基础过一遍。
1.1 CAN协议概述
CAN,全称Controller Area Network,控制器局域网。这玩意儿是德国Bosch公司在80年代搞出来的,初衷是为了解决汽车里线束太多的问题。你想想看,一辆车里有几十个ECU,如果每个ECU之间都拉一堆线,那车重得跟坦克似的。
CAN协议有几个核心特点:
- 多主总线:任何节点都可以主动发消息,不需要主机来调度
- 实时性高:优先级高的消息能抢到总线,延迟可控
- 错误检测强:CRC校验、位填充、格式检查,一套组合拳下来,错误基本逃不掉
- 差分信号传输:抗干扰能力一流,这在高压系统里太重要了
我个人习惯把CAN总线比作一个会议室。谁想发言都可以,但嗓门大的(优先级高的ID)先讲。讲完了还要确认大家都听清楚了(ACK应答),没听清就重讲。嗯,这个比喻虽然糙了点,但道理是通的。
1.2 CAN物理层特性
差分信号
CAN总线用两条线:CAN_H和CAN_L。它不靠单根线的电压高低来传数据,而是看两根线的电压差。这叫差分信号。
为什么非要用差分?我举个例子。在高压系统里,电机控制器一开,电磁干扰能把你单端信号打得面目全非。但差分信号不一样——干扰同时作用在两根线上,电压差基本不变。说白了,就是共模抑制。
CAN总线的电平状态有两种:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 显性(Dominant) | 约3.5V | 约1.5V | 约2V |
| 隐性(Recessive) | 约2.5V | 约2.5V | 约0V |
显性电平会覆盖隐性电平。这就是总线仲裁的基础——谁先发显性位,谁就抢到总线。
重要提醒:在高压系统里,CAN_H和CAN_L的共模电压范围通常要求在-2V到+7V之间。如果高压部件漏电导致共模电压漂移,通信就会出问题。我曾经在BMS项目里遇到过,绝缘监测没做好,CAN收发器直接烧了。
终端电阻
CAN总线两端各需要接一个120Ω的电阻。为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω,终端电阻就是为了匹配阻抗,防止信号反射。
没有终端电阻会怎样?信号会在总线末端反弹,跟原信号叠加,波形就乱了。我见过一个案例,某工程师在调试时忘了接终端电阻,总线长度才2米,但波特率500kbps,结果数据帧时不时就CRC错误。接上电阻后,问题立马消失。
小技巧:如果你不确定终端电阻是否接好,用万用表量CAN_H和CAN_L之间的电阻。在总线断电的情况下,正常值应该是60Ω左右(两个120Ω并联)。如果测到120Ω,说明只接了一个;如果测到无穷大,一个都没接。
1.3 CAN数据帧结构
CAN协议有四种帧:数据帧、远程帧、错误帧、过载帧。咱们最常用的是数据帧。一个标准数据帧长这样:
SOF | ID(11bit) | RTR | IDE | r0 | DLC(4bit) | Data(0-8Byte) | CRC(15bit) | CRC Delimiter | ACK Slot | ACK Delimiter | EOF(7bit)
咱们拆开来看:
- SOF(Start of Frame):1个显性位,告诉总线上的其他节点:我要发消息了。
- ID(Identifier):11位(标准帧)或29位(扩展帧)。ID越小,优先级越高。在高压系统里,BMS的故障报文通常分配很小的ID,确保能第一时间抢到总线。
- DLC(Data Length Code):4位,表示数据长度。范围0-8字节。注意,DLC可以设成0,但实际数据域长度为0。
- Data:0到8字节的数据。在BMS里,一个数据帧可能包含电池电压、温度、SOC等信息。
- CRC(Cyclic Redundancy Check):15位CRC校验码,加上1位CRC界定符。接收方会重新计算CRC,如果不匹配就报错。
- ACK(Acknowledge):2位。发送方发隐性位,接收方如果正确收到,就在ACK Slot位拉成显性。如果没人应答,发送方就知道出问题了。
- EOF(End of Frame):7个隐性位,表示帧结束。
注意:在高压系统里,CRC错误是最常见的通信故障之一。电磁干扰、连接器松动、线束过长都可能导致CRC错误。我曾经在MCU标定现场遇到过,电机大扭矩输出时,CAN通信频繁丢帧。查了半天,发现是CAN线跟高压动力线走同一个线束,干扰太大。后来把CAN线单独走线,加了磁环,问题解决。
1.4 CAN总线在电动汽车高压系统中的应用场景
在电动汽车里,CAN总线是高压系统的神经中枢。主要涉及三个核心控制器:
BMS(电池管理系统)
BMS通过CAN总线上报电池状态:总电压、总电流、单体电压、温度、SOC、SOH、绝缘电阻等。同时接收VCU的指令:充电请求、放电功率限制、继电器控制等。
我记得有个项目,BMS上报的SOC跳变很厉害,从60%突然跳到40%。查日志发现是CAN报文周期不稳定,有时候10ms发一次,有时候100ms才发一次。后来发现是BMS的CAN任务优先级设低了,被其他任务抢了CPU。嗯,这属于软件架构问题。
MCU(电机控制器)
MCU通过CAN总线接收VCU的扭矩请求,同时上报电机转速、温度、故障码等。在标定阶段,工程师通过CAN总线修改MCU的参数,比如PID系数、电流环带宽等。
这里有个坑:MCU在高压上电瞬间,CAN收发器可能会因为电源不稳定而进入异常状态。我建议在MCU的CAN初始化代码里加一个延时,等电源稳定了再初始化。
VCU(整车控制器)
VCU是整车的大脑。它通过CAN总线协调BMS和MCU的工作。比如:VCU检测到加速踏板踩下,就通过CAN给MCU发扭矩请求;同时给BMS发放电功率请求。
VCU的CAN报文设计很讲究。我个人的习惯是:
- 关键报文(如扭矩请求、故障报警)用最短的周期(10ms-20ms)
- 状态报文(如车速、SOC)用中等周期(100ms-500ms)
- 诊断报文用长周期(1s以上)或者事件触发
总结一下:CAN总线在高压系统里不是可选项,而是必需品。它的可靠性、实时性、抗干扰能力,是其他总线无法替代的。但前提是——你得把物理层搞好,把协议理解透,把应用层设计合理。
下一章,咱们会深入讲CAN诊断协议(UDS on CAN),这是排查高压系统故障的利器。到时候我会分享一些实战中的诊断案例,包括怎么用CANoe抓报文、怎么分析故障码。咱们下章见。
课后小作业:找一块带CAN接口的开发板,用示波器量一下CAN_H和CAN_L的波形。看看显性位和隐性位的电压差是多少。再试试拔掉一个终端电阻,看看波形有什么变化。实践出真知。