☰
低成本单发单收激光测距方案:原理、硬件链路与标定补偿
2026/10/21 9:46:31 网站建设 项目流程

做嵌入式这些年,我被人问得最多的问题之一就是:能不能用尽量少的成本,做出一套真正能出货的激光测距方案?稍微正统的工业方案,同轴光学、单光子探测、专用处理芯片三件套下来,光物料成本就能劝退一大半小项目。所以我一直很关注低成本单发单收激光测距传感器全套解决方案这条路——一个激光二极管发射,一个光电二极管接收,不做同轴光路,不拼接收灵敏度极限,靠电路设计和标定算法把精度一点点抠出来。这篇文章就把整套方案从原理、选型、硬件链路、光学结构、标定补偿到量产测试完整拆开讲,适合正在评估避障传感器、料位计、门锁距离检测、小型机器人测距模块的开发者,也适合想真正弄明白激光测距原理的硬件爱好者。

1. 为什么“单发单收”是低成本测距的核心取舍

1.1 先搞清楚:激光测距的三个主流分支

激光测距大致有三条技术路线。三角法是把激光斜着打到目标上,在位置敏感探测器上成像,靠光斑位移反算距离,近距离精度高,但距离越远精度下降越明显,而且接收器要用面阵或一维PSD,复杂度并不低。干涉法精度能到纳米级,但需要相干光源和参考光路,体积和成本都压不下来,普通测距产品根本用不上。真正适合几十厘米到几十米场景的是飞行时间法,也就是TOF:测光脉冲从发射到返回的往返时间,距离等于光速乘以时间再除以二。

单发单收的“单发”指只用一个激光二极管做发射源,“单收”指只用一个光电二极管做接收。发射管和接收管一左一右平行放置,激光脉冲打出去,目标表面发生漫反射,一部分散射光回到接收管。这个架构最大的优势就是光学部分极简:不需要分光棱镜,不需要同轴光路,不需要光纤耦合,光直接从发射端出去,又直接从接收端回来。你甚至可以把两个管子贴在同一个平面上,中间加一块遮光板就完事。

1.2 单发单收适合什么场景,不适合什么场景

这套方案主要针对漫反射目标,比如墙面、纸箱、木板、布料、塑料外壳、地面、混凝土等。典型应用包括机器人避障、AGV防撞、自动门感应、厕位占用检测、垃圾料位监测、无人机定高、门锁开盖检测。这些都是“目标表面比较粗糙、反射方向比较分散”的场景,正是单发单收最喜欢的地方。

但它也有明显短板。镜面反射目标很麻烦,瓷砖、玻璃、光亮金属表面会把光定向弹走,接收管往往收不到回波。透明物体也头疼,激光会直接打穿过去,距离值会跳到后面的物体上。强阳光下测黑色小目标,则是对整套系统信噪比的极限考验。这背后是反射率问题:90%反射率的白墙和10%反射率的黑色绒布,能回到接收端的功率可能差9倍,你的设计余量至少要留一个数量级。所以选型之前,先拿目标样品实测反射强度,比看任何公式都重要。

2. 全套方案的架构与技术选型

2.1 波长与光源选择

光源波长常见的有650nm红光、850nm红外、905nm红外和940nm红外。650nm激光管便宜、可见光便于调试,但有两个问题:红光在太阳光里成分强,接收端环境光干扰大;而且红点容易让用户觉得刺眼,光学安全等级也容易受限。我更推荐850nm到905nm的红外脉冲激光二极管,尤其是905nm,这是很多脉冲激光测距模块的标准波长。

接收端的选择跟着波长走。850-905nm区间,普通硅PIN光电二极管响应度好,放大电路也好做。功率方面别贪大,小功率脉冲激光管配合窄脉宽已经够用。比如脉宽20纳秒、峰值功率5瓦,单脉冲能量算下来就是0.1微焦,按1kHz重复频率算,平均功率也就0.1毫瓦左右,既能保证安全等级,又不会把驱动电路搞得像高压脉冲发生器一样难伺候。

2.2 接收端:PIN管加TIA还是APD

很多入门者会问:要不要直接上APD雪崩光电二极管?APD灵敏度确实高,但需要几十伏甚至上百伏的偏压电路,温度变化时增益跟着漂,单片价格也高,除非你要做几十米甚至上百米测程,否则在低成本方案里完全不划算。主流做法是PIN光电二极管加跨阻放大器TIA。

具体选型时要把“感光面积”和“带宽”放在一起权衡。感光面积大,收到的光多,但结电容也跟着大,带宽会掉;面积小,带宽上去了,光却不好收了。折中下来,选感光面积1平方毫米左右、带宽能做到50到100MHz的管子,能比较好地覆盖纳秒级脉冲。TIA之后通常还要加第二级电压放大,最后进高速比较器把模拟回波转换成数字脉冲,送给时间测量单元。

2.3 测时与处理:从专用TDC到纯定时器

测距的核心是测时间。光速大约是每纳秒30厘米,但光脉冲走的是往返,所以实际距离分辨率和时间分辨率的关系是:1纳秒对应约15厘米距离。要做出厘米级精度,你的时间测量分辨率至少要达到几十皮秒,普通MCU定时器根本无法直接满足。三种方案对比如下:

方案时间分辨率成本量级适用阶段
专用TDC芯片几十皮秒中量产主力
集成TDC外设的MCU百皮秒级中低适合选型受限时
纯MCU定时器捕获纳秒到十几纳秒最低原理验证

纯MCU定时器方案不是不行,但84MHz定时器的分辨率大约是11.9纳秒,对应1.8米的分辨率,只能用来做“有没有物体”的粗判断,做不了精确距离。有人会在比较器输出后加RC延时网络做时间放大,再塞到定时器里测,标定极其痛苦,量产一致性很难保证。所以我建议:只要能跑通BOM成本,优先上专用TDC芯片,国内很容易买到,常见的有GP22这类型号,分辨率能做到几十皮秒,SPI接口接MCU,读回来就是时间值,剩下的事情都是算法的事了。

2.4 光学结构:透镜、滤光片与视场匹配

很多人低估了光学部分的权重,总觉得电路调好就能测。实际上光信号的收集效率决定了你能测多远、多稳。发射端激光二极管本身的发散角很大,需要配一颗短焦距凸透镜把光斑收窄;接收端用更大一点的透镜把目标反射光汇聚到PIN管上。接收透镜口径越大,收集的光越多,信噪比越好,但成本、体积都会跟着涨。

滤光片是白天户外使用必须认真考虑的一环。太阳光在近红外波段也有不少能量,全波段接收的话,背景光电流会把放大器直接推饱和。窄带滤光片只让激光波长附近更窄的一段光通过,比如中心波长905nm、带宽10nm,这样晴天背景光能压掉一大截。外壳方面还要做遮光筒,防止环境光从侧面漏进接收管。一套低成本光路可以是:发射管、发射透镜、遮光隔板、接收滤光片、接收透镜、PIN管,全部沿光轴排好。

3. 硬件链路拆解:从发射脉冲到距离数据

3.1 发射驱动:用MOSFET电容放电打出窄脉冲

激光二极管需要的是高峰值电流、纳秒级脉宽的电流脉冲。直接让MCU引脚驱动肯定不行,常见做法是储能电容放电。先通过升压电路把母线电压提到几十伏,对一个小容量电容充电,然后打开串联的MOSFET,让电容瞬间通过激光管放电。放电瞬间电流可以达到几安甚至几十安,关键就在脉冲前沿足够陡。

这里最容易犯的错误是忽略回路电感。开关管、电容、激光管之间的走线如果太长太细,电感会把脉冲前沿拖缓,激光峰值功率上不去,回波自然弱。我一般会把这段走线设计得又短又粗,必要时在PCB上做成铺铜回路,让放电回路面积尽量小。另外,激光二极管极性接反一次就废了,静电防护和防反接保护必须做在前面,节省的成本不能在这些细节上找回来。

3.2 接收链路与阈值比较:两级放大加高速比较器

PIN管接收到回波后产生一个微弱电流脉冲,跨阻放大器把它变成电压信号。TIA反馈电阻决定增益,但电阻太大带宽会掉,所以第一级做中增益保带宽,第二级再用宽带运放做电压放大,两级配合把总增益拉起来,同时避免单级放大过早饱和。

信号放大之后进高速比较器,阈值电压设定在噪声底之上、目标回波峰值之下,比较器输出翻转沿就是回波到达时刻。这个阈值非常关键:设得太低,噪声和串扰都可能触发误判;设得太高,远距离弱回波直接被丢掉。实践中我会用示波器看静态噪声幅度,再把阈值放在噪声峰峰值的两倍以上,一边看实测距离一边微调。TDC芯片内部如果自带比较器阈值控制,就能省掉外部电位器,校准也更方便。

3.3 时间测量引脚与中断延迟的处理

测时链路里,START信号表示激光发出的起始时刻,STOP信号表示回波到达的时刻。有人会把发射MOSFET的驱动信号直接作为START,这当然可以,但驱动电路本身有延迟,最好把START信号从和激光管同支路的电流采样点引出,让时间参考点尽量靠近光脉冲实际发出的位置。

TDC通常支持两个STOP通道,你可以用第二个STOP通道去测背景噪声或配电感耦合过来的串扰信号,用来做修正。还有一个容易被忽视的细节:TDC的参考时钟必须用低抖动晶振,不能图省事用MCU内部RC振荡器。参考时钟的抖动会直接变成时间测量误差,算下来就是距离抖动。我的经验是参考时钟单独走线,周围铺地,晶振下方不要走数字信号线。

3.4 一个典型工作序列:从触发到输出距离

完整测一次距离,逻辑上大概是这样一个流程:

  1. MCU启动升压电路,等待储能电容电压稳定。
  2. 向TDC写入测距命令,配置START和STOP通道。
  3. MCU给出发射使能脉冲,MOSFET导通,激光管出光。
  4. TDC记录START到STOP之间的时间差。
  5. 回波一到,比较器翻转,触发STOP;TDC完成转换,拉中断通知MCU。
  6. MCU通过SPI读取时间值,减去系统零偏,套标定补偿公式,输出距离。

这套流程看起来简单,实际做起来每一环都有坑,比如升压纹波会干扰TDC参考时钟,发射使能和TDC启动命令之间需要足够同步,回波太弱时TDC可能一直等不到STOP而导致超时。所以软件里一定要有超时保护,比如10毫秒没等到回波就判定为“本次无有效目标”。

4. 光学与结构:不用同轴也能把距离测准

4.1 偏轴布局的视差与自身串扰

单发单收不是没代价的,代价就是近距视差。发射透镜和接收透镜并排,光学中心之间有间距D,目标越近,发射视场和接收视场越不重合。实际表现的等效距离误差大约可以用δ≈D²/(8L)来估算,D是发射接收中心间距,L是目标距离。举个例子,D取30毫米,目标在100毫米处,误差算出来约1.1毫米;目标降到50毫米处,误差约2.25毫米。毫米级误差用标定能修正,不影响产品可用性。

真正要命的是串扰。发射管的光如果没经过目标,直接从PCB表面、外壳内壁、透镜边缘漏到接收管,接收电路会看到一个极短时间的假脉冲,在时间上表现为一个很近距离的固定假回波。解决办法就是结构上做遮光隔板,把发射腔和接收腔物理隔开,中间用不透光的挡板挡住。挡板不是随便一块塑料就行,表面要粗糙化处理,防止镜面反射把光引到接收端。

4.2 透镜、滤光片和遮光结构的配合

一整条光学链路的安装顺序,我建议是:发射管、发射透镜、遮光隔板、滤光片、接收透镜、PIN管。滤光片最好正对光路安装,不要斜着放。带通滤光片的中心波长和入射角度相关,倾斜安装会让中心波长偏移,导致激光波长落在通带边缘,透过率大打折扣。

透镜材质也有讲究。玻璃透镜光学性能稳定,温度变化影响小,但成本和重量高;PC透镜便宜,但耐热性差,如果靠近发射管,长时间连续工作可能有热变形风险。我的做法是发射端用耐热更好的玻璃透镜,接收端用PC透镜省成本,前提是发射功率不高、连续测距时间不长。

4.3 发射光斑与接收视场角的手动对齐方法

量产一致性的一大来源就是光学装配。发射管光轴和接收透镜视场中心如果偏差太大,哪怕元器件都没问题,测出来也是歪的。手工对齐有个很实用的方法:拿一块白墙放在中等距离,比如2米处,先让发射透镜把光斑打到墙面上,再通过接收端观察输出信号强度,微调发射管的位置和角度,直到回波信号最强;然后放到最远距离和最近距离各看一次,用两个靶标交叉验证,确保光斑都在接收视场内。位置确定后点胶固定,等胶完全固化后再做标定。

5. 标定与补偿:让低成本模块从“能测”到“测得准”

5.1 多点标定与分段线性

TDC读回来的原始时间差,不能直接套c*t/2算距离。为什么?因为整个链路里有电路延迟、比较器阈值延迟、透镜视差、滤光片的群延迟等等,这些加起来会让测距结果呈现一个整体偏移和非线性偏差。解决办法就是标定。

先在无强光的室内,用标准漫反射板或者干净的白墙做目标,选取一系列距离点,比如0.1米、0.2米、0.5米、1米、2米、3米、5米、8米、12米、15米。每个点连续采集几十次取中位数,得到一个“原始测量值”和“真实距离”的对应关系。然后做二次多项式拟合:

// d_true = a0 + a1 * d_raw + a2 * d_raw * d_raw float compensate_distance(float d_raw, float *coef) { return coef[0] + coef[1] * d_raw + coef[2] * d_raw * d_raw; }

如果多项式拟合在边缘距离点仍然偏差较大,就改用分段线性:把0.1到1米、1到5米、5到15米分成三段,每段单独求斜率和截距。分段表用数组存,运行时查区间后插值,逻辑更简单,也更容易解释给生产人员听。

5.2 温度补偿:阈值漂移和放大增益都随温度变

温度对测距的影响很多人到样机阶段才会发现。接收电路增益随温度变化,比较器阈值也在漂,激光管峰值功率同样随温度下降,结果就是同一个目标在低温下测出来变远了一些,高温下又可能变近。要做温度补偿,最直接的办法是高低温箱标定。

把产品分别放到比如零下10度、25度、50度的环境里,每个温度点测一组标准距离,记录偏差。如果偏差主要是一个整体偏移,就存一个温度补偿系数,写成offset = k1 * T + k2,最终距离等于补偿多项式输出加offset。如果斜率也变了,那就要存多组多项式系数,运行时按温度插值。实际出货验证时,我会设一个及格线:零下10度到50度范围内,0.5米、2米、8米三个点的误差不超过正负3厘米。

5.3 补偿参数的存储与调用

每台设备标定完成后,要把补偿系数烧录进EEPROM或者Flash,和产品序列号放在一起。结构体大概长这样:

typedef struct { uint32_t serial; float coef[3]; // 二次多项式系数 float temp_k1; // 温度偏移系数 float temp_k2; float zero_offset; // 零点偏置 uint16_t crc; // 校验 } calib_param_t;

上电时读取并校验CRC,运行时把实时温度代入查表或插值。有一点必须提醒:标定完成后存放的参数是不可变数据,软件升级时不要顺手把校准区也擦了,不然整批设备全部要返厂重新标。

6. 项目里踩过的坑:从波形到实测的现象化复盘

6.1 接收饱和与拖尾:近距离回波把放大器打穿

近距离强回波会把TIA推到饱和,放大器恢复需要时间,这段恢复期内电路无法处理新的信号,结果就是近距离盲区变大。我遇到过标称0.05米起测的产品,实际到0.2米以内数据就开始乱跳,查到最后就是饱和拖尾。解决思路是发射功率分档:近距离用低增益或低功率发射,远距离切回高增益,软件里根据估算距离自动切换。早期验证时也可以用限幅二极管把进入放大器的信号幅度钳住,但这会影响波形形状,所以更推荐分档发射。

6.2 环境光跳变:阳光下的距离随机跳几十厘米

样机阶段最容易出现的场景是:室内调得好好的,拿到室外太阳底下,距离数值开始无规律跳变。原因有两层:一是太阳光产生的直流光电流改变了接收电路静态工作点,牵着比较器阈值漂移;二是强背景光把放大器噪声抬高,误触发的概率大幅增加。解决办法按优先级排序:窄带滤光片、提高发射功率、软件滤波、硬件背景光抵消。我自己最常用的组合是滤光片加软件中位数滤波:连续测11次取中位数,能滤掉大部分随机跳变,代价是测量周期变长。

6.3 电源纹波与参考时钟抖动

升压电路是开关电源,纹波和地弹都会干扰TDC和模拟放大电路。尤其TDC参考晶振,电源噪声会变成时钟边沿的抖动,直接影响时间测量精度。这个问题的排查很难,示波器看不出来,但距离数据的标准差会明显变大。PCB布局时要把升压部分、数字部分、模拟接收部分分区布线,模拟地和功率地在单点汇合。TDC晶振下方不要走数字线,晶振电源用LDO单独供给,与DC-DC的输出之间加磁珠隔离。

6.4 现象与根因对照表

现象根因解决措施
近距离盲区过大接收放大饱和发射分档、限幅
室外距离随机跳变背景光改变静态工作点窄带滤光片、中位数滤波
低温距离整体偏长增益和阈值漂移温度补偿系数
固定近距离假回波内部串扰遮光隔板、表面粗化
数据稳定性差时钟抖动、电源纹波分区地、晶振独立供电
标定后仍偏差光学装配偏差双靶标对齐、点胶后重标

7. 量产一致性、功耗与小批量测试

7.1 每台单独标定的流水线怎么做

单发单收结构简单,但每台设备的装配公差都会影响零偏和斜率的细微差异。我建议小批量阶段就做到每台单独标定,不要用统一系数去套所有设备。标定工装可以很简单:一条滑轨或者一组固定距离的靶标,配上位机软件自动控制,设备上电后逐个距离点采集原始值,上位机直接算出系数写入存储区。一台设备走完整个流程控制在几十秒内,效率可以接受。

必须强调:点胶固化之后再标定,不要先标定再点胶。点胶过程的应力会让光学元件位置偏移零点几毫米,先标后点等于白标。出货测试的重点放在2米和8米两个距离点,用标准反射靶做快速抽检,超标设备自动拦截。

7.2 功耗设计与触发节奏

发射端瞬时电流虽然大,但占空比低,平均功耗不大。待机时让MCU睡眠、TDC睡眠、升压电路关断,待机电流可以控制在微安级。进行一次测距,升压建立需要几毫秒,再发射采样几毫秒,单次测距平均电流在几十毫安。如果用在电池供电场景,建议做成外部触发或内部定时唤醒模式,比如“测一秒停五秒”,而不是持续连发。

储能电容要选低漏电类型,否则待机状态下电容自己漏电,升压电路会频繁补电,白白浪费电流。另外升压电路的电感选型要兼顾峰值电流能力和体积,不能只看静态输出电流。

7.3 不同反射率目标的实测预期

不同反射率物体的测距能力相差很大,产品规格书里一定要写清楚。以一个比较保守的中功率配置为例:

目标大致反射率典型最大测程
白墙90%15米
浅色木板40%8到10米
灰色地面20%5到6米
黑色绒布10%2到3米

所以标称测程不能只写一个数字,规范写法是“0.05到8米,90%反射率目标;0.1到3米,10%反射率目标”。如果你把黑色目标的测程写进规格就没有太多水分,后面客户争议会少很多。

最后聊一个实际的体会。整套方案做下来,物料成本大头往往不在激光管和PIN管上,而是在TDC芯片和透镜。如果应用场景对精度要求不高,可以先砍掉专用TDC,只用定时器捕获加标定曲线,虽然分辨率差一些,但小成本demo完全够用。真正要把精度做到毫米级、稳定性扛过温度变化,该花的还是得花。我自己的经验是:先搭一套“能响”的电路验证光路和结构,再决定要不要上更贵的测时芯片,这个顺序能帮你省掉很多返工时间。做这类产品,心急没用,把光路调好、标定做扎实,比纠结芯片型号重要得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询