简介:面向光电检测与数据采集方向的工程技术文档,系统阐述基于单片机的PSD位置敏感器件数据采集电路完整设计方案。资源为一份docx格式的设计方案文档,共1个文件,压缩包大小约22KB,内容涵盖PSD横向光电效应工作原理、SPC01传感器信号特点,以及Atmega16单片机与AD1674模数转换芯片、AD7501多路开关组成的核心采集电路,并给出引脚控制、数据编码和串行传输等关键实现细节。适合电子、自动化及测控类专业学生或相关研发人员参考学习。已有162人浏览学习,文档结构清晰,从原理分析到电路设计再到软件控制层层递进,可直接作为课程设计、毕业设计或项目预研的方案蓝本。
1. PSD 数据采集电路在设计什么?
光斑落在 PSD 感光面上时,从两个电极读出来的不是电压,而是两路微安级电流。位置信息藏在这两路电流的比例里,要让单片机把这个比例还原成毫米或微米坐标,得先把电流变成稳定的电压,再变成同步的数字量。很多第一次做 PSD 采集的人把注意力放在后面的算法上,真正决定分辨率的是跨阻放大器的偏置电流、反馈电容大小,以及 PCB 上一条能漏走 1nA 的走线。这套方案基于通用单片机(以 STM32 为例),把 PSD 从信号特征、前级模拟电路、数据采集一直拆到布板和恒流源验证,适合做激光位移、准直测量、角度检测或相关课程设计时参考。
2. PSD 信号特征与位置解算公式
2.1 横向光电效应与等效电路
PSD(Position Sensitive Detector,位置敏感探测器)利用横向光电效应工作。光子入射到耗尽层附近产生电子-空穴对后,载流子被电场分离,沿电阻层向两侧电极流动。光斑距离哪一侧更近,那一侧收集的电流就更大。与 CCD 或光电二极管阵列相比,它的位置输出是连续的,不做像素分割,因此位置分辨力可以做得很高。
在电路分析中,PSD 通常被等效为受光功率控制的电流源 Ip,并联结电容 Cj 与结电阻 Rsh,电极之间还存在分布电阻。这个模型的现实意义在于:TIA 的输入电容要把 PSD 的结电容算进去;结电容和分布电阻会影响高频响应;暗电流则表现为输出端的零点偏置。设计前先查数据手册,把 Cj、暗电流、上升时间和光敏面尺寸这几项记下来,后面所有参数都从它们推导。
2.2 一维与二维 PSD 的电极电流编码
一维 PSD 有两个电极,光斑位置 P 与两电极电流 I1、I2 满足线性关系:
P = (I2 - I1) / (I1 + I2) × L / 2
其中 L 是有效光敏面长度。分母用 I1+I2 做归一化,好处是光强变化、光源抖动都不会影响位置读数,这是 PSD 方案相对普通光电池的重要优势。
二维 PSD 常见的是四电极结构,四个电极电流 Ix1、Ix2、Iy1、Iy2,按数据手册给出组合:
X = ((Ix2 + Iy1) - (Ix1 + Iy2)) / Itot × Lx / 2
Y = ((Ix2 + Iy2) - (Ix1 + Iy1)) / Itot × Ly / 2
Itot = Ix1 + Ix2 + Iy1 + Iy2
不同型号的电极命名和公式略有差异,以具体数据手册为准。这段计算在调试时每天都在用,我一般会先用一小段 Python 验算:
def pos_1d(i1, i2, length=10.0): total = i1 + i2 if abs(total) < 1e-12: return 0.0 return (i2 - i1) / total * length / 2.0 def pos_2d(i_x1, i_x2, i_y1, i_y2, lx=10.0, ly=10.0): total = i_x1 + i_x2 + i_y1 + i_y2 if abs(total) < 1e-12: return 0.0, 0.0 x = ((i_x2 + i_y1) - (i_x1 + i_y2)) / total * lx / 2.0 y = ((i_x2 + i_y2) - (i_x1 + i_y1)) / total * ly / 2.0 return x, y逻辑说明:先把分母置零的情况拦掉,避免除零;再按公式归一化。这样在调模拟电路时,可以用已知电流值反推位置,验证链路是否正常。
2.3 PSD 数据采集的关键参数与动态范围
典型参数区间见下表,具体数值以型号为准:
| 参数 | 典型范围 | 对电路的影响 |
|---|---|---|
| 光敏面尺寸 | 1×1 mm 到 10×10 mm | 决定电极间分布电阻和光斑大小,影响信号量级 |
| 暗电流 | 0.1 nA 到 10 nA | 直接叠加到两路光电流上,造成位置零漂,需要校准 |
| 结电容 | 10 pF 到 100 pF | 进入 TIA 输入电容,是稳定性计算的主要成分 |
| 上升时间 | 0.3 us 到 5 us | 决定前级带宽,带宽太高会引入更多噪声 |
| 位置分辨率 | 0.1 um 到 1 um | 最终系统指标,受噪声和 ADC 分辨率双重限制 |
从动态范围看,位置公式只关心比例,两个电极的电流不要超过 TIA 的输出饱和范围。如果最大光电流 10 uA、Rf 取 500 kΩ,输出就是 5V,已到满量程;若还要预留暗电流和背景光的余地,增益应往下调,然后靠 ADC 位数和均值滤波补回来。
3. PSD 前级模拟电路:偏置、跨阻与滤波设计
3.1 偏置方式:光导模式与光伏模式选型
PSD 数据采集电路的第一步不是选运放,而是确定偏置方式。光导模式下,给 PSD 加 2V 到 10V 的反向偏压,结电容变小,响应速度变快,但暗电流随之变大,位置零点会随温度漂移;光伏模式零偏置,暗电流最小、噪声最低,但结电容大、响应慢,适合低照度、慢变化场景。工程上做激光位移和准直检测时,一般选光导模式,按数据手册推荐的典型偏压取值。
偏置电压的稳定性需要单独考虑。PSD 的暗电流和结电容都与偏压相关,如果直接用 DCDC 输出供电,开关纹波会通过结电容耦合进信号;常见做法是用一个低噪声 LDO 生成模拟电源,再用电阻分压加缓冲器产生偏置,偏置源上加 0.1uF 和 10uF 两级电容去耦。注意模拟电源不要和单片机数字电源共享同一路输出,否则 ADC 采样瞬间的电流跳变会出现在位置信号里。
3.2 跨阻放大电路设计与运放选型
PSD 输出是电流,第一级必须用跨阻放大器(TIA)完成 I-V 转换。跨阻增益 Rf 由最大光电流和 ADC 满量程决定:若最大光电流 10 uA、ADC 满量程 5V,Rf = 5V / 10uA = 500 kΩ。Rf 选得大,小信号分辨率高,但输出饱和得快,噪声增益也高;Rf 选得小,动态范围变宽,但需要 ADC 分辨率来弥补。
运放选型重点看五个指标:输入偏置电流、输入失调电压、增益带宽积、输入电容和输入电压噪声密度。下面按优先级排序:
| 指标 | 推荐要求 | 说明 |
|---|---|---|
| 输入偏置电流 Ib | 小于最小光电流的 1% | Ib 会流入反馈电阻,直接表现为位置误差 |
| 输入失调电压 Vos | 尽量低于 1mV,温漂系数低 | 造成输出零点偏移,校准可部分扣除 |
| 增益带宽积 GBW | 由所需带宽和 Rf、Cf 决定 | GBW 不够会导致 -3dB 带宽变窄 |
| 输入电容 Cin | 越小越好 | 与 Rf 形成极点,决定稳定性补偿量 |
| 输入电压噪声密度 | 越低越好 | 决定位置分辨力的噪声下限 |
对微安级光电流,JFET 输入运放是常见选型。例如 OPA657、OPA656 适合中速高增益场景;低速高精度场合可以选偏置电流更低的静电计级运放。若使用 51 单片机或 STC 单片机做低速测量,也可以用 TL081、LF356 这类低成本运放,前提是最小光电流在微安以上,否则偏置电流造成的误差占比会很大。这里不具体绑定某一颗芯片,用哪种取决于光电流量级和所需带宽。
TIA 的反馈电容 Cf 决定闭环带宽和稳定性,初始值用下面的经验公式:
Cf = sqrt(Cin / (π × Rf × GBW))
其中 Cin 是 PSD 结电容、运放输入电容和布线电容之和。用 30 pF 输入电容、100 kΩ 反馈电阻、10 MHz 增益带宽积估算,结果是约 3 pF。实际值在原型板上微调,用方波激励看有没有振铃。
import math cin = 30e-12 # 30 pF:PSD 结电容 + 运放输入电容 + 布线杂散 rf = 100e3 # 100 kΩ 跨阻增益 gbw = 10e6 # 运放增益带宽积 10 MHz cf = math.sqrt(cin / (math.pi * rf * gbw)) print(f"{cf * 1e12:.1f} pF")这段脚本只是确定起点。实际调试时,我会在 Rf 两端并一颗可调电容,用信号源加方波,观察输出过冲:过冲大说明相位裕度不足,加大 Cf;上升沿变缓且噪声变大,说明 Cf 偏大。注意 Cf 要选 C0G 或 NPO 材质,容量小、温漂低。
提示:反馈电容的取值不要只靠公式,原型板上必须用方波看振铃。跨阻增益和带宽的取舍,最终以实际光电流动态范围为准。
3.3 差分放大与加法电路合成位置信号
一维 PSD 解算需要 Vdiff = V2 - V1 和 Vsum = V1 + V2。常见做法是两路 TIA 后各接一级放大:减法用差动放大电路实现,加法用反相加法器或同相加法器。差分放大电路的输出:
Vdiff = R2 / R1 × (V2 - V1)
取 R1 = R2 时就是 1 倍差动增益,也可以按需要放大。这里我用一个双运放就能同时实现减法器和加法器,不少现成的 PSD 信号调理板也是这样布线的。
在模拟端做加减的好处是,可以直接用模拟除法器或专用信号调理芯片得到位置电压,方便示波器监测;缺点是多一级运放就多一份失调电压和噪声。如果单片机 ADC 足够快且采样同步性可以保证,我一般会跳过模拟加减法,把四路 TIA 输出直接送 ADC,在数字域做求和与求差。这样失调误差更容易校准,也方便换算法。具体取舍看板子空间和对实时性的要求。
3.4 滤波与电平搬移:送到 ADC 之前
TIA 输出噪声带宽很高,ADC 前必须加低通滤波。最简单的 RC 低通截止频率 fc = 1 / (2πRC)。做位移检测时,光斑位置变化通常不超过几百赫兹,取 fc = 1 kHz,R = 10 kΩ,C = 15 nF 即可。RC 后面接上一级电压跟随器,避免 ADC 输入电容直接改变滤波特性。如果工作现场有 50Hz 工频干扰,RC 低通不足以完全压住,可以在数字端再做一次滑动平均,或者在光源侧做调制、在接收端做同步解调。
单电源系统要注意电平搬移:光斑居中时 Vdiff 接近 0,ADC 无法采样负电压,需要在第二级运放的同相端加一个 Vref/2 偏置,把零点搬到 ADC 参考电压中点。偏置源用精密基准分压得到,不要直接从电源分压,否则电源纹波会叠加到位置信号上。滤波和偏置这两步做完,模拟前端才算闭合。
4. 单片机端 PSD 数据采集与坐标计算
4.1 ADC 通道路数与采样策略
一维 PSD 需要两路 TIA 输出,二维需要四路。单片机 ADC 逐通道扫描采样时,通道之间存在时间差,对静止光斑没有影响;如果光斑在快速移动,这个时间差会导致位置计算引入动态误差。常规做法是用 ADC 的 DMA 循环采样,把四路数据连续读进来,再做均值或滑动滤波,等效于把采样时间差摊平。
ADC 的分辨率按位置分辨率反推:若 PSD 有效长度 10 mm、期望分辨 1 um,相对位置分辨是 1e-4。12 位 ADC 满量程的 1 LSB 约 2.4e-4,配合硬件增益和均值滤波可以接近目标;若追求更高精度,可外接 ADS1115(16 位、I2C)或 ADS1256(24 位、SPI)。用 51 单片机做系统时,内置 ADC 往往不够用,外接串行 ADC 是更常见路径;用 STM32 内置 12 位 ADC 则可以省掉一颗芯片。
| 通道 | 信号 | 计算用途 |
|---|---|---|
| ADC_IN0 | V1(TIA1 输出) | 位置公式 I1 |
| ADC_IN1 | V2(TIA2 输出) | 位置公式 I2 |
| ADC_IN2 | V3(TIA3 输出,二维) | 二维解码 |
| ADC_IN3 | V4(TIA4 输出,二维) | 二维解码 |
4.2 STM32 内置 ADC 的 DMA 采集示例
下面是基于 STM32 的 ADC DMA 采集片段,采用多通道循环采样:
#define PSD_CH_NUM 4U #define SAMPLE_CNT 32U uint32_t adc_buf[PSD_CH_NUM * SAMPLE_CNT]; void adc_dma_init(void) { // 配置 ADC1 四通道,采样时间尽量拉长,降低源阻抗影响 // 使能 DMA 循环模式,数据宽度 32 位 HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buf, PSD_CH_NUM * SAMPLE_CNT); } float read_psd_channel(uint8_t ch) { int64_t sum = 0; for (int i = ch; i < PSD_CH_NUM * SAMPLE_CNT; i += PSD_CH_NUM) { sum += adc_buf[i]; // 按通道号跳步累加 } return sum / (float)SAMPLE_CNT; // 返回均值 }代码说明:HAL_ADC_Start_DMA 启动后,DMA 把四通道采样结果循环写入 adc_buf。read_psd_channel 按通道号跳步累加,SAMPLE_CNT 是平均样本数,增大它可以压制随机噪声,但会降低更新率。源阻抗较高时,ADC 采样时间应配置为最大档,否则采样电容来不及充满。二维 PSD 在循环缓冲区里依次是四通道数据,所以二维计算时分别取 ch 0 到 3。
4.3 数字端位置解算与零漂校正
如果前面做了模拟加减法,单片机只需要采 Vdiff 和 Vsum;如果模拟端没有做减法,就按公式在数字端求和差。数字端解算的额外好处是可以做零漂校正:给 PSD 遮光后采样,把此时的两路 ADC 读数存为 offset,之后每次计算前先减 offset。暗电流和运放失调电压引起的零漂,在硬件上很难彻底消除,在数字端扣除是最经济的办法。
float psd_offset[PSD_CH_NUM]; void psd_calibrate_dark(void) { // 遮住 PSD 感光面后调用,记录暗电流 + 运放失调电压 for (uint8_t ch = 0; ch < PSD_CH_NUM; ch++) { psd_offset[ch] = read_psd_channel(ch); } } float psd_position_x(void) { float v1 = read_psd_channel(0) - psd_offset[0]; float v2 = read_psd_channel(1) - psd_offset[1]; if (fabsf(v1 + v2) < 1e-3f) return 0.0f; // 无光保护 return (v2 - v1) / (v1 + v2) * PSD_LENGTH / 2.0f; }代码说明:遮光校准要在系统上电达到热平衡后执行,否则温漂还会缓慢改变零点。无光保护用 v1+v2 判断,避免除零和噪声引起的跳变。偏移量随温度变化,精度要求高时可以在结构和算法上周期性遮断光源重新校准。
4.4 位置-电压非线性校准
PSD 的理论公式是线性的,实际器件在边缘区域有非线性,尤其光斑靠近电极时误差变大。常见做法是分段线性校准:把 PSD 装在位移台上,从一端到另一端按固定间距记录位置基准和 ADC 输出,生成校准表;运行时查表并线性插值。
typedef struct { float raw; float pos; } cal_pt_t; float cal_interpolate(const cal_pt_t *table, int n, float raw) { if (raw <= table[0].raw) return table[0].pos; for (int i = 1; i < n; i++) { if (raw <= table[i].raw) { float t = (raw - table[i-1].raw) / (table[i].raw - table[i-1].raw); return table[i-1].pos + t * (table[i].pos - table[i-1].pos); } } return table[n-1].pos; }代码说明:table 按 raw 升序排列;查找采用线性扫描,表项几十个时速度足够。若表项多且运行频率高,可改成二分查找。注意校准表和硬件增益绑定,改过 Rf 或偏置后要重新校准。
5. PSD 采集板的 PCB 布局与整机验证
5.1 跨阻输入端的保护环和屏蔽
PSD 数据采集电路最怕的不是噪声,而是漏电流。TIA 输入端是高阻节点,PCB 上一丁点污染或潮湿造成的表面漏电,都比 PSD 暗电流还大。常见做法是在运放输入引脚周围画一圈保护环,环走线接到与输入等电位的低阻抗点,让漏电流被保护环吸收而不是进入输入节点。PSD 的两个电极走线尽量短,并用地线夹住;如果信号要引出板子,用屏蔽线并让屏蔽层接模拟地。
布局顺序上,TIA 反馈电阻和反馈电容要紧贴运放输入引脚和输出引脚,反馈回路覆盖面积越小,受到的干扰越少。模拟地与数字地分成两个区域,只在 ADC 或电源入口处单点连接;ADC 的数字接口线不要跨越模拟区域,避免数字开关电流耦合进模拟输入。
5.2 不用光学平台也能做的恒流源验证
整机联调前,先用恒流源验证模拟链路,省去光学平台的麻烦。把 PSD 拆下,在 TIA 输入端用两个精密恒流源分别注入 I1、I2,电流大小按光电流典型值取,比如 5 uA 和 5 uA,对应光斑应处于中心位置。然后改变一组电流为 6 uA 和 4 uA,对应位置向一侧偏移。记录单片机的输出:
| I1 (uA) | I2 (uA) | 理论位置 (mm) | 实测位置 (mm) | 偏差 (mm) |
|---|---|---|---|---|
| 5.000 | 5.000 | 0.000 | 0.002 | 0.002 |
| 6.000 | 4.000 | 2.000 | 1.997 | -0.003 |
| 4.000 | 6.000 | -2.000 | -2.001 | -0.001 |
这个验证能一次性检查 TIA 增益、ADC 线性度、除法算法和零漂校正是否正常。如果恒流源注入时偏差已经大于预期,后面上光学平台很难分清是电路问题还是光路问题。恒流源要用低噪声的,普通万用表电流档端子接触电阻变化也会造成读数漂移。
5.3 零漂和噪声的现场检查技巧
装上 PSD 后,把感光面遮住,用示波器看 TIA 输出,观察 30 分钟,记录最大漂移。用手靠近输入端,屏幕数值跳变说明防护环或屏蔽失效;把电极线对绞合、远离电源走线并缩短长度,零漂通常会显著下降。判断位置噪声用后级采样数据,连续采 1000 个点,标准差除以满量程应远小于一条分辨率的目标值。如果标准差偏大,优先查供电去耦和运放选型,再查 ADC 参考电压的稳定性。最后做温度边界验证:把整机放在接近工作极限的温度下,记录位置输出随温度的变化。PSD 暗电流、运放失调电压和偏置源都会产生温漂,数字端的零漂校正只能扣除一部分,剩余部分要靠偏置电压基准的温漂指标来约束。
本文还有配套的精品资源,点击获取