4. dToF核心原理:SPAD、TDC与直方图统计法
各位同学,今天我们来聊聊dToF最核心的三个硬件模块。说实话,这三个东西搞明白了,整个dToF系统你就掌握了七成。我当年刚接触ToF时,就是被SPAD和TDC的配合给绕晕的——后来自己动手搭了一套测试板,才真正理解它们是怎么协同工作的。
4.1 单光子雪崩二极管(SPAD)
SPAD,说白了就是一个“光子计数器”。它工作在盖革模式,什么意思呢?就是给它加一个高于击穿电压的偏置,这时候一个光子打进来,就能触发雪崩效应,产生一个可检测的电流脉冲。
核心要点:SPAD不是模拟器件,它是数字器件——要么检测到光子,要么没检测到。没有中间状态。
我个人习惯把SPAD比作一个“电子眼”。平时它处于待命状态,一旦有光子闯入,立刻产生一个脉冲信号。这个脉冲的上升沿非常陡,大概几十皮秒级别,这就是我们做高精度时间测量的基础。
我在项目中遇到过一个问题:SPAD的暗计数率(DCR)会随着温度升高而急剧增加。有一次在户外测试,环境温度从25°C升到45°C,暗计数直接翻了三倍。嗯,这里要注意——如果你做的是消费级产品,一定要考虑温度补偿方案。
SPAD的关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| 光子探测效率(PDE) | 10%~30% | 波长相关,近红外波段偏低 |
| 暗计数率(DCR) | 100~1000 cps | 温度每升高10°C,约翻倍 |
| 时间抖动(Jitter) | 50~200 ps | 影响距离精度 |
| 死时间(Dead Time) | 10~100 ns | 淬灭后恢复时间 |
避坑指南:我曾经犯过一个错误——为了追求高PDE,选了一款大尺寸SPAD。结果发现时间抖动大得离谱,测距精度完全达不到要求。后来才明白,SPAD的尺寸和抖动是成正比的,小尺寸SPAD虽然PDE低一些,但时间特性好得多。
4.2 时间数字转换器(TDC)
TDC的任务很简单:测量从激光发射到SPAD检测到光子之间的时间差。但这个“简单”的任务,做起来一点都不简单——我们需要皮秒级的时间分辨率。
你想想看,1厘米的距离对应约67皮秒的时间差。如果TDC的分辨率是100皮秒,那测距精度就只有1.5厘米左右。对于很多应用来说,这远远不够。
TDC的两种主流架构
- 延迟线法(Delay Line):用一系列延迟单元把时间量化为数字。优点是结构简单,缺点是受工艺和温度影响大。
- 游标法(Vernier):用两个不同频率的振荡器做差值测量。精度高,但功耗也高。
我个人更偏爱延迟线法,尤其是在低功耗场景下。记得有一次做一款电池供电的扫地机器人,TDC功耗必须控制在1mW以内,游标法直接pass掉,最后用延迟线法配合校准电路搞定了。
小技巧:TDC的非线性误差(DNL/INL)是影响测距精度的关键。我建议在量产前做一次全量程的TDC校准,把每个bin的偏移量记录下来,在软件里做补偿。这个方法虽然老套,但非常有效。
4.3 直方图统计法
好了,现在SPAD和TDC都有了,是不是就能直接测距了?没那么简单。单次测量受噪声影响太大——暗计数、环境光、串扰...随便一个干扰就能让结果偏差几米。
直方图统计法就是来解决这个问题的。说白了,就是重复测量很多次,把每次的TDC结果扔进一个“桶”里,哪个桶里的光子最多,那个桶对应的时间就是真实的飞行时间。
// 直方图统计的伪代码示例
uint32_t histogram[TDC_MAX] = {0};
for (int i = 0; i < NUM_SHOTS; i++) {
// 发射激光
emit_laser_pulse();
// 等待SPAD触发
uint32_t tdc_value = wait_for_spad();
// 累加到直方图
histogram[tdc_value]++;
}
// 找到峰值
uint32_t peak_bin = 0;
uint32_t max_count = 0;
for (int i = 0; i < TDC_MAX; i++) {
if (histogram[i] > max_count) {
max_count = histogram[i];
peak_bin = i;
}
}
// 计算距离
float distance = peak_bin * TIME_PER_BIN * SPEED_OF_LIGHT / 2.0;
这段代码看起来简单,但实际工程中要考虑的东西很多。比如:
- 直方图的大小:bin太多浪费内存,bin太少精度不够
- 累积次数:次数越多信噪比越好,但帧率会下降
- 峰值检测算法:简单的最大值法容易受噪声干扰,我一般用高斯拟合
核心思想:直方图统计法本质上是在做“时间域上的信号积累”。信号是相干的(每次都在同一时间出现),噪声是随机的(均匀分布在各个时间bin里)。积累次数越多,信噪比提升越明显——理论上每增加4倍次数,信噪比提升6dB。
我曾经做过一个实验:在强环境光下(100klux),单次测量的信噪比只有0.5,根本没法用。但把累积次数增加到1000次后,信噪比提升到了15以上,测距误差控制在2厘米以内。这就是直方图统计法的威力。
多路径干扰的初步认识
直方图统计法还有一个隐藏的好处——它能帮我们识别多路径干扰。你想想看,如果只有一个反射面,直方图里应该只有一个峰。但如果存在多路径(比如玻璃反射+墙面反射),直方图里就会出现多个峰。
嗯,这里要留个悬念。多路径干扰的消除方法,我们会在后面的章节详细讲。但你现在至少要知道:直方图是识别多路径的第一道防线。
我的经验:在实际项目中,我建议把直方图数据也输出到调试接口。有时候测距结果异常,看一眼直方图就能发现问题——是噪声太大?还是出现了多路径?一目了然。
本章小结
SPAD、TDC、直方图统计法,这三个模块构成了dToF系统的核心链路。SPAD负责“看”光子,TDC负责“计时”,直方图负责“决策”。三者缺一不可。
最后说一句:这些原理看起来简单,但真正做好一个dToF系统,需要大量的工程调试。我建议你如果有条件,可以买一块SPAD评估板,自己动手搭一套测试系统。纸上得来终觉浅,绝知此事要躬行。
公众号:蓝海资料掘金营,微信deep3321