采样点与采样窗口:采样点的位置、采样次数的意义
各位好,这一章我们聊聊 CAN FD 位时序里最容易被忽略、但恰恰最影响稳定性的两个参数——采样点和采样窗口。说白了,就是你在每个位时间里到底在哪个时刻去读总线,以及你读几次、怎么判断。
我一开始做 CAN FD 时,总觉得只要把波特率算对就行,采样点随便设个 70% 或者 80% 都能跑。后来有一次量产现场,某款设备在温度升高后频繁报错,解析出来全是位填充错误和 CRC 错误。折腾了三天,最后发现就是采样点偏了 2% 导致的。从那以后,我对采样点的态度就完全变了——它不是「差不多就行」的东西。
1. 采样点到底在哪?
先看一个 CAN FD 位的结构。每个位时间分为四个段:同步段、传播段、相位段1、相位段2。采样点就插在相位段1和相位段2之间。
关键概念:采样点 = (同步段 + 传播段 + 相位段1) / (总位时间) × 100%。通常推荐值在 70%~85% 之间。CAN FD 的数据阶段由于速率更高,建议靠后一点,比如 80% 左右。
为什么不能太靠前?因为总线电平需要时间从发送节点传播到接收节点,加上振荡器漂移和线路延迟。采样点太靠前,你读到的是不稳定的过渡区信号。太靠后呢?留给相位段2的缓冲时间就少了,万一有累积误差,下一个位就来不及同步了。
我在一个混装车型项目里遇到过,不同供应商的节点晶振精度差异很大,有的 ±0.1%,有的 ±0.5%。按照标准设置采样点 75%,结果高速 CAN FD 数据阶段频繁出错。后来我建议把采样点改到 83%,并且给每个节点单独微调了 SSP,问题才解决。
2. 采样窗口——你的容差范围
采样窗口不是采样点本身,而是采样点前后一段「允许读取」的时间范围。硬件实际采样时,由于振荡器抖动和量化误差,采样时刻并非精确。采样窗口宽,抗干扰能力就强;但窗口太宽,可能把相邻位的噪声读进来。
| 参数 | 含义 | 常见值 |
|---|---|---|
| SSP(次级采样点) | 在相位段1末尾插入的补偿点 | 通常设为 2~4 个 TQ |
| 采样窗口宽度 | 实际采样允许的时间抖动范围 | ±1 TQ 或 ±2 TQ |
| 最大偏差容忍 | 由采样窗口决定的相位误差极限 | 随速率变化,高速时更严苛 |
技巧:在 CAN FD 数据阶段(比如波特率 5 Mbps),一个 TQ 只有 20 ns。采样窗口哪怕偏移 5 ns,都可能读到错误电平。我习惯把 SSP 设置为 2 个 TQ,并配合三次采样,效果不错。
3. 采样次数——三次采样 vs 单次采样
CAN FD 协议允许在每个采样点进行一次采样(单次),或者连续采样三次并以多数决作为最终值(三次采样)。
三次采样怎么工作的?说白了就是:在采样窗口内连续读三次总线电平,如果两次或以上都是显性,就判定为显性;否则判定为隐性。这个机制可以有效过滤短时噪声毛刺。
- 单次采样:硬件开销小,适合干扰较小的环境。但遇到窄脉宽噪声,容易被误判。
- 三次采样:需要额外 2 个 TQ 时间(用于三次采样),会稍微压缩相位段2的长度。好处是鲁棒性大幅提升。
注意:开启三次采样后,必须确保采样窗口内三次采样的间距合理。如果间距太短(比如 1 TQ),三次采样实际上没有拉开,抗噪声效果打折;如果间距太长,可能跨越到下一个位,引发更大的错误。
我个人建议:在总线长度超过 5 米、或者环境中有较强电磁干扰(比如靠近电机驱动)时,务必开启三次采样。我曾经在一个自动化产线项目里,机器人手臂每次动作都会导致总线出现位错误,开启三次采样后错误率从 0.3% 降到了几乎为零。
4. 流程图:采样点与采样窗口的配置逻辑
下面这张图总结了从确定总位时间到最终验证的配置流程,你可以根据自己的项目情况走一遍。
5. 实战排查清单
如果你现在正在调一个 CAN FD 网络,遇到了莫名的位错误或 CRC 错误,可以按下面清单排查采样点相关项:
- 确认总位时间与 TQ 数量——我遇到有人把 TQ 设成 4 个,结果相位段1只有 1 个 TQ,根本没法微调采样点。
- 计算实际采样点百分比——用示波器抓总线波形,看采样点是否落在位中间偏后区域。
- 检查 SSP 设置——有些控制器 SSP 默认是 0,需要手动改成 2 或 3。
- 确认采样次数——如果环境干扰不确定,直接上三次采样。
- 跑眼图测试——在示波器上积累大量位,观察眼图张开程度。采样窗口越大,眼图中心区域越宽。
一个小经验:当你在 5 Mbps 以上跑 CAN FD 时,采样点每偏移 2%,错误率可能翻倍。我习惯在最终锁定参数前,用 CAN 分析仪发送 10 万个随机 ID 的报文,确保错误帧为 0 才放心。