第4章:CAN位时序与同步——位时间组成、同步段、传播段、相位缓冲段、采样点配置

大家好,我是老张。做电机控制这些年,我踩过最大的坑之一,就是CAN通信的位时序配置。你想想看,电机高速旋转时,电磁干扰满天飞,CAN总线要是不同步,那数据就跟天书一样。今天咱们就把这个硬骨头啃下来。

4.1 位时间到底是个啥?

说白了,CAN总线上的一个bit,不是简单的高电平或低电平。它被切成了好几段。为什么要这么干?为了同步。

我刚开始接触CAN时,以为就是发0和1。直到有一次,电机在3000转时,CAN报文突然丢帧严重。查了三天,最后发现是位时序没配好。嗯,从那以后我再也不敢小看这个参数了。

一个完整的位时间,由四个段组成:

  • 同步段(Sync_Seg):固定1个TQ(Time Quantum,时间量子)。用于检测总线上的跳变沿。
  • 传播段(Prop_Seg):补偿物理延迟。包括收发器延迟、总线传输延迟。
  • 相位缓冲段1(Phase_Seg1):用于重同步,可延长。
  • 相位缓冲段2(Phase_Seg2):用于重同步,可缩短。

每个段都是由整数个TQ组成的。TQ是啥?就是CAN控制器的最小时间单位,由系统时钟分频得到。

核心公式:

位时间 = (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × TQ

波特率 = 1 / 位时间

4.2 同步段——心跳的起点

同步段只有一个TQ。它的作用很简单:检测总线上的下降沿(从隐性到显性)。

你想想看,如果所有节点的时钟都有偏差,那怎么保证大家在同一时刻采样?靠的就是这个同步段。每个节点都在同步段的起始位置,重新对齐自己的时间基准。

我在项目中遇到过一个问题:两个控制器,一个用16MHz晶振,一个用8MHz晶振。波特率都配成500kbps,但就是通信不上。后来发现,是同步段没对齐。晶振误差累积,导致采样点偏移。

我的经验:同步段不要动,永远固定为1个TQ。这是CAN协议规定的,别自作聪明去改它。

4.3 传播段——给物理世界留点时间

传播段补偿的是信号在物理介质上的传输延迟。包括:

  • 发送节点的收发器延迟
  • 总线电缆的传输延迟
  • 接收节点的收发器延迟

说白了,就是信号从A点走到B点,再回来,需要时间。这个时间必须小于传播段。

传播段的计算公式:

Prop_Seg ≥ 2 × (t_bus + t_tx + t_rx)

其中:
t_bus = 总线长度 × 单位延迟(约5ns/m)
t_tx = 发送器延迟(典型值50-100ns)
t_rx = 接收器延迟(典型值50-100ns)

举个例子:总线长度10米,收发器延迟各70ns。

t_bus = 10 × 5 = 50ns
总延迟 = 2 × (50 + 70 + 70) = 380ns
如果TQ = 100ns,则Prop_Seg ≥ 4个TQ

注意:传播段配小了,远距离节点会采样到错误电平。配大了,浪费带宽。我一般留20%的余量。

4.4 相位缓冲段——动态调整的缓冲器

这两个段是CAN同步的精髓。Phase_Seg1和Phase_Seg2,一个可以延长,一个可以缩短。

为什么会这样?因为每个节点的晶振都有误差。假设A节点比B节点快0.1%,那么A发完一个bit时,B还没收完。这时候就需要调整。

调整机制:

  • 硬同步:每个帧起始时,所有节点强制对齐到同步段。
  • 重同步:帧内检测到跳变沿时,调整Phase_Seg1或Phase_Seg2的长度。

重同步的规则:

  • 如果跳变沿落在同步段之后,说明对方慢了,延长Phase_Seg1。
  • 如果跳变沿落在同步段之前,说明对方快了,缩短Phase_Seg2。

我调试过一个项目,电机控制器和上位机距离50米。上位机晶振精度0.5%,控制器精度0.1%。一开始通信时好时坏。后来我把Phase_Seg1和Phase_Seg2都设成了4个TQ,留足调整空间,问题就解决了。

4.5 采样点配置——成败的关键

采样点,就是CAN控制器读取总线电平的时刻。它位于Phase_Seg1和Phase_Seg2之间。

采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 位时间 × 100%

常见的采样点配置:

波特率 推荐采样点 典型TQ数
125kbps 87.5% 16
250kbps 87.5% 16
500kbps 75% - 87.5% 16
1Mbps 70% - 75% 8

为什么采样点要偏后?因为信号在总线传输需要时间。采样点靠后,给信号足够的时间稳定下来。

我个人的习惯:

  • 低速(125k-250k):采样点设在87.5%
  • 中速(500k):采样点设在80%
  • 高速(1M以上):采样点设在70%

避坑指南:我曾经在一个项目中,把采样点设在了50%。结果总线长度超过20米时,通信完全瘫痪。后来改成80%,问题解决。采样点太靠前,信号还没稳定就采样了;太靠后,留给相位缓冲段的调整空间不够。

4.6 实战配置示例

假设我们要配置500kbps的CAN总线,系统时钟40MHz,总线长度20米。

第一步:确定TQ

目标位时间 = 1/500k = 2000ns
如果TQ = 125ns,则位时间 = 2000/125 = 16个TQ

第二步:分配各段

Sync_Seg = 1 TQ
Prop_Seg = 5 TQ(覆盖20米总线延迟)
Phase_Seg1 = 5 TQ
Phase_Seg2 = 5 TQ
采样点 = (1+5+5)/16 = 68.75%

嗯,68.75%有点低了。调整一下:

Prop_Seg = 4 TQ
Phase_Seg1 = 6 TQ
Phase_Seg2 = 5 TQ
采样点 = (1+4+6)/16 = 68.75%

还是低。再调:

Prop_Seg = 3 TQ
Phase_Seg1 = 7 TQ
Phase_Seg2 = 5 TQ
采样点 = (1+3+7)/16 = 68.75%

等等,怎么调都是68.75%?因为总TQ数固定了。这时候需要增加TQ数:

如果TQ = 100ns,位时间 = 2000/100 = 20个TQ
Sync_Seg = 1 TQ
Prop_Seg = 4 TQ
Phase_Seg1 = 10 TQ
Phase_Seg2 = 5 TQ
采样点 = (1+4+10)/20 = 75%

75%就合理了。你看,配置位时序就是个迭代的过程。

我的建议:先用CAN计算器工具算个大概,再根据实际测试微调。别指望一次配好。我每次换新项目,都会在示波器上抓一下CAN波形,确认采样点位置对不对。

4.7 总结

位时序配置,说白了就是平衡三个因素:

  • 总线长度(决定传播段)
  • 晶振精度(决定相位缓冲段)
  • 波特率(决定总TQ数)

记住一个原则:采样点尽量靠后,但别超过90%。留足相位缓冲段的调整空间。电机控制环境恶劣,我一般把采样点设在80%左右,留20%的余量给干扰。

最后说一句:别迷信默认配置。每个项目的总线长度、节点数量、晶振精度都不一样。花10分钟配好位时序,能省你后面10小时的调试时间。这是我用血泪换来的经验。