第四章 通信故障诊断:CAN总线故障、菊花链通信故障与通信超时重传机制

通信故障,说真的,是BMS系统里最让人头疼的问题之一。我做了这么多年BMS,见过太多因为通信问题导致整包电池下线的案例。今天咱们就把这块硬骨头啃下来。

4.1 CAN总线故障:Bus Off与错误帧

CAN总线在BMS里用得最多,但也是最容易出幺蛾子的地方。我个人习惯把CAN故障分成两类:电气层故障协议层故障

4.1.1 Bus Off状态

Bus Off,说白了就是节点被踢出总线了。为什么会这样?因为CAN控制器检测到发送错误太多,自己主动闭嘴了。

我记得有一次在产线上,一批BMS主控板装车后频繁报Bus Off。查了半天,发现是CAN收发器的共模电感焊反了。嗯,这种低级错误其实挺常见的。

Bus Off的触发条件:

  • 发送错误计数器(TEC)超过255
  • 节点自动进入Bus Off状态
  • 不再参与总线通信
  • 需要协议层或硬件复位才能恢复

诊断Bus Off,我建议用示波器抓CAN_H和CAN_L的差分信号。正常波形应该是显性位(约2V差分)和隐性位(0V差分)交替。如果看到波形畸变或者幅值不对,基本就是硬件问题了。

4.1.2 错误帧分析

错误帧是CAN总线的"求救信号"。当节点检测到错误时,会主动发送错误帧,告诉其他节点"我刚才发的数据有问题"。

错误帧分两种:

  • 主动错误帧:由6个连续显性位组成,会破坏当前报文
  • 被动错误帧:由6个连续隐性位组成,不会影响总线

避坑指南:我曾经遇到过一个案例,整车CAN总线时不时出现错误帧,但频率不高。用CAN分析仪抓了三天数据,发现是某个温度传感器在低温时阻抗变化,导致CAN信号反射。后来在终端电阻上做了匹配,问题就解决了。

4.2 菊花链通信故障

菊花链通信在分布式BMS里很常见,特别是用ADI的LTC68xx系列或者TI的BQ76PL系列芯片时。这种拓扑结构有个致命弱点——一个节点挂了,后面全断

4.2.1 常见故障模式

故障类型 现象 可能原因
链路中断 某节点后所有数据丢失 隔离变压器损坏、连接器松动
数据错位 电压值乱跳 时钟同步丢失、帧格式错误
噪声干扰 偶发性通信失败 共模噪声、电源纹波过大

我记得有个项目,菊花链通信在实验室跑得好好的,一上车就出问题。后来发现是电机控制器的高频干扰通过耦合电容串到了通信线上。解决办法是在每个节点的电源入口加磁珠和电容。

4.2.2 诊断方法

诊断菊花链故障,我一般按这个顺序来:

  1. 检查物理连接:隔离变压器、电容、电阻是否焊接良好
  2. 测量信号幅值:用示波器看通信波形,正常应该是方波
  3. 检查电源质量:纹波不能超过50mV
  4. 逐节点测试:从主控开始,一个一个节点往上加

注意:菊花链通信的隔离变压器选型很关键。我见过有人用便宜的共模电感代替,结果高频特性不匹配,通信距离一长就丢包。别省这点钱。

4.3 通信超时与重传机制

通信超时,说白了就是"我等了你半天,你没回我"。在BMS里,超时处理不好是会出大事的——比如继电器该断开时没断开。

4.3.1 超时检测策略

我习惯把超时分为三级:

  • 软超时:1-2个周期没收到数据,先标记为可疑
  • 硬超时:3-5个周期没收到数据,认为通信中断
  • 致命超时:超过10个周期,触发安全保护

举个例子,BMS主控每10ms发一次电压采集请求,从控应该在5ms内回复。如果连续3次没收到回复,我就认为这个从控失联了,会把它对应的电芯电压置为无效值。

4.3.2 重传机制设计

重传不是简单的"没收到就再发一次"。你想想看,如果总线本来就拥堵,你再重传,不是添乱吗?

我推荐用指数退避策略:

// 伪代码示例
uint8_t retry_count = 0;
uint32_t base_timeout = 10; // ms

while (retry_count < MAX_RETRY) {
    send_message();
    if (wait_ack(base_timeout << retry_count)) {
        // 收到应答,成功
        break;
    }
    retry_count++;
    // 退避时间:10ms, 20ms, 40ms, 80ms...
}

这个策略的好处是:第一次重传等10ms,第二次等20ms,第三次等40ms。总线越忙,我等得越久,避免加剧拥堵。

个人经验:重传次数不要超过3次。我曾经设了5次重传,结果在总线故障时,节点一直在重传,把整个总线都占满了。后来改成3次重传+故障上报,效果好了很多。

4.3.3 超时后的安全策略

通信超时后,BMS不能傻等。我建议的做法是:

  • 立即使用上一次的有效数据(但标记为"陈旧")
  • 如果超时持续,切换到降级模式
  • 关键参数(如绝缘电阻)超时,直接触发保护

警告:千万不要在超时后使用默认值!我曾经见过一个案例,BMS通信超时后用了默认的SOC值,结果电池过放了。正确的做法是标记数据无效,让上层应用自己决定怎么处理。

4.4 实战经验总结

最后,我把自己这些年踩过的坑总结一下:

  1. CAN总线:终端电阻一定要匹配,120Ω是标准值,别乱改
  2. 菊花链:每个节点的去耦电容不能省,至少100nF+10μF
  3. 超时重传:重传次数和退避时间要匹配,别让重传变成"二次伤害"
  4. 诊断工具:示波器是必须的,CAN分析仪最好备一个

嗯,通信故障诊断这块,说白了就是"胆大心细"。胆大是指敢于怀疑任何环节,心细是指每个波形、每个时序都要看清楚。希望这些经验能帮到你。

核心要点回顾:

  • Bus Off是节点主动退出,需要硬件或协议复位
  • 错误帧是总线健康的"晴雨表"
  • 菊花链通信要特别注意物理层质量
  • 超时处理要分级,重传要用指数退避
  • 安全策略比通信本身更重要