ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CODE V光学设计实战:建镜头、缩放与像差曲线解读

CODE V光学设计实战:建镜头、缩放与像差曲线解读 简介CODEV光学设计入门实例文档针对定焦VGA数码相机镜头项目完整演示从规格解读、新镜头向导选择起始专利镜头、设置F/#与视场、利用一阶属性窗口缩放焦距到通过像差曲线评估MTF并优化成像质量的全过程。文档基于CodeV软件界面逐步讲解适合初学光学设计、需要掌握镜头建模和像差分析操作的工程师与学生。包体为单个doc文件大小45KB以文字步骤和操作截图说明形式呈现便于按章节对照练习。该资源已有1326人学习浏览内容包含数码相机镜头设计规格1~3片元件、焦距6mm、F/3.5、MTF要求等、起始点筛选技巧、缩放镜头操作要点以及像差曲线与畸变、相对照度等评价指标的分析思路可帮助读者快速上手CODEV的核心设计流程。1. 让“建立镜头→缩放→看像差”跑起来而不是从教材翻起光学设计这行有个挺反直觉的现象新人都以为最难的是“怎么把镜片序列画出来”但实际上手做第一个 codev 设计实例时卡住你的往往只是三件事——初始结构从哪里来、放大缩小后系统参数怎么保持一致、像差曲线到底在说什么。这三件事串起来就是一条从草图到可评审方案的主线先建立镜头再缩放镜头到目标焦距最后用像差曲线判断当前结构还有救没救。本实例适合正在学 CODE V、手里有 ZEMAX 经验想迁移、或者已经在做定焦镜头设计但总在“方案可行但像差压不住”里打转的人。你要准备的不是厚厚的光学理论而是一个可靠的流程先让系统能跑再决定能不能要。2. 建立镜头用一组双胶合把 CODE V 的坐标、玻璃、口径全摸清2.1 从哪开始专利复用、镜头库、还是手写初始结构在 CODE V 里建立镜头第一步永远不是画图而是回答“初始结构从哪里来”。我见过太多人上来就摆几片球面然后靠软件自动优化最后落到局部极小值里出不来。常见做法有三条第一条是翻开光学设计手册或者专利找一组结构近似的镜头比如你做的是 50mm 定焦就去查双高斯或望远物镜的专利数据第二条是直接用 CODE V 自带的镜头库里面有按用途分类的样例但要注意很多范例的波长和视场都和你实际项目不一样导入后必须先改参数第三条是手写初始结构像双胶合、三片式这种解析解很成熟的结构直接用近轴公式算出光焦度分配再填表。不管哪条路最终都会落到一沓镜头数据表上面号、曲率半径、厚度、玻璃牌号、半口径、二次曲面系数、倾斜偏心量。这里有个新手最容易忽略的点CODE V 的坐标方向、符号约定和你在书本上看到的“光线从左往右”并不冲突但半径的正负以光线入射方向为准凸面朝左的正值半径和凸面朝右的负值半径不能凭感觉乱填。我一般会建议先在一个新镜头文件里把系统参数设成“无像差、无离焦”的默认状态再逐面敲入数据。2.2 用手填一组双胶合步骤、数据表、验证方式下面用一个最经典的双胶合物镜焦距 50mmF/4来做建镜头示例。这是给读者一个可以直接照抄的最小可行结构用来练手比什么复杂镜头都合适。第一步新建镜头文件后先进“系统设置”把波长设成可见光常用的 F、d、C 三条谱线主波长 0.5876µm如果你做的是红外或激光镜头这一步换成对应的激光波长或热红外波段后面所有评价都会基于这个波长权重。第二步在 Lens Data Manager 里填入下面这张表面号表面类型曲率半径 (mm)厚度 (mm)玻璃0光阑(STO)∞0AIR1球面28.944.00N-BAF42球面-27.541.80F53球面-83.2331.20AIR像面球面∞15.36AIR注意光阑放在第 0 面紧贴第一片透镜的前表面这样双胶合的入瞳位置就固定在了第一个折射面上后面做孔径设置会非常清爽。N-BAF4 和 F5 的折射率、阿贝数不同正负透镜组合才能同时压低球差和色差。填完表后第三步是在命令行敲P让 CODE V 输出近轴量重点看有效焦距是否接近 50mm、后焦距是不是 31.20mm以及入瞳直径是否等于 12.5mm。如果对不上多半是玻璃折射率随波长变了或者厚度写错。第四步更关键先不急着优化而是用LIS列出当前镜头数据再用图形窗口看一眼 2D 布局。一双正常的双胶合应该是光经过第一片会聚、第二片发散一部分最后在像面附近聚焦如果布局图里光线像被弹开一样射向屏幕外那不是系统有问题就是半口径设太小。半口径在 CODE V 里默认是“自动由光线包络确定”但有些版本导入数据后不会自动刷新需要手动圈定边缘光线到达每个面的高度这个值才是像面大小的预判依据。2.3 玻璃库与口径控制三个隐性默认值建镜头时最容易翻车的不是半径和厚度而是玻璃。CODE V 默认玻璃库可能不包含 ZEMAX 里常见的 H-FK61、H-ZLAF68 这类中国牌号玻璃。你用N-BAF4这种肖特名称没问题但一旦换成国产玻璃库就报错“材料未定义”。我的习惯是第一遍先用同类替代的肖特或豪雅玻璃把系统跑通确认结构可行性后再统一替换成生产可得的国产牌号这样避免一边找玻璃一边调结构的两难。口径控制则要看你的项目到底关心什么。如果是手机镜头这类小孔径视场大的系统边缘光线高度和主光线高度都重要中长焦镜头则主要看边缘光线在光阑上的高度。一个对新手友好的做法是在系统默认设置里把“光线瞄准”改成“真实光线瞄准”防止近轴光线和真实光线在边缘视场出现明显偏差。别问为什么你在一只 F/1.4 的镜头上看一次像差曲线和点列图的差异就明白了。缩放镜头之前务必回到这个双胶合文件确认所有面都不是无穷小通光口径否则后面一旦放大系统会自动按比例放大但镜片的实体口径可能被“锁死”导致实际加工做不出来。3. 缩放镜头先锁 F 数再动半径三条像差标度才不翻车3.1 缩放到底在缩放什么焦距、口径、还是像面大小很多人把“缩放镜头”想得太简单以为把所有半径和厚度乘以同一个因子就完了。如果只是为了一页 PPT 展示那确实可以但为了一次设计评审或给后续优化打底你得问清楚缩放的目标焦距和 F 数是同时固定还是只固定一个拿刚才那双胶合来说原始 50mm F/4 系统想变成 100mm F/4这时候入瞳直径也要从 12.5mm 放大到 25mm所有通光口径跟着乘 2没有问题。可如果你想保持 12.5mm 入瞳不变做成 100mm F/8 的系统那这时候不该等比放大口径只该放大焦距相关的纵向尺寸。CODE V 的缩放工具里通常有“保持F数”和“保持入瞳直径”两个选项选错一个后面的像差曲线会给你很真实的脸色看。缩放操作的常规步骤是先在系统里找到当前有效焦距用P或者系统数据表看算出缩放因子k 目标焦距 / 当前焦距。然后打开缩放对话框输入 k勾选你要“保持 F/#”还是“保持孔径”。我一般会额外勾选“缩放像面到后焦距后自动重新设定”这一步的作用是让像面跟着系统变化不至于缩放后焦点跑到像面前面一大截。3.2 手动乘系数与命令缩放哪个更可靠作为一线操作我既用过工具面板也写过命令流最终回归到命令并不是因为懒而是因为可重复。手动在数据表里把所有厚度和半径乘 k第五次做同一个流程时一定会漏掉某个面的二次曲面系数或者偏心量。而命令方式的好处在于整个缩放过程可以用一段文字记录下来下次换一个初始结构只要把原始数据替换掉跑出来的结果一模一样。下面是我常用的一套操作序列按习惯我会直接在命令行敲! 读取当前近轴参数确认焦距 P ! 设定缩放因子等比缩放所有透镜面半径、厚度、半口径 ! 同时保持当前 F/# 不变 SCALE FOCAL_LENGTH 100.0 SPT ! 查看缩放后的系统近轴数据核对 F/# 和后焦距 P这段不是完整的官方命令只是真实操作逻辑的浓缩。实际运行时第一步P用于确认当前焦距和 F/#第二步会把系统所有面的曲率半径、厚度、通光半口径按同一因子缩放并把新的目标焦距设为 100mm第三步立刻用SPT拉一版点列图看像质有没有在缩放过程中发生“意外漂移”最后再用P核对 F/# 有没有从 4 变成 8。如果你发现点列图里的 RMS 半径没有按比例同步放大别慌先检查是不是缩放时像面没有跟着移动。3.3 像差标度为什么等比缩放后 aberrations 不会完全等比变大缩放镜头时有个绕不开的规律理解它你才知道下一步优化该信谁。三级像差理论里球差的横向值大致随边缘光线高度 h 的三次方变化纵向球差则和 h 的平方相关当系统焦距放大 k 倍且 F/# 不变时h 也乘以 k横向球差大致按 k 倍长大纵向球差按 k 倍长大。换句话说像差曲线纵轴的数值大概率会从原来的几个微米变成十几个微米这是正常的“等比放大”不是系统坏了。真正会让你翻车的是“色差”这一类随波长相关的像差因为它们和系统的口径、光焦度分布直接绑定缩放后如果玻璃折射率不变色差不会像球差那样听话地线性变化而是会受阿贝数分配的影响曲线形状可能从对称变成不对称。所以缩放完成后第一个要看的不是像差曲线的绝对值大小而是看曲线的“形状”是否保持了缩放前的特征。双胶合球差曲线原本是一条接近三次方形状的弧线缩放后弧线应该还是弧线只是纵轴量级放大如果弧线变成了 S 形或者出现明显锯齿通常说明缩放过程修改了不该修改的 F/#或者某些面被误锁定成了“固定值”。在 CODE V 里一旦某个面的半径或厚度被定义了变量缩放工具默认不会动它这是很多人用了半天才发现“我明明乘了 2怎么后面三个面纹丝不动”的原因。因此缩放前务必把所有变量取消或用“重置”把所有面的约束清空。缩放还有一个边界值得说当缩放因子接近 0.1 或大于 10 时原先适用于三级像差理论的线性外推会开始失效。小体积镜头从 50mm 缩到 5mm元件加工公差、空气间隔误差对像质的干扰会被急剧放大而放大 10 倍以上的系统材料均匀性、热膨胀、镜片重量这些原本可以忽略的因素会变成主要矛盾。我的习惯是缩放因子跨过 10 倍之后不再迷信缩放结果而是基于缩放后的结构重新做一次全局优化把边界条件换到真实加工极限。4. 像差曲线先读 Ray Fan再读场曲最后看 SPT4.1 三类曲线分别回答什么问题在 CODE V 里看像差最怕的就是把一堆曲线堆在一起然后发呆。像差曲线图谱里常见的有三类光线像差曲线Ray Fan也叫光线扇形图、场曲/畸变曲线、点列图SPT。它们回答的问题完全不同Ray Fan 告诉你“某个视场的光线在光瞳不同位置偏离像点的程度有多严重”看的是均匀性场曲/畸变曲线告诉你“中心区和边缘区的对焦位置差多少、实际像高和理论像高差多少”看的是全局趋势点列图把所有光线打到像面上的坐标汇成一团直接看到成像光斑的形状和大小。三者不是替代关系而是从“光瞳分布 → 视场分布 → 像面分布”三个维度看同一个系统。我的读图顺序基本铁打不动先看 Ray Fan因为它是调整球差、彗差、像散最直接的信息源。横轴是归一化光瞳坐标纵轴是该坐标下光线在像面上的横向偏移单位通常为 µm。如果曲线的斜率在边缘特别陡系统离焦如果曲线的上半段和下半段不对称有彗差如果子午和弧矢两条曲线分离存在像散如果整个曲线呈三次方形态那是球差占主导。4.2 CODE V 的输出设置和判读参数在 CODE V 图形窗口调出像差曲线一般可以选择Ray Aberration和Field Curvature/Distortion。对于双胶合这类小视场系统我会选 0、0.35、0.7、1.0 四个视场点子午和弧矢两个方向都要显示。默认设置里横轴比例是 ±1纵轴比例可能自动缩放这里有个特别坑的地方如果某个视场像差非常大软件会把纵轴自动放大到一个很大范围此时其他视场的曲线看起来都是平的你误以为系统不错。解决办法是手动设定统一的纵轴范围比如 ±50µm强迫所有曲线在同一比例尺下对比这样才能看出边缘视场相对中心视场的真实恶化程度。场曲/畸变曲线则比较特殊横轴一般是离焦量mm纵轴是视场高度归一化或直接以 mm 表示。图中能看到四条线子午场曲T、弧矢场曲S和畸变通常以百分比单独作一张小图或同一张图的下半部分。双胶合镜头最常见的毛病就是匹兹伐场曲太大T 和 S 两条线在边缘明显分开。T、S 之间的差值就是像散这个差值如果超过焦深的三分之一就得考虑在光阑附近或远离光阑的位置加一片负透镜来平衡。畸变则相对宽容只要不超过 1~2%很多成像应用可以接受。点列图的设置则更简单但要注意“几何 RMS”和“衍射极限”的关系。看 SPT 时我会顺手拉出艾里斑半径或者用SPT窗口里的 Airy 显示如果点列图 RMS 半径比艾里斑大好几倍系统显然被几何像差主导如果 RMS 已经小于艾里斑一半说明系统已经进入衍射受限区间此时再硬压几何像差收益很小不如把精力放在 MTF 和公差上。这条界限可以给缩放后的设计定一个“还能不能救”的基线。4.3 像差曲线数值怎么读成设计决策从曲线到决策我给自己定了一个简单换算表。Ray Fan 里边缘视场最大纵轴偏移除以系统焦深约λ / NA²大于 1/3优先处理球差和彗差T/S 曲线分离量折合到像面上大于一个艾里斑时优先处理像散和场曲畸变百分比超过项目要求时直接去调整光阑位置而不是盲目加非球面。像差曲线不是给你看着好玩的它是优化方向的路标。知道当前是球差主导还是彗差主导你才决定下一步是改光焦度分配、加非球面还是换玻璃。5. 避坑清单建镜头到缩放再看曲线的 5 条血泪经验5.1 现象缩放后像差曲线形状没变MTF 却断崖式下跌原因大概率是缩放时保持的是入瞳直径而不是 F/#。焦距拉长后入瞳没跟着变实际数值孔径变小衍射艾里斑变大MTF 必然掉得莫名其妙。这个坑几乎每个做过缩放的人都会踩一遍因为软件对话框里默认项可能是“保持入瞳”而不是“保持F/#”。解决缩放前先做好近轴记录缩放后用P核对 F/# 是否保持原值如果发现 F/# 从 4 变成 5.6马上把缩放因子里的孔径项改成固定 F/#再重新缩放一次。核对永远比信任面板选项可靠。5.2 现象Ray Fan 曲线很光滑但点列图一塌糊涂原因只看了近轴光线追迹的结果没有开“真实光线瞄准”。在镜头孔径较大或视场较大的系统里近轴光线和真实光线的差异会在边缘视场被明显放大Ray Fan 显示得像模像样实际光线却跑到像面上散开。解决检查系统设置里的光线追迹模式把它从“近轴”改成“真实”同时把像差曲线分析时的视场点至少包括 0.7 和 1.0别只看轴上。前者会改变像差曲线数值但更接近真实装调结果。5.3 现象像差曲线纵轴数值和 ZEMAX 里对应量相差一个数量级原因单位没对齐。CODE V 里有些图形默认纵轴单位是微米有些图则用毫米而场曲/畸变图的畸变默认又是百分比。当你从 ZEMAX 或者论文里看到“PV 0.8µm”这类数值拿它去对比 CODE V 的结果时必须先确认单位不然一个 µm 一个 mm看起来差了 1000 倍实际上结论一致。解决在图的设置里把单位统一成微米并打开单位标注截图进报告前再强制检查一次纵横轴标题。5.4 现象从专利抄来的非球面数据缩放后像差曲线出现不规则跳动原因很多非球面的高阶系数是在特定口径和有效焦距下拟合出来的缩放时如果只把半径和厚度乘了因子圆锥常数和 4/6/8 阶非球面系数没有按归一化半径作对应换算曲线自然会出现“折线感”。解决办法是非球面所在的表面要按口径比例更新系数或者在缩放时将非球面面型同步缩放让表面矢高在新口径下保持原始比例。具体系数怎么换算可以参考非球面矢高公式的缩放关系而不是手动猜。5.5 现象批量缩放几十个专利结构每次都在同一个表面报错原因用的是交互式 GUI 操作而不是宏。交互操作出错不可怕可怕的是无法复现错误。解决把“导入数据→设波长→缩放→输出像差曲线”全流程写成一段宏每次只改文件路径或缩放因子跑完后统一收集结果。这样即便某个结构翻车也能通过日志定位是原始数据有问题还是缩放条件不合理。这个习惯算是把我的工作效率提升了至少三倍。6. 把像差曲线变成下一步设计决策的三种验证手法像差曲线看完不要直接关窗口接下来要做的是验证。第一种验证叫“反推离焦量”在 Ray Fan 的曲线族里如果各视场的曲线斜率大体一致说明当前系统存在统一离焦直接在像面位置加一段“离焦扫描”比如在系统编辑器里把像面厚度从 -0.1mm 扫到 0.1mm看哪一档曲线最平那就是最佳像面。这个操作能帮我摆脱“每片镜子都完美但整机不清晰”的窘境。第二种验证是“交叉验算”把缩放后的镜头导出一份文本格式的数据到另一个光线追迹软件比如 ZEMAX 或 OSLO里搭一遍比较两个软件的像差曲线。不要嫌麻烦两个软件在非球面坐标、光线追迹采样方式上的差异能帮你发现很多“CODE V 说没问题但实际加工就是不行”的隐患。交叉核对时注意F/#、视场角定义和光线数要完全一致。第三种验证是“公差前预览”在 CODE V 里先用像差曲线找到当前设计的主导像差然后把这主导像差对应的结构参数设成公差项跑一个快速灵敏度公差。比如 Ray Fan 显示彗差很大那你就把玻璃偏心公差收紧到 0.01mm跑完看边缘视场 MTF 是否还在规格内。如果边缘 MTF 依然掉得厉害说明不是公差问题而是设计本身余量不够回去改结构比改公差表更有用。我现在的习惯是每次缩放到一个新焦距都会在像差曲线图上手动加一行注释记下日期、目标焦距和当前 F/#存成带时间的文件名。这行注释看起来不起眼但三个月后回看项目时你能想起来“当时是为什么决定从这里开始优化的”。希望这些边界和参数能帮你在 CODE V 的建立-缩放-看曲线上少绕几次弯直接拿到可复现的结果。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进