资讯详情

资讯详情

基于单片机的红外测距仪:从光电转换到查表标定全解析

红外测距仪这名字听着唬人其实拆开看就是两件事用红外光“摸”一下目标有多远再把距离显示出来。最近帮A同学捋一套基于单片机的红外测距仪设计从原理图到代码再到标定整体过了一遍发现这东西对入门的价值被严重低估了——贵不贵、难不难先放一边它能同时把光电转换、模拟信号调理、AD采样、标定、显示驱动这些知识点串成一条线做完一次嵌入式基本功基本能过一遍。这篇文章就把我这次的设计思路、电路细节、软件逻辑和踩坑记录完整写出来内容偏实践适合正在做课程设计、电子竞赛入门或者想自己攒一个小测距装置的朋友参考。1. 先想明白红外测距到底在测什么很多人一上来就翻芯片手册、找代码这是顺序反了。不管是做红外测距还是做别的项目第一步永远是搞清楚物理过程否则后面电路和代码全是瞎调。1.1 三种测距原理为什么反射强度法最合适测距这件事本质上是把“距离”这个物理量转换成电信号。常见的非接触测距有三角测量、飞行时间、反射强度检测三种。飞行时间法是用激光或超声波测量信号发射到返回的时间差精度很高但电路复杂、成本高不太适合课设级别的红外方案。三角测量法是红外发射管和接收管分开一段距离目标反射回来的光斑落在接收面上的位置会随距离变化通过光斑偏移量算距离这个方案线性度好、抗干扰强但机械结构要求高。剩下最方便的就是反射强度法发射管一直发光接收管收到目标反射回来的红外光距离越近反射光越强接收管输出电压越高。这个方案结构简单几根线和运放就能做出来代价是输出曲线是非线性的而且特别吃被测物体的颜色和材质。不过对入门设计来说这个“非线性”不是缺陷反而能逼你学会标定和查表这些是以后做传感器项目躲不开的功课。1.2 技术指标怎么定范围、精度、响应时间我建议在做电路之前先用一句话把这个项目定位写清楚。比如“做一个测量范围5到30厘米、分辨率1厘米、刷新率10赫兹的近距离红外测距仪”这句话定下来后面所有选择就有了依据。5到30厘米是反射强度法比较甜区间的范围太近了接收管容易饱和太远了反射信号弱到噪声底下。分辨率1厘米对显示型仪表完全够用毕竟红外反射法能做到厘米级就算不错想做到毫米级就要上三角测量模块。刷新率10赫兹意味着每100毫秒出一个新数据对应到主循环就是采样、滤波、显示一轮控制在100毫秒以内51内核单片机轻松能跑。指标不是越高越好是匹配需求就好你写的是“测距仪”不是“激光尺”别和自己较劲。1.3 方案选型自制收发对管还是直接用模块市面上有现成的红外测距模块内部已经做好了发射、接收和信号处理输出模拟电压随距离变化价格也不贵。直接用模块当然省事两行代码就能显示距离但从学习角度讲整个项目就变成了“读数据、显示数据”光电前端什么都没学到。我这次帮A同学做的时候选了自制方案红外发射管、红外接收二极管、一片双运放、一块带ADC的单片机、一块1602液晶。单片机选用经典的STC89C52这款带外设扩展的51内核芯片因为它内部没有ADC正好需要外接一片ADC0832这反而能把“模拟采样”这个概念练透。如果你手头有内部带ADC的51增强型单片机或者更大的芯片也可以省掉ADC0832直接读内部ADC其余逻辑完全一样。2. 硬件电路的核心设计细节硬件是这个项目的重头戏光电前端处理得好不好直接决定后面标定工作量大不大。我按信号流向逐个模块讲这样你照着搭也不会乱。2.1 红外发射电路限流电阻的计算不能凭感觉发射部分看起来最简单就一个红外发射管加一个限流电阻但参数算错就要返工。红外发射管的正向压降通常按1.2V到1.5V估算持续工作电流建议控制在20到30毫安别为了追求距离把电流拉到50毫安以上连续工作会很烫寿命也扛不住。假如用5V供电发射管压降取1.3V目标电流25毫安限流电阻就是(5 - 1.3) / 0.025 148欧实际取150欧或220欧都行。这里有个容易忽略的点单片机的IO口输出能力有限普通51单片机的IO灌电流能力通常只有十几个毫安所以最好用三极管扩流。用法是IO口串一个1K电阻接三极管基极发射管串联集电极电阻到正电源这样单片机只需要用很小的电流去控制三极管导通大电流从电源那边走IO口非常轻松。发射管可以用一体式红外发射二极管也可以用发射管和接收管分开的红外对管。如果为了抗环境光可以在发射管外面套一段黑色热缩管把光路收窄成一个锥形这样能有效减少侧向光和漫反射光的干扰。2.2 接收端前级处理从微弱光电流到可读电压接收部分是整个电路里最微妙的地方。红外接收二极管在光照下会产生很小的光电流几个微安到几十微安必须通过I-V转换变成电压信号。我常用光电二极管反向接入运放的反相输入端同相加一个2.5V左右的直流偏置反馈电阻从100K到1M之间选择要把信号放大到ADC的测量范围内。这一级的核心难点是偏置电压要准。很多新手直接把接收管串一个电阻接到ADC读出的电压不是饱和就是跳得像心电图原因就是没有运放信号阻抗太高ADC根本采不到稳定的值。运放的作用不只是放大更重要的是低输出阻抗能把信号“送”进ADC。以常用的LM358这款通用运放为例它单电源供电、价格便宜、功耗低缺点是带宽不高但处理几十赫兹的红外反射信号绰绰有余。如果手头有轨到轨运放会更好输出能更接近电源轨ADC量程利用得更充分。这级电路调通后用万用表量运放输出端应该能看到“目标靠近时电压上升、远离时电压下降”的规律。2.3 ADC采样部分参考电压才是噪声重灾区如果用STC89C52这类不带内部ADC的芯片外接ADC0832是标准做法。ADC0832是8位逐次逼近型ADC两路输入SPI兼容接口51单片机用软件模拟时序即可读取代码量不大。它有5V参考电压对应8位分辨率就是约20毫伏一个LSB对这个项目够用了。参考电压的稳定性是这次设计里最容易埋雷的地方。如果直接用电源5V做Vref而电源端又带着蜂鸣器、继电器这种脉冲负载采样值会跟着一起跳。解决的办法有三个层级先从源头稳压主控和传感器供电用独立线性稳压器别和功率器件共一个焊盘再做去耦Vref引脚和电源引脚就近放100nF陶瓷电容必要时候并一个10到47uF电解电容最后在软件上滤波。实测下来做好去耦后ADC跳动能从十几个LSB降到两三个LSB效果立竿见影。2.4 显示、按键与报警IO驱动能力要算清楚显示用1602字符液晶8位数据模式接起来直观但会占掉几乎一整组P0口建议用4位模式初学看着麻烦习惯后能省出一整排IO给其他用途。P0口是开漏输出必须外接上拉电阻才能稳定驱动这个细节在画板阶段就要预留排阻位置否则焊好了再补非常痛苦。蜂鸣器分有源和无源两种有源蜂鸣器内部自带振荡源通电就响单片机只需要控制IO高低电平适合做报警提示。别把蜂鸣器直接接在IO口上它的工作电流偏大长时间直接驱动会让IO口过热甚至损坏正确做法是IO经过一个1K电阻控制NPN三极管由三极管驱动蜂鸣器和发射管的扩流逻辑一样。按键可以做两个一个切换阈值设置模式一个调节阈值大小这样不用改程序就能在30厘米到5厘米之间任意设定报警距离。3. 软件逻辑与标定把电压变成厘米硬件是骨架软件就是灵魂。这部分我按模块来拆从主循环开始逐步把电压值变成一个看起来像“距离”的数字。3.1 主程序框架为什么用状态机而不是死等整个软件结构不复杂核心是一个循环ADC采集、滤波、查表、显示、阈值判断。代码写起来不难但建议用状态机的思路组织把不同工作模式拆成独立状态比如正常测量态、阈值设置态、报警态。好处是后续加功能时不用推翻重写只需要加状态和转移条件。主循环的节奏建议固定。把100毫秒理解为一个时间片每个时间片里完成一轮完整的采集和显示。用定时器中断做时间基准主循环只管查询标志位、执行数据流这样刷新率稳定不会因为液晶清的慢导致采样间隔忽长忽短。调过超声波或光敏传感器的人都知道数据刷新不稳定比数据不准更难受。3.2 采样与滤波中位值滤波为什么对红外特别管用红外反射信号的特点是主体信号平滑但时不时混入一个异常尖峰可能是目标抖动、环境光闪动或电源毛刺。对这种噪声形态中位值滤波比平均值滤波效果好得多因为它天然丢弃极端值。具体做法是连续采集N个数N取奇数我习惯取7到9然后将这些数从小到大排序取排在中间的那个作为本次有效值。为什么取奇数因为中位数的定义要求在有序数列里正中间只能有一个取偶数也能算程序麻烦且没意义。中位值滤波的代价是多了一点排序开销但对于5厘米到30厘米的低速测量这点开销可以忽略不计。如果你发现滤波后还是抖动可以再做一层滑动平均滤波别一层套一层上太多容易把真实变化也抹平。3.3 距离标定标尺法加插值比拟合公式更实用拿到稳定的ADC值后下一步就是建立ADC和距离的映射关系。红外反射光的强度近似与距离的平方成反比所以ADC值和距离不是直线关系用一个统一公式去拟合在10厘米内和20厘米外的误差会非常不均匀。课设和工程底座做法是用分段标定加插值也就是查表法。做法很简单把直尺固定好让被测物分别停在5、10、15、20、25、30厘米的位置每个位置读一个稳定ADC值记录下来形成一张表。运行时先判断当前ADC落在哪两个标定点之间再用线性插值算出对应距离。例如10厘米处ADC值是18015厘米处ADC值是120当前读到150按线性比例算出来就是10 (180 - 150) / (180 - 120) * 5 12.5厘米显示13厘米即可。这个法子代码量小、网上教程多而且完全绕开了拟合曲线精度不均匀的问题。注意一点标定时被测物要选一个日常最常用到的材质比如硬纸板或白色塑料片并在代码注释里写清楚这个表对应的材质否则过段时间再调试黑布测出来偏远、白墙偏近容易怀疑是硬件坏了。3.4 显示和报警阈值逻辑比你想的多一点细节1602显示部分不算难第一行显示“Dist: XX cm”第二行显示当前阈值状态。为了让显示稳定每次更新周期最好和测量周期一致别一边读数据一边显示容易看到数字最后一位不停乱闪。报警逻辑要注意一个特殊现象——近距离和远距离的ADC值方向正好相反。目标越近接收管收到的光越强ADC值越大反过来目标越远ADC值越小。判断逻辑就会变成ADC值大于阈值对应的ADC值时说明距离小于设定值触发报警。如果代码里直接比较“距离值”而不是“ADC值”就要先从查表拿到距离再比较逻辑上更直观代价是多做一次插值运算。我建议直接用距离值比较因为后期把阈值换成“大于20厘米报警”时改一个数字就可以不用回头翻标定表。4. 调试点位与常见问题实录这一段是我最想写的部分因为代码和电路图看着再完整真焊完板子上电几乎必然会碰到几个问题。下面几个坑都是这次实际调出来过的逐个说透。4.1 画板和焊接的三个易错点第一个易错点是红外对管的引脚定义。红外发射管和接收二极管在外观上几乎一模一样区分主要靠看侧面标记或者在万用表二极管挡位下的压降方向。焊接时一旦装反整个电路就坏一半。强烈建议焊接之前在面包板上先把每个管子用万用表确认一遍极性用记号笔标好再上洞洞板。第二个易错点是运放供电方式。LM358单电源供电时输入共模范围和输出电压范围都达不到满摆幅使用方法不对会出现“距离变化但输出不变”的情况。建议运放输出端预留一个对地电阻让输出在无信号时偏置在参考电压附近而不是0V这样目标和输出电压才是单调关系标定才做得起来。第三个易错点是ADC和单片机的地线处理。数字地和模拟地最好在某个单点汇合如果洞洞板上只有一个覆铜地那至少要把ADC采样引脚和电源去耦电容的地线都接到同一个点上避免数字翻转噪声顺着地线灌进模拟电路。这个细节用万用表量不出来只有示波器才能发现所以能按规范做就别偷懒。4.2 读数跳变先查电源再查环境光现象是目标保持不动LCD上的距离数字仍然在小范围跳动或者偶尔蹦出一个离谱值。我排查的顺序固定是先把量程范围里的显示值用记录软件拉出来看如果跳动的幅度只有一两个厘米属于正常噪声滤波再加强一点就行如果跳动幅度有五六厘米以上问题大概率出在电源或环境光上。电源问题的特征很典型蜂鸣器一响读数立刻变一下按键一按读数跟着跳。这说明电源线路上有脉冲干扰通常是去耦电容不够或者供电线太长。环境光问题的特征是拿手在接收管上方晃一晃读数变化明显关掉室内灯后数据立刻稳定。这时就要考虑给接收管加遮光罩或者把发射和接收管都装进一个深色塑料壳里只留前方开口。4.3 颜色和材质问题无解但可以管理用一块黑布和一块白纸分别放在同一距离上测出来的距离很可能差出10厘米以上这是红外反射法的物理本性不是电路问题。黑布吸收大部分红外光接收信号弱单片机以为目标很远白纸反射率高信号强单片机以为目标很近。处理方式分两种。如果只是做存在性检测、物体靠近报警建议干脆不以“厘米”作为主输出直接把模式定成“近、中、远”三档这样颜色差异造成的数值变动不会影响逻辑判断项目反而更稳。如果一定要显示厘米数就约定一个标准被测物材质的标定表并在文档里写明适用范围同时提示用户深色吸光物体测距结果会偏大。这个不是妥协是传感器选型时就该有的预期管理。4.4 常见问题速查表现象最可能原因检查顺序上电后LCD只有背光无字符液晶对比度电位器没调好先调滑动变阻器再看引脚是否接错ADC读数一直接近满量程接收管饱和或环境光太强检查接收管朝向遮挡侧面光ADC读数一直接近0发射管没工作或接收管接反用手机摄像头看发射管是否发光距离变化但读数不变运放偏置不对输出卡死在轨上测运放输出静态电压是否在参考值附近蜂鸣器响时会误触发电源脉冲干扰加去耦电容检查蜂鸣器驱动是否独立供电10厘米内数据失真严重接收信号过强进入饱和区降低运放增益或把发射电流调小5. 后续扩展这个方案还能怎么升级做完一版能跑的东西之后很多人就停了但我建议再往前走两步因为红外测距这个平台特别适合做扩展改造成本低收获大。5.1 把反射强度法换成三角测量模块如果你对当前方案的材质敏感性问题忍不了下一步可以换成基于三角测量原理的红外测距模块。这种模块内部门字形结构发射管和接收管呈固定角度输出电压和距离几乎是平滑反比关系对颜色材质的敏感度低很多测量范围可以扩展到十几厘米到一米。电路改动不大把自制光电前端换成模块模块输出接ADC软件里重新标定一次距离表就行。换完之后你会发现之前折腾的滤波和查表逻辑完全复用之前的经验一点没浪费。5.2 加温度补偿和自校准红外器件对温度确实敏感久开机后接收管和发射管的特性都会漂移标定表会慢慢失真。简单的解决办法是不要存储一张固定表而是每次上电初始化时让系统检测一个已知标准距离的点用当前ADC值去平移整条标定曲线。这个做法成本极低就是上电后先提示用户把目标放在标准距离位置按一次确认键软件内部记录一个校准偏移量。温度漂移的大头是缓慢变化这种单点偏移校正已经能把大部分漂移问题抹平。5.3 从单点测距到多点避障阵列单点测距仪升级成多点非常简单多焊几路发射管和接收管把接收信号通过模拟开关轮流接入同一个ADC或者直接找带多路ADC的单片机。软件上每一路分别滤波、分别标定最后在LCD上显示每个通道的距离数字就变成一个小型避障传感器阵列。这种结构加上两个舵机和简单判断逻辑就能给小车做最基础的防撞系统。当初标定的功课、滤波的逻辑、查表的方式全都原封不动平移到阵列里。最后再分享一个我这次调试过程中的小技巧红外光肉眼看不见调试发射管到底亮没亮最方便的工具不是万用表而是手机相机。打开手机相机对准发射管屏幕上如果能看到紫色或者紫白色的亮点说明发射部分正常。这个技巧我用了很多年每次帮人定位红外电路问题第一步都是这个比拿示波器测信号快得多。做硬件就是这样遇到奇怪问题别硬想换一个观察手段答案往往就跳出来了。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →