第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小时的调试时间。这是我用血泪换来的经验。