ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PSD位置敏感探测器数据采集电路设计(Atmega16+AD7501+AD1674方案)

PSD位置敏感探测器数据采集电路设计(Atmega16+AD7501+AD1674方案) 简介基于单片机的PSD数据采集电路设计方案文档面向光电检测、嵌入式系统领域的工程师与高年级学生系统阐述PSD位置敏感器件的数据采集电路设计思路。方案选用SiTek公司的SPC01传感器结合Atmega16单片机、AD1674模数转换器与AD7501多路开关实现了对Diff X、Diff Y、Sum X、Sum Y四路信号的高精度采集与处理并给出了电路连接、控制时序及串行传输编码规则。资源包内仅含1个docx文档约22KB篇幅精简但内容完整属于方案说明类资料。目前已有162人学习浏览适合作为PSD应用、数据采集电路课程设计或科研预研的参考。通过该文档可快速理解从传感器选型到单片机控制的完整链路并借鉴其中的软硬件协同设计方法。1. 为什么PSD数据采集要单独设计电路PSD位置敏感探测器的原始输出不是干净的电压而是两路电流差分信号直接接ADC会出现共模干扰、负载不稳、采样率不足等问题。实验室里常见的情况是PSD响应很快但单片机轮询读一遍四路信号需要几十微秒而光点位置变化可能更快于是测出来的坐标曲线毛刺多、线性区偏移。本文这套以Atmega16为核心配合AD7501多路开关和AD1674模数转换器的方案核心思路是把“选路—采样—转换—传输”拆成独立时序由单片机精确控制避免软件轮询带来的不确定性。方案更适合需要在实验室条件下快速验证定位精度、抗干扰特性的场景比如激光光斑跟踪、振镜偏转测量。对于想把PSD输出直接接到普通MCU内置ADC上的做法这篇文章也能解释清楚为什么那样做会吃亏。2. PSD横向光电效应与SPC01输出信号的关系2.1 一维定位公式怎么推导到二维PSD是基于横向光电效应的连续分布型探测器。光入射到P感光面时光生载流子向两端电极流动形成X1和X2两路电流总和X0X1X2。当光斑位置偏移中心时两电极电流差值变化阻值R1、R2仅取决于光点位置。一维坐标计算公式为x L * (X2 - X1) / (X1 X2)其中L是PSD中点到信号电极的距离x是入射光点到中点的距离。这个式子的优势在于消去了入射光强X0因此光源波动不会直接影响位置输出。二维PSD只是多一组Y方向的电极对位置计算公式变成x Lx * (DiffX / SumX) y Ly * (DiffY / SumY)DiffX、DiffY是两个差分输出SumX、SumY是总和输出。这里的除法在实际电路中由上位机完成所以单片机只负责采集四个模拟量再通过串口送给PC运算。2.2 SPC01集成式PSD的输出特点瑞典SiTek的SPC01采用厚膜工艺把PSD传感器和前置处理电路集成在一起内部已经有前置放大、加法器和减法器所以对外直接输出的是差分和总和电压信号而不是微弱电流。这个设计对后级电路非常友好因为不需要自己搭I-V转换和高阻抗缓冲只需要考虑信号范围、带宽和噪声。SPC01输出四个量Diff X、Diff Y、Sum X、Sum Y。其中Diff量可能是正负电压Sum量始终为正电压。采集电路需要支持双极性信号输入因此AD1674的前级要配电压跟随器做阻抗匹配并且AD1674的模拟输入范围要能覆盖负电压。2.2.1 为什么不用单片机内置ADCAtmega16内部有8路10位ADC理论上也能采集四路信号。但内置ADC的采样保持电路和参考电压稳定性在高速场景下并不理想逐次逼近型的转换时间加上通道切换时间四路轮流采集会造成明显的相位差。当PSD光点在连续运动时四路信号并非同一时刻的样本后续算出坐标会存在动态误差。AD1674内部自带采样保持能锁存某一时刻的模拟值配合AD7501多路开关实现“同一时刻只采一路但在极短时间内完成四路轮换”这样每个通道的采集时间差可控到10微秒量级。3. 数据采集链路设计从SPC01到AD7501再到AD16743.1 AD7501多路开关的选通逻辑AD7501是8通道模拟多路开关这里只用前四路。使能端EN接5V保持常开A0、A1由单片机PC3、PC4控制A2接地固定为0。四路输入与PSD输出的对应关系如下输入通道地址A1 A0接入信号S10 0Diff XS20 1Diff YS31 0Sum XS41 1Sum Y单片机写PC3、PC4即可切换当前送入ADC的模拟信号。注意切换后需要等待开关的导通建立时间。AD7501的导通时间典型值在0.8微秒左右延迟约0.2微秒而AD1674转换前有采样保持所以实际程序里在切换通道后加一个短延时让信号稳定后再启动转换会更稳妥。3.1.1 电压跟随器的作用AD7501输出端接了电压跟随器这步不能省。多路开关的导通电阻会随输入信号电压和温度变化如果直接驱动AD1674的输入端采样保持电容充电时间常数会变化导致转换结果误差。电压跟随器用运放构成提供高输入阻抗、低输出阻抗保证AD1674的输入源是低阻电压源。常见做法是选用FET输入运放比如TL082或OP07电源范围覆盖±12V即可。3.2 AD1674控制时序与12位数据读取AD1674是12位逐次逼近型ADC采样频率100kHz转换时间10微秒带内部采样保持。它的控制端有CE、CS、R/C、A0外加状态输出STS。控制真值关系如下CECSR/CA0操作1000启动12位转换1001启动8位转换本设计不用1010读高8位数据1011读低4位数据启动转换时单片机设置CE1CS0R/C0A00。转换期间STS输出高电平转换完成后STS拉低。读取数据时因为只接了PB口8根线12位数据需要分两次先将R/C和A0都置1读低4位到数据线低四位再置R/C1、A00读高8位。3.2.1 硬件引脚分配与连接AD1674的DB4~DB11接单片机PB0~PB7转换状态STS接PD2INT0可以用查询方式也可以用外部中断控制引脚CE、CS、R/C、A0分别接普通IO口具体引脚号根据电路板设计决定建议避开PC3、PC4的复用冲突这里有坑PB口同时作为数据输入口读数据前要把DDRB配置为输入并且最好加上拉电阻。AD1674的数据输出是三态不读时不影响其他设备但初始化时要确保CE或CS处于无效状态防止总线冲突。4. 单片机控制程序设计与时序优化4.1 AD7501选通与AD1674启动代码用Atmega16的PC3、PC4控制通道选择PD2查询STS状态。先写一个通道切换函数// 切换AD7501通道ch 0~3 void mux_select(uint8_t ch) { PORTC ~0x18; // PC3、PC4清零 PORTC | ((ch 0x01) 4); // A0接PC4 PORTC | ((ch 0x02) 3); // A1接PC3 delay_us(2); // 等待开关导通 }逻辑说明AD7501的A0对应PC4A1对应PC3所以ch的bit0送到PC4bit1送到PC3。清零操作只影响PC3和PC4不影响其他IO。延时2微秒相比导通时间留了余量确保模拟信号稳定。启动AD1674转换并读取12位数据的函数uint16_t read_ad1674(void) { // 启动12位转换 AD_CE 1; AD_CS 0; AD_RC 0; AD_A0 0; AD_CE 0; // 产生CE下降沿锁存启动命令 // 等待转换结束 while(AD_STS 1); // STS变低表示转换完成 // 读低4位 AD_RC 1; AD_A0 1; AD_CE 1; uint8_t lo PINB 0x0F; // 读高8位 AD_A0 0; uint8_t hi PINB; // 恢复CE结束本次操作 AD_CE 0; return (hi 8) | lo; }参数说明读取低4位时只取PINB的低4位因为AD1674的DB4~DB7接的是PB0~PB3DB8~DB11接的是PB4~PB7但读取低4位时实际数据出现在DB4~DB7也就是低4位。高8位读取时PINB全取。这段代码里用了宏定义AD_CE、AD_CS等实际项目中按连接的引脚替换。4.2 四通道循环采集与时间戳对齐每路信号都对应一个位置参数采集时需要在同一运动状态下完成四路采样。常见做法是启动一次转换后就立即切到下一通道让ADC转换和开关切换并行。时间线如下t0: 选通S1(Diff X) - 启动AD1674 - 等待10us转换 - 读取结果1 t1: 选通S2(Diff Y) - 启动 - 等待 - 读取结果2 t2: 选通S3(Sum X) - 读取结果3 t3: 选通S4(Sum Y) - 读取结果4总耗时约4×(2us10us读指令时间)可以控制在50微秒内。如果PSD光点移动速度不高这样足够。但要注意四路信号本质上不是同一时刻采的存在时间偏移后续计算坐标时需要做线性插值或降低扫描速度。更严格的做法是外接采样保持器同时锁存四路但成本高本设计在实验室条件下可不做。4.2.1 数据存储与串口发送缓冲采集到四个12位数据后每个数据占用2字节总共8字节。单片机连续存储时需要给数据分组加标识否则上位机无法区分哪两个字节属于DiffX哪个属于SumY。这里采用三字节一组的编码方式每个数据拆成高6位和低6位前两个字节存放数据位第三个字节存放通道标识和校验信息。表串口编码规则示例字节序号bit7~bit6bit5~bit0第1字节00DiffX高6位第2字节00DiffX低6位第3字节01通道号与校验.........上位机根据第3字节的通道号拼接出原数据。这样牺牲了少量带宽换取传输可靠性。发送使用MAX232转RS232波特率建议9600或19200中断方式发送避免主循环阻塞。5. 串口数据校验与上位机坐标换算验证5.1 用一组固定参数验证硬件链路焊好电路后不要急着接PSD先给AD7501的输入加已知电压。比如用精密可调电源分别给S1~S4输入2.5V、-2.5V、5V、5V然后单片机循环采集通过串口发到PC。在PC上用串口助手接收解析后检查数值是否对应12位ADC在±10V量程下LSB约为4.88mV2.5V对应约512-2.5V对应约-512但AD1674以二进制补码或偏移二进制输出取决于接线和配置如果读到的值偏差太大先用万用表测跟随器输出确认电压是否正确。再检查AD1674的参考电压引脚一般是10V参考若参考源噪声大转换结果最后两位会跳动。5.2 坐标计算脚本的调试顺序原始数据传到PC后需要把Diff和Sum相除。Python验证脚本可以这样写import serial ser serial.Serial(COM3, 19200, timeout1) def parse_frame(buf): # buf是12字节对应四组三字节编码 out {} for i in range(4): hi buf[i*3] lo buf[i*31] ch (buf[i*32] 4) 0x03 val (hi 6) | lo out[ch] val return out while True: data ser.read(12) if len(data) 12: v parse_frame(data) x (v[0] / v[2]) * 5 # DiffX/SumX5为量程系数 y (v[1] / v[3]) * 5 print(fx{x:.3f} y{y:.3f})逻辑说明该脚本从串口读取固定长度的帧按三字节一组解码出0~3号通道数据再计算归一化坐标。这里的量程系数需要根据实际PSD的L参数调整SPC01的敏感面尺寸对应具体系数不能照搬5。5.3 常见坑Sum信号漂移与差分信号负压调试中最多的问题是Sum量随环境光缓慢变化导致除出来的坐标漂移。可以在PSD感光面前加窄带滤光片或直接用激光器调制频率再用锁相放大思路处理。本方案没加调制电路所以实验时要关闭日光灯、拉上窗帘。另一个坑是Diff信号可能为负AD1674的模拟输入范围需要设置为双极性模式。查AD1674数据手册它的模拟输入可以接成0~10V或-5~5V如果需要负压测量要把BIP OFF引脚处理得当。如果发现负向信号被截断成0检查该引脚是否悬空或接地错误。验证通过后再接入真实的PSD输出微调MCU程序的延时和滤波系数。整个系统从裸板到能出坐标数据一般是先电源、再数字逻辑、模拟链路、最后联调别跳过固定电压测试这一步。本文还有配套的精品资源点击获取
返回列表