☰
基于PSD的光电定位仪设计与实现:从跨阻放大到坐标解算
2026/10/11 17:14:30 网站建设 项目流程

简介:本资源为本科毕业设计项目“光电定位仪”的完整工程实现,面向电子信息、测控技术与仪器、自动化等专业的高年级本科生及嵌入式系统初学者,解决高精度位移与方位联合定位的硬件集成与算法协同问题。压缩包共22个文件,含7个核心C源码(如ADNS9500.c、HMC5983.c、main.c)、2个IAR Embedded Workbench工程配置文件(.ewp/.ewd)、2个调试符号表(.wsdt/.dbgdt)及LCD驱动、SPI通信、传感器校准等模块化代码,辅以README.md说明文档与编译脚本(.bat),总大小仅89KB,轻量易部署。已有239人学习下载,资源结构清晰,按功能分层组织,涵盖MSP430F149主控平台下的激光传感器高速采样(最高117500fps)、三轴电子罗盘姿态解算、12864液晶实时数据显示及专用光学透镜组适配逻辑,提供从硬件驱动到系统联调的完整闭环参考。

1. 项目概述与核心思路

1.1 光电定位仪到底是什么

先说说这个东西是干什么的。光电定位仪,说白了就是利用光信号来确定目标位置的一类设备。你把它想象成一套“光的尺子”,它把打在探测器上的光斑位置,换算成目标的空间坐标,核心价值是在非接触的前提下完成高精度的位置测量。这次毕业设计的完整课题是“光电定位仪”,名字里带个“仪”字,说明它不是单纯做个仿真或者理论推导,而是要做出一个能实际测量、能输出数据、能看得出精度指标的硬件系统。

这套系统的典型工作场景包括:激光光束对准、平台姿态监测、微小位移测量、自动化产线上的位置校准等。很多工业场景里,机械结构不方便直接接触被测物,或者被测物本身不能受力,这时候光电定位就成了一个很自然的解决方案。整套系统一般由光学接收模块、光电传感器、信号调理电路、数据采集单元、核心处理器和上位机显示软件组成。本科毕设把它做成一个完整闭环,既能锻炼硬件设计能力,又能锻炼嵌入式编程和数据处理能力,是一个综合性很强的题目。

1.2 为什么选这个题目以及它解决的核心需求

选这个题目的原因,说实话本科阶段很多课题要么偏纯理论,要么就是单一模块的小玩意,像光电定位仪这种“光、机、电、算”四样全占的题目,在毕设里算是含金量比较高的一类。它的核心需求可以拆成几条:第一,完成一个能实际工作的光电位置传感器模型;第二,通过硬件电路和软件算法把光斑坐标稳定、准确地解算出来;第三,整个系统要有可量化的精度指标,能够用实验数据证明设计方案的可行性。

这三条需求背后对应的是三种能力:光学系统设计能力、模拟电路设计能力、嵌入式信号处理能力。本科阶段这三项能力都练到,无论以后是读研还是直接工作,都有东西可写、有项目可说。很多同学毕设做完之后简历上只有课程设计级别的项目,但光电定位仪这个题目做完,至少是一个完整的“传感器+信号链+处理器+算法”的全栈项目,面试聊起来也更有底气。

另外,这个题目本身还有扩展空间。如果你愿意,可以往机器视觉方向走,把光斑定位做成二维图像处理;也可以往精密测量方向走,把定位精度从毫米级往微米级推。毕设做完之后,这个东西不是一次性的,它可以作为后续科研或者工程开发的原型平台,这是很多“验证性”题目不具备的优势。

2. 光电定位的核心原理与方案选型

2.1 常见光电位置检测方案的对比

光电定位的实现方案有好几条路线,本科毕设里最常接触到的有四类:CCD/CMOS图像传感器方案、四象限探测器方案、PSD位置敏感探测器方案、以及基于光栅或干涉的精密测量方案。这几种方案的原理、精度、成本、复杂度差别很大,选哪条路直接决定了后面三个月的工作量和最终的实验效果。

CCD/CMOS方案相当于用一个微型相机拍光斑,然后通过图像处理算法找光斑的质心位置。它的优点是灵活性高,可以测多个光斑、可以测光斑形状、适应性强;缺点是帧率受限、算法复杂、成本偏高,而且需要做镜头畸变标定,纯软件工作量比较大。四象限探测器方案是把感光面分成四个象限,通过比较四个象限的光电流大小来推算光斑中心位置,它的响应速度很快,电路也相对简单,但有个致命短板——当光斑中心接近零点时线性度较好,一旦光斑偏离中心较多,四象限的响应会明显非线性,测量范围很受限。PSD方案同样是基于光电二极管,但它利用的是横向光电效应,输出电流与光斑位置成线性关系,位置分辨率高、响应快、外围电路相对成熟,是精密定位应用里非常主流的选择。光栅干涉方案精度最高,可以到纳米级,但成本高、系统复杂,本科毕设除非有实验室现成条件,否则一般不建议碰。

方案类型核心原理精度量级主要优势主要短板
CCD/CMOS图像法图像质心计算亚像素级灵活、信息量大成本高、算法复杂
四象限探测器象限光电流比较微米至毫米级响应快、电路简单线性范围小
PSD位置敏感探测器横向光电效应微米级线性度好、分辨率高位置与光强耦合
光栅/干涉法相位测量纳米级精度极高系统复杂、成本高

2.2 本设计采用的技术路线及选型理由

如果让我给本科毕设推荐一个最容易出成果、又最能体现综合能力的路线,那就是PSD方案。原因很直接:PSD输出的是模拟电流信号,想把它处理好,你需要设计跨阻放大电路、滤波电路、加法减法运算电路;需要做ADC采集;需要写嵌入式软件把电流信号换算成坐标;还需要做误差分析和标定。一条完整的信号链全走一遍,硬件和软件能力都能得到充分锻炼,而且PSD的线性度天然比四象限好,实验结果做出来更漂亮,答辩的时候也更好讲。

具体的器件选型,PSD主流型号包括Hamamatsu的S1880、S3931、S2044等,国产的也有类似替代。以S1880为例,它的感光面尺寸是12mm×12mm,光谱响应范围覆盖320nm到1100nm,峰值响应在960nm附近,这个波段对应的是近红外激光,所以选激光光源的时候可以考虑650nm红光半导体激光器,也可以用850nm或905nm的红外激光器,具体看手头有什么设备。如果实验室有现成的650nm激光笔,直接用就行,PSD在可见光波段也有不错的响应,只是灵敏度没有近红外波段那么高,实际测试时注意调节激光功率或者衰减片就行。

选PSD方案还有另外一个好处——后续的标定过程很有说服力。PSD的输出电流和光斑位置呈线性关系,但实际器件会有暗电流、背景光干扰和放大电路偏置,这些非理想因素正好可以作为毕业设计“误差分析”章节的素材,把这些问题逐一定性和修正,论文的完整性就从这里体现出来。

2.3 系统总体框图与信号链路设计

整套系统的信号流向是这样的:激光器发出的光经过透镜聚焦后照射到PSD感光面上,PSD输出两对电流信号,分别是X1/X2和Y1/Y2,这四个电流值非常微弱,通常在微安到纳安级别,必须经过前置跨阻放大器转换为电压信号,然后通过加法器和减法器得到X通道的“和信号”与“差信号”,Y通道同理。差信号除以和信号,得到的就是归一化的位置坐标,这样做的目的是消除光源强度波动对位置测量的影响。

这里有一个关键点,为什么位置坐标是差值除以和值而不是直接用差值?因为PSD的定位原理决定了输出电流的大小既跟光斑位置有关,也跟入射光功率有关。如果直接用差值代表位置,激光器功率漂移或者环境光变化都会导致测量结果偏移。用差值除以和值之后,光功率的影响被归一化掉了,位置信号就只跟光斑的几何位置相关,这个“归一化”的思想是整个PSD信号处理的核心,也是论文里最值得展开讲的地方。

后级的信号调理电路包括增益调整、低通滤波和电压抬升。因为ADC的输入范围通常是0V到3.3V或者0V到5V,而运算放大器输出的信号是双极性的,需要把负电压抬升到ADC的采样范围内。这一级的电路设计直接决定了系统最终的测量精度,很多同学在这地方翻车,后面我会单独说。

3. 硬件电路设计与搭建实录

3.1 跨阻放大电路的设计与计算

跨阻放大电路是PSD信号链的第一级,也是最容易出问题的一级。它的作用是把PSD输出的微弱电流转换成电压信号。基本结构就是一个运算放大器,反相输入端接PSD的输出电流,反馈电阻接在反相输入端和输出端之间,同相输入端接地。输出电压等于反馈电阻乘以输入电流,即Vout = I × Rf。

这里边的学问主要在反馈电阻的取值和运放选型上。PSD的满量程输出电流和光功率相关,以S1880为例,当光斑功率在微瓦量级时,输出电流大概在零点几微安到几微安。假设我们希望满量程输出电压是2V,那反馈电阻就取Rf = 2V / 1μA = 2MΩ。实际搭电路的时候,2MΩ的电阻会引入比较大的热噪声,而且和运放输入电容、PCB寄生电容组合后很容易产生自激振荡,所以需要在反馈电阻两端并联一个几皮法的电容做相位补偿,具体容值根据实际示波器观测结果调整。

运放选型上,我踩过一个大坑。一开始我用了普通的LM358,结果输出噪声大得离谱,信号基本被噪声淹没了。原因在于LM358的输入偏置电流是纳安级别的,而PSD的输出电流也是纳安到微安级别,两者在同一个量级,偏置电流直接叠加在信号上,导致严重的直流偏移。后来换了ADI的AD8605,输入偏置电流只有皮安级别,噪声也低很多,问题一下子就解决了。所以做微弱信号处理,运放选型第一条准则就是——输入偏置电流要比信号小至少两个数量级,不然你的电路根本没法用。

3.2 加法减法电路与归一化处理实现

跨阻放大之后,四个通道的信号分别是Vx1、Vx2、Vy1、Vy2。要得到位置坐标,需要构建这两组运算:和信号Vsum_x = Vx1 + Vx2,差信号Vdiff_x = Vx1 - Vx2。Y通道同理。这一步在模拟域完成,用一个运放搭加法器,再用一个运放搭减法器就行。

考虑到PSD的感光面是连续的,光斑在任意位置时,X1和X2的输出电流会随着光斑位置在两者之间分配。用一个简单的例子说明:假设光斑在正中心,X1和X2电流相等,差信号为零;光斑向X1方向偏移,X1电流增大、X2电流减小,差信号变大。所以差信号实际上就是位置信息的原始载体。

这里有个实操细节需要注意:加法器和减法器的增益匹配问题。运算放大器电路里,电阻的精度直接影响加减法的精度。如果加法器的两个输入电阻阻值不一致,和信号就会产生偏差,进而影响后边归一化计算的结果。我实际用的是0.1%精度的精密电阻,虽然贵一点,但从实验结果看,这个投入是值得的。

模拟域做完差分和加法之后,按照理论接下来应该做除法。不过模拟除法器电路复杂、精度难保证,我在实际设计中改用了数字方案——把和信号与差信号都送到STM32的ADC,在单片机里直接做浮点除法。这个改动大大简化了模拟电路,也让后边的标定和滤波变得更加灵活。

3.3 滤波电路与ADC采集的注意事项

滤波电路我采用的是一阶有源低通滤波器,截止频率设在了100Hz左右。为什么选100Hz?因为光斑定位的核心应用场景是准静态或者慢变测量,光斑位置变化的频率一般不会超过几十赫兹,把高频噪声滤掉之后,位置数据会平滑很多。如果你做的是动态测量,那截止频率就要重新设计,这取决于测量目标的运动速度。

ADC采样的关键是参考电压和采样时序。我在STM32上用的是12位ADC,参考电压接外部精密基准源,没有用芯片内部的VREF。内部参考电压的温漂比较大,会导致采样值随温度漂移。虽然毕设阶段很多同学觉得没必要搞这么细,但我想说的是,高精度的测量系统,每一个环节的误差都会累积到最终结果上。你把参考电压换成一个基准芯片,比如TL431或者REF3030,成本也就几块钱,但数据稳定性的提升是肉眼可见的。

另外,PSD的输出电流极其微弱,所以PCB布线的要求很高。我的经验是:第一,跨阻放大器的输入走线要短,而且周围要用地线包裹;第二,PSD的地线要单独走,不要和数字电路的地线混在一起;第三,电源去耦电容要靠近运放的电源引脚放置。这三个点做到了,噪声问题基本能控制住。

4. 嵌入式软件与定位算法实现

4.1 STM32端的数据采集与处理流程

软件部分我用的主控是STM32F103C8T6,也就是大家常说的“蓝色药丸”开发板。选它的原因很朴素——便宜、资料多、性能足够用。ADC的采样率不需要很高,因为信号是准静态的,我配置的是100Hz采样率,每次采样四个通道(X1、X2、Y1、Y2),每个通道采集64次做平均滤波,然后计算一次位置坐标。这样每秒能输出约1.5个位置点,既有足够的抗噪能力,又能保证实时响应。

ADC采样顺序上要注意一个问题:四个通道的信号是同时存在的,但单片机的ADC只有一个(多通道通过多路开关切换),所以理论上做不到严格同步采样。如果光斑位置快速变化,四个通道的采样时刻不同会导致位置计算误差。解决办法有两个:一是提高ADC采样率,把通道间的时间差压缩到足够小;二是用四路ADC同步采样的方式,但F103不支持,需要换系列。工程上一般用第一种方案就够了,100Hz的位置变化频率下,通道间的微小时间差造成的误差可以忽略不计。

4.2 坐标解算算法的数学模型与参数修正

PSD的位置解算公式并不复杂,归一化坐标的计算方式是:

X_norm = (Vx1 - Vx2) / (Vx1 + Vx2)

Y_norm = (Vy1 - Vy2) / (Vy1 + Vy2)

这里X_norm和Y_norm是一个无量纲的相对值,范围大约在-1到1之间。要得到实际的毫米坐标,还需要乘上PSD感光面长度的一半。以S1880的12mm×12mm感光面为例,实际坐标就是:

X_mm = X_norm × 6

Y_mm = Y_norm × 6

但这个公式是理想情况下的。实际器件会因为以下几个原因产生偏差:第一,PSD本身的暗电流会在输出端产生偏置;第二,四个通道的放大电路增益不可能完全一致;第三,光学系统的畸变会导致光斑在实际位置和PSD感受到的位置之间有一个映射关系偏差。所以,光靠理论公式直接算坐标,精度通常不理想,必须做标定。

我的标定方法是这样的:把PSD固定在一个带千分尺的二维平移台上,激光器保持不动,控制PSD以1mm步进在X和Y方向移动,记录每个位置的归一化坐标,得到一组标定数据。然后用最小二乘法拟合出实际物理坐标和归一化坐标之间的线性映射关系,也就是一个2×2的变换矩阵加上偏移量。做完这一步之后,系统的测量精度会有明显提升,实测线性误差可以从几个毫米降到零点几个毫米。

4.3 上位机与数据可视化实现

为了把测量结果直观地展示出来,我用Python写了一个简单的上位机程序,通过串口读取STM32发送的位置坐标,实时绘制光斑轨迹。上位机界面不需要很复杂,核心功能就两个:一个是实时显示当前位置坐标数值,另一个是绘制光斑在二维平面上的移动轨迹。

串口通信协议我定义得很简单:每帧数据以帧头0xAA 0x55开头,后面跟X坐标高字节、X坐标低字节、Y坐标高字节、Y坐标低字节、校验和,一共7个字节。STM32端用串口中断发送,Python端用pyserial库接收,解析出坐标后通过matplotlib动态更新散点图。

这里有一个小经验:如果直接用matplotlib在每次数据到达时刷新整个图,会非常卡。我的做法是用“blit”模式,只更新散点对象的数据,不刷新整个画布,实测下来帧率能到30fps以上,完全够用。如果你不熟悉Python上位机,用Qt加QPainter也行,或者用Processing、LabVIEW都可以,工具不是关键,关键是通信协议要定义清楚。

5. 系统调试、误差分析及工程经验总结

5.1 调试过程中遇到的典型问题与排查思路

整个调试过程中我遇到了四五个比较棘手的问题,每一个都是硬骨头,捡几个有代表性的说说。

第一个问题是输出信号饱和。第一次上电时,我拿激光笔直接照射PSD,结果运放输出直接顶到电源轨。原因很简单,激光功率太强了,PSD输出的电流超出了跨阻放大器设计量程。解决方法是加衰减片,或者在PSD前面加一片红外滤光片,把环境光滤除的同时降低入射光功率。后来我干脆在激光器前面加了一个可调衰减器,用的时候根据输出幅度调整,方便多了。

第二个问题就是前面提到的运放自激振荡。现象是运放输出端有无缘无故的高频振荡,示波器一测,几十兆赫兹的正弦波,把低频信号完全掩盖了。排查思路是这样的:先怀疑是电源问题,换电池供电,依旧振荡;再怀疑是面包板寄生参数,改成PCB焊接,问题有所缓解但没有根治;最后在反馈电阻上并联了一个4.7pF的电容,振荡消失。根本原因是反馈电阻2MΩ太大,和运放输入电容以及PCB走线寄生电容共同形成了一个不稳定的极点。这个案例给我的教训是:高阻反馈的跨阻放大电路,相位补偿电容不是可选件,而是必选件。

第三个问题是位置输出有缓慢漂移。刚开机时坐标值还好,过几分钟之后,零点位置慢慢偏移。排查了很久,最后发现是激光器的热漂移。半导体激光器在工作时管芯温度会上升,发射角度和功率都会发生缓慢变化,光斑在PSD上的位置也跟着漂。这个问题用软件很难完全消除,只能通过给激光器加散热片来缓解,或者在算法里做动态零点校准。毕设答辩的时候我把这个问题写进了误差分析,反而成了加分项——因为说明你真的做过实验,不是纸上谈兵。

5.2 精度测试方法与误差来源分析

为了严谨地评估系统性能,我做了一组精度测试。测试方法是用平移台让PSD在X方向从-5mm移动到+5mm,步进1mm,每个位置记录20次测量值的平均值和标准差。测试结果显示:X方向的线性拟合残差小于0.3mm,重复性误差小于0.05mm,系统的静态定位精度大约在0.2mm到0.3mm的量级。

误差来源可以分为三类。第一类是PSD器件本身的固有误差,包括暗电流、结电容、位置检测非线性等。第二类是电路引入的误差,包括运放失调电压、电阻精度偏差、ADC量化误差和参考电压波动。第三类是光学和机械误差,包括光斑尺寸过大导致的位置模糊、PSD安装倾斜、机械平移台的定位精度限制等。做误差分析的时候,把这些因素逐项拆解,每一项给出估算量级,论文的深度立刻就不一样了。

5.3 从毕设到实际应用的扩展方向与经验沉淀

最后聊聊这个系统如果继续往下做,可以往哪些方向扩展。第一,把PSD换成面阵图像传感器,配合机器视觉算法,就能从“单点定位”升级为“多点定位”和“目标识别”,测量维度大大增加。第二,增加闭环控制功能,通过定位结果实时驱动二维转台或者压电陶瓷平台,组成一个光斑跟踪系统,这在激光通信、光学追踪领域有实际应用价值。第三,缩小体积和降低功耗,用低功耗单片机加小型化PCB设计,做成便携式定位模块,用于无人机自动降落引导或者机器人对接定位。

我相信这篇毕业设计的经历,价值最大的是让我完整地走通了一个工程项目的所有环节:从需求分析、方案论证、器件选型、电路设计、软件开发到最终的实验验证。这种全流程的项目经验,不是在课堂上听几节课就能获得的。如果你也正在做类似的课题,我的建议是——一开始没必要追求把所有部分都做到完美,先把信号链路打通,让系统“动起来”,再逐步优化每一级的精度。工程实践有一个基本规律:先实现,再优化。不要一上来就埋头调电路,最后连系统都没跑通,那才是最亏的。

本文还有配套的精品资源,点击获取

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

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

立即咨询