简介:这份CODE V设计实例文档面向光学设计初学者与需要快速上手CODE V的工程师,围绕低价位定焦VGA数码相机物镜的设计流程展开,重点演示建立镜头、缩放镜头与像差曲线分析。内容从640×480传感器、7.4μm像素、6mm焦距、F/3.5、半视场约26.5°等规格入手,说明如何借新镜头向导和专利库筛选起始结构,再通过一阶近轴数据检查并缩放系统,使有效焦距达到6mm,同时兼顾几何畸变、角落相对照度、400~700nm透过率及IR滤光片选型要求。压缩包仅含1个doc文件,约45KB,以图文步骤和参数说明承载完整实例,便于打印或边做边查。已有1346人学习,读者可从中获得规格转参数、专利起始点筛选、缩放校验以及MTF像差曲线判读的具体思路。文档按规格设定、起始点选择、缩放调整、分析验证的顺序组织,适合课程作业与项目预研时对照参考。
1. 从一份 VGA 定焦规格说起:6mm 焦距、F/3.5 的镜头在 CODE V 里怎么起步
一份十几行的规格单摆在面前:640×480 有效像素、像素 7.4μm、焦距 6mm、F/3.5、畸变小于 4%、元件数一到三片。多数人第一反应是翻书补理论,其实这类活儿在 CODE V 里有一条很成熟的路径:用新镜头向导建立镜头,从专利库里找相近结构当起始点,用缩放镜头把有效焦距拉到 6mm,再靠像差曲线、点列图和 MTF 判断这套起始方案值不值得往下优化。这个 CODE V 设计实例不复杂,但它把光学设计里最容易被跳过的一段暴露得很清楚——起始点选得对不对,后面全靠这一步兜底。适合刚接手镜头建模的工程师,也适合装了 CODE V 却只敢看图不敢改数的人。
2. 从 640×480 到专利起始点:像高、半视场角与 67.6 lp/mm 的换算和向导填写
2.1 把像素阵列换算成像高与半视场角
规格单第一行是 640×480 有效像素、单像素 7.4μm×7.4μm。这三个数字放进乘法里,得到的才是光学设计真正关心的量:水平方向 640×0.0074=4.736mm,垂直方向 480×0.0074=3.552mm,对角线开根号约 5.92mm,规格上写成 6mm。也就是说这块传感器的半对角线高度是 3mm,后面所有的视场定义、畸变换算、像高核对,都是围绕这个 3mm 展开的。
有了像高和焦距,视场角就不是拍脑袋定的。无穷远物距下用 h=f·tanθ,把 h=3mm、f=6mm 代进去,tanθ=0.5,半视场角 26.5°,全视场 53°。这个数在后面的系统数据页里要直接填进去,而且一旦定了就不该在优化过程中反复改,因为视场角一变,所有按视场归一化的像差判读全要重来。
| 规格条目 | 数值 | 换算出的光学量 |
|---|---|---|
| 有效像素 | 640×480 | 阵列 4.736mm×3.552mm |
| 像素尺寸 | 7.4μm×7.4μm | 奈奎斯特频率 67.6 lp/mm |
| 像面对角线 | 约 6mm | 半像高 3.0mm |
| 有效焦距 | 6mm | 半视场角 26.5°(全视场 53°) |
| F/# | 3.5 | 入瞳直径约 1.71mm |
这里有个容易被忽略的前提:h=f·tanθ 只在物在无穷远时成立。规格写着对焦范围 0.75m 到无穷远,意味着近距离成像时像面会往远离镜头的方向移动,像高也会跟着变。低成本定焦模组的常见做法是不做整组移动对焦,把后焦定在某个折中物距上,靠景深把 0.75m 兜住——这条判断会影响你后面怎么看离焦 MTF,但在建立起始点阶段还不用展开。
2.2 67.6 lp/mm 这条截止线决定 MTF 怎么看
像素尺寸的倒数乘二分之一,就是这块传感器的采样截止频率:1/(2×0.0074)=67.6 lp/mm。为什么是两倍像素,因为一个亮暗周期至少要占两个像素才能被分辨出来,比这更密的条纹落在传感器上只会变成均匀的灰。这个数在 CODE V 里的用处很直接:MTF 图的最大频率不该设到 200 lp/mm 去看热闹,设到 68 就够了,再往上都是传感器看不见的东西。
规格单上的锐度要求分两档:17 lp/mm 中心优于 85%,51 lp/mm 那一档中心也要有 25% 以上。这两档不是随便挑的,17 lp/mm 大约对应 1/4 截止频率,衡量的是大块面的对比度,人眼对画面的第一印象来自这里;51 lp/mm 接近 0.75 倍截止频率,衡量的是细节还在不在。同一张 MTF 图上,低频高、高频掉得快,通常说明像差以大视场彗差或像散为主;低频就不高,多半是离焦或者球差没压住。
还需要记住一件事:光学系统的 MTF 在传感器截止频率处不能等于零。采样系统最终成像的锐度是光学 MTF 与像素孔径 MTF 的乘积,如果光学部分在 67.6 lp/mm 已经掉到零,乘积在截止频率附近会提前塌陷,实际画面会比仿真看着更糊。所以做这类小像面镜头,MTF 曲线在 68 lp/mm 处的值即使不达标,也不能是零。
2.3 专利过滤器四个字段的填法与余量意识
新镜头向导里选 Patent Lens,进入过滤器对话框。这个案例要的是小 F/#、较大视场、元件数少,对应三个字段:F/# 填 1~4(目标 3.5)、半视场角填 20~33(目标 26.5)、元件数填 1~3。填完之后向导从 2400 条过期专利里返回 12 条候选。
范围为什么要放宽而不是直接填 3.5、26.5、2?因为优化只能在小范围内拉动结构,起始点的视场比目标小太多时,往大扩基本等于重做——要么加元件,要么上非球面,成本直接翻。反过来,F/# 比目标小是好事,把光圈收小(数值变大)几乎不花钱,成像质量还更好。这条经验在两片式手机模组、车载环视镜头上都成立,我一般会把 F/# 上限压到目标值以下 0.5 档左右,给自己留操作空间。
| 过滤字段 | 输入范围 | 目标值 | 放宽的理由 |
|---|---|---|---|
| F/# | 1~4 | 3.5 | 起始点更快,收光圈容易、放光圈难 |
| 半视场角 | 20~33 | 26.5 | 视场往上扩需要加元件,往下收只需渐晕或裁切 |
| 元件数 | 1~3 | 越少越好 | 两片起步、三片留余量,一片基本压不住畸变和色差 |
返回列表里那条半视场 27.5°、F/2.4、元件数不多的记录(列表里标着 or02248)值得先试:视场比目标略大,F/# 比目标小一档多,正好是"能往回收"的方向。挑起始点的时候别只看参数匹配度,还要扫一眼玻璃那一列——全是用高折射率重火石或者昂贵材料的方案,就算光学指标达标,量产成本也过不了关。
2.4 系统数据页:光阑、波长权重与四个视场角
向导往后的几页问答,本质是在填系统数据。孔径光阑页选 Image F/Number,输入 3.5。用 F/# 而不是直接给入瞳直径,是因为缩放镜头时 F/# 作为比值不变,入瞳直径会跟着焦距一起缩放,这样你只需要管一个数。
波长页把 589.0nm 的权重改成 2。绿光在可见光中间,也是人眼最敏感的位置,权重加倍的直接效果是优化时这一波长的像差被压得更狠。参考波长页保持默认,它只用于近轴计算和参考光线追迹,改它不会让像质变好,只会让后面看一阶数据时对不上号。
视场页是这轮填写里最值得花时间的地方。插入 0、11、19、26.5 四个 Y 方向角度,其中 26.5 是全视场,11 和 19 是两个中间视场。19 大致是 0.7 视场(26.5×0.7≈18.6),这个位置专门用来盯像散和场曲这类随视场平方增长的像差。只给 0 和全视场两个点,图上是干净的,中间那一带的带像差全被藏起来了,等到样机拍出来边缘发虚才发现,返工成本就是重开一套模具。行业里"最少 0、0.7、1.0 三个视场"的习惯,来源就在这。
2.5 LDM 表格:哪些格子能改、什么时候才算提交
表面数据管理表格(LDM)是镜头模型的核心,它常驻界面,可以缩小但不能关掉。每一行是一个表面,从物面开始到像面结束,其中必有一个表面带 STOP 标记,那是孔径光阑,限制轴上光束。只要没启用主光线对准,任何视场的主光线都会穿过光阑中心。
能改的格子是白的,不能改的是灰的。灰色格子里装的是程序算出来的东西,比如像面前那个厚度旁边带个小 S,说明它被近轴像高求解(PIM solve)锁住了,作用是让近轴边缘光线在下一面的高度为零,也就是把近轴焦点定住。想改这个数,得先在右键菜单里把求解状态取消或者换成别的类型。同理,Y 方向半孔径默认也是算出来的,右键菜单里的 Change to 可以把它改成固定值。
修改数据有两种提交路径,区别很关键。带 OK 和 CANCEL 的对话框(比如各种分析选项、优化设置)不点 OK 就什么都不提交,点了 CANCEL 就当无事发生;而表面属性窗口、系统数据窗口这类跟 LDM 直接绑定的窗口是即时提交的,你在里面改动一下,镜头数据库里就已经变了,只是命令窗口会同步打出对应的命令。拿不准的时候点一下 Commit Changes 按钮,再扫一眼命令窗口回显,就知道刚才那一下到底改了什么。
THI S5 2.3上面这条是命令窗口里的等价写法:THI 是厚度关键字,S5 指表面 5,2.3 是这个面到下一面的距离,单位毫米。适合在改单个数值时图快,改一批数据还是回表格里点更稳。命令窗口敲回车后 LDM 会立刻刷新,如果没反应,多半是当前活动窗口不是命令窗口。
还有两个习惯值得养成:一是 Undo 只在数据表或命令窗口是当前窗口时有效,图形窗口抢了焦点就 undo 不动,翻车过一次就会记住;二是每做一次有意义的改动就 File>Save Lens As 存一版,别指望撤销键能救你十条操作之前的状态。
3. 缩放镜头到 6mm:Scale 对话框操作与一阶数据的三处连带变化
3.1 先看一阶数据,再决定动哪里
从专利库拉出来的起始点,焦距通常跟目标差着数量级。这个案例里打开 Display>List Lens Data>First Order Data,看到的 EFL 是 0.9528mm,而目标是 6mm。这时候不要急着去改曲率半径,先用一阶数据把现状摸清楚:EFL、近轴像高、像方 F/#、入瞳直径、后焦距,这五个数决定了镜头的基本形态。
| 一阶量 | 缩放前 | 缩放后目标 | 判据 |
|---|---|---|---|
| EFL | 0.9528mm | 6.0mm | 直接等于规格焦距 |
| 近轴像高(半) | 约 0.47mm | 约 3.0mm | 对应 26.5° 半视场 |
| 像方 F/# | 2.4 | 3.5 | 向导里已设定,缩放不该改变它 |
| 入瞳直径 | 约 0.40mm | 约 1.71mm | 随焦距等比放大 |
| 元件半孔径 | 小 | 放大 6.3 倍左右 | 检查是否撞到机械口径 |
把 EFL 挂在界面底部状态栏是个省事的做法,Tools>Customize 里的状态栏选项卡可以配置显示哪些量,改一处数据瞟一眼就知道焦距飘没飘。
3.2 Scale 对话框的三步操作
缩放本身只有三步,但每一步都有坑。第一步在 LDM 里点中表面 1 的编号,按住拖到像面那一行,把整个镜头系统选中——只选一片或者漏掉像面,结果就是半个系统被放大、另一半原地不动,曲率半径和间隔的匹配关系当场崩掉。第二步 Edit>Scale 打开对话框,注意对话框上会显示当前选中的表面范围,先确认它是 1 到 Image。第三步勾上 Scale Effective Focal Length,在 Scale Value 里填 6.0,点 OK。
缩放的原理是按同一个比例因子缩放所有表面的曲率半径、厚度和半孔径。因为孔径和焦距同步缩放,F/# 保持不变;因为视场是以角度定义的,视场角也不变;变的只有绝对尺寸。这也是为什么要用 F/# 而不是入瞳直径来定义光阑——用比值定义的东西在缩放下是守恒的。
有一个连带变化必须提前知道:几何像差的绝对量会跟着比例因子一起放大。起始点从 0.95mm 缩到 6mm,放大了约 6.3 倍,原来在微米级的横向像差会变成十几微米。归一化像差没变,但你在固定 lp/mm 下看 MTF,曲线会明显往下掉。这不是缩放操作出了问题,而是物理尺寸变大后衍射限的角分辨率变高、像差的绝对容差变紧了。
3.3 缩放后必须复查的四件事
点重新计算按钮刷新一阶数据,先确认 EFL 变成 6.0mm、近轴像高变成 2.99mm(和 3.0mm 差的那一点点来自视场角取整,可以接受)。这两个数对上了,说明缩放因子正确。
接着看 F/#。理论上缩放不改 F/#,但如果之前有人手动改过某个面的半孔径,或者光阑面的孔径是固定值而不是算出来的,缩放后 F/# 就会偏。这时候要么把半孔径改回自动,要么直接重新指定 Image F/Number。
然后扫一眼各面的 Y 方向半孔径。元件从不到 1mm 撑到 6mm 量级,边厚、中心厚、镜片外径的加工可行性全变了。我在这一步一定会打开 Quick 2D 看一眼外形:有没有镜片变成薄片、有没有两个面几乎贴在一起、边缘厚度是不是小于 0.5mm。这些在数字表格里看不出来,图上一眼就现形。
最后把文件存下来,命名成能认出阶段的名字(比如 DigCamStart.len)。起始点文件要单独留一份,后面所有优化都从它派生,出问题能退回来。缩放这一步做完,镜头的"骨架"就定了,接下来才是判断这副骨架撑不撑得起规格。
4. 像差曲线、点列图与 MTF:起始方案该看哪几张图、比例条怎么读
4.1 快速像差曲线:先读自动缩放比例,再读形状
工具栏上那个一键像差曲线按钮(完整路径是 Analysis>Diagnostics>Ray Aberration Curve,选项名 RIM)画的是横向光线像差:同一视场点发出的各条光线,在像面上与参考光线的交点距离,横轴是归一化瞳坐标,纵轴是毫米。完美镜头这条曲线是一条贴着零线的直线,实际镜头偏离多少,就代表像差多大。
看这张图的第一件事不是看曲线形状,而是看标题栏里的自动缩放比例。这个案例自动缩放到了 0.023mm,也就是纵轴满量程 23μm。自动缩放的好处是曲线总能填满图框,坏处是形状好看不代表量级小。判断量级要拿艾利斑做标尺:2.44·λ·F/#,取 λ=0.5876μm、F/#=3.5,算出来约 5μm。23μm 的满量程意味着横向像差已经到艾利斑直径的四五倍,这套起始点离衍射极限还远——对两片式低成本方案来说这很正常,不用慌,但也别指望它直接能用。
形状比量级更有信息量。不同颜色的曲线分开,说明色差在贡献;曲线整体呈抛物线,是球差或离焦;上下不对称、一边陡一边缓,是彗差;子午和弧矢两条曲线在全视场分开得厉害,那是像散。这些判断不需要精确计算,看图就能定方向:色差为主就往玻璃组合上想,像散为主就往光焦度分配和间隔上想。
4.2 点列图:50μm 的比例条说明什么
点列图不是规格里要求的东西,但它给的是最直观的成像质量快照。每个视场撒一个网格光线,追迹到像面,散开的形状就是几何模糊斑。点工具栏上的快速点列图(完整路径 Analysis>Geometrical>Spot Diagram,选项 SPOT),这个案例里比例条显示 0.050mm,也就是图上那个小方块代表 50μm。
四个视场的斑大小差不多、形状不同,这个信息比"斑很大"有用得多:大小相近说明各视场的弥散没有失控式增长,形状不同说明主导像差随视场在换。全视场的斑如果明显拉长成彗星状,边缘画质就会一边糊一边还行,这种不均匀比整体偏软更难接受。
想更直观一点,可以跑 Tools>Macro 里 Sample Macros/Geometrical Analysis 下的 spotdet.seq 宏,它会在点列图上叠一个代表探测器像素或艾利斑的方框圆框,跑之前要按提示填几个参数。斑明显大于那个框,说明这个视场的细节已经被弥散吃掉。
4.3 畸变网格与场曲:把传感器尺寸换算成 X/Y 半视场角
畸变的定义很朴素:实际像高和近轴像高不一致就是畸变。这个案例的视场是以角度定义的,所以要画畸变网格,得先把传感器的 4.736mm×3.552mm 换算成两个方向的半视场角。tanθx=2.368/6=0.395,θx=21.55°;tanθy=1.776/6=0.296,θy=16.48°。打开 Analysis>Diagnostics>Distortion Grid,X FOV Semi-field 填 21.55,Y FOV Semi-field 填 16.48,参考网格选 Fiducial Marks Only,执行。
结果会很"干净"——因为这套起始点的畸变在整个视场里小于 ±1%,远好于规格要求的 4%。但干净不等于没问题,放大中间视场区域会看到带状的残留畸变,也就是畸变曲线在 0.7 视场附近鼓出去一块。这种中带起伏在建筑、网格类被摄物上会表现为直线微微弯曲,而且它不随对焦消失,属于结构性问题。起始阶段发现它比优化完再发现好,因为前者还能靠调整光阑位置或面型分配去压。
场曲和畸变通常画在同一张图上(Analysis>Diagnostics>Field Curves),横轴是屈光度或毫米离焦,纵轴是视场。子午和弧矢两条线分开的距离就是像散,两条线整体偏离零位就是场曲。小像面镜头对场曲相对宽容,因为像面本身就小,但像散在 0.7 视场上会直接吃掉边缘 MTF。
4.4 衍射 MTF:17 与 51 两个频点怎么读
Analysis>Diffraction>MTF 是这套分析里最贴近规格的一张图。频率/计算选项卡里最大频率填 68,增量填 17,得到 17、34、51、68 四条竖线,正好覆盖规格里的两个判据点。改完参数后选项卡标题旁边会出现一个红色星号,那是改变指示器,提醒你参数改了但还没执行,必须点执行图才会更新——这个星号坑过太多人,图看着挺好,其实还是上一次的设置。
读图的时候分两层:先看低频 17 lp/mm,中心视场是不是在 85% 以上,全视场掉到多少;再看 51 lp/mm,中心还有没有 25%。起始点大概率两条都不达标,这没关系,这一步的目的是拿到基线。真正要记下来的是曲线掉落的形状:从中心到 0.7 视场缓慢下滑,说明是视场相关像差;一出门就断崖式下跌,多半是渐晕或者光阑挡光。
渐晕和相对照度是另一条线,用相对照度分析看角落是不是还能保住 60% 以上。规格里的透过率要求(单镜片 80% 以上、400~700nm)靠镀膜解决,跟面型设计关系不大,但在做杂散光和照度预算时要把它算进去。1mm 厚的吸收型红外截止滤光片常见做法是等效成一片平行平板加在最后一面之前,它会引入少量球差和焦移,做高精度方案时不能当它不存在。
5. 避坑与排查:五个让起始点跑偏的操作
5.1 建模与缩放阶段的三个坑
现象一:手动改曲率半径去凑焦距,改完之后 EFL 对了,点列图却比原来还差。原因是半径和间隔、半孔径是一套联动关系,单独动一个面等于破坏了这个平衡,而 Scale 是等比例缩放,所有关系都保留。解决办法很干脆:凑焦距只用 Edit>Scale,永远不用手改半径;半径只用来调像差,不用来调焦距。
现象二:缩放后只有第一片变大,后面几片纹丝不动,2D 图上镜片直接穿模。原因是拖选表面范围时只选了一行,或者选到了像面之前。解决办法是回到 LDM,点表面 1 的编号按住拖到像面那一行,确认 Scale 对话框上显示的范围是 1 到 Image,再点 OK。
现象三:像面前那个厚度是灰的,双击改不了,以为是软件卡了。原因是那个格子挂着 PIM solve,数值由近轴光线追迹算出来。解决办法是在该单元格右键取消求解,或者把求解类型换掉再改数值;改完记得检查近轴像高有没有跟着变——这个数是用来定近轴焦点的,随意解锁会让离焦判断失去基准。
5.2 分析与判读阶段的两个坑
现象四:MTF 图的参数明明改成了 68 和 17,图上还是老曲线,怎么刷新都不动。原因是选项卡标题旁边那个红色星号没消,说明参数改动还没提交执行。解决办法是改完参数先看星号,再点执行;习惯上我会在改参数和执行之间停顿一秒,专门看一眼那个星号,这条血泪经验值一个下午的排查时间。
现象五:图看着漂亮,实际一量发现横向像差满量程是 0.5mm。原因是图形工具默认自动缩放,曲线永远填满图框,好看的形状掩盖了量级。解决办法是每次打开像差曲线、点列图,先看比例条和标题上的缩放值,拿艾利斑直径(约 5μm)或者像素尺寸(7.4μm)当尺子比一比,量级不对的图没有判读价值。
还有一条不算坑但很费时间:改了数据以为生效了,其实改在一个带 OK/CANCEL 的对话框里没点 OK。判断方法很简单,瞟一眼命令窗口——即时提交的窗口每次改动都会打出一条命令,没有回显就是没提交。养成看命令窗口的习惯,比事后怀疑软件可靠得多。
6. 把分析图读成优化方向:我的复查清单与三个只会动的变量
起始点分析完,接下来是把它变成优化方向。这一步最忌讳的是"看哪都不顺眼,一次把十几个量全设成变量",结果优化跑完像质反而更差,还找不出是哪一项干的。我的做法是把图上的问题按主导像差排个序,一轮只放三个变量,跑完立刻回到同一张图上对比。
| 图上现象 | 优先动的量 | 不要动的量 |
|---|---|---|
| 各色曲线明显分离(色差) | 玻璃组合、光焦度在片间的分配 | 光阑位置 |
| 曲线呈抛物线、中心视场也差(球差) | 弯曲半径、透镜厚度 | 视场角定义 |
| 全视场子午弧矢分离(像散) | 光阑到透镜组的距离、中间间隔 | 整体缩放 |
| 中带畸变鼓出 | 光阑位置、前后组对称性 | 像面距离 |
| 角落照度不足(渐晕) | 各面半孔径、机械口径 | 曲率半径 |
验证方法我固定成三看:一看一阶数据里的 EFL 和近轴像高有没有被优化带跑偏,二看 17 lp/mm 的 MTF 中心值有没有掉,三看畸变网格有没有从"小于 1%"恶化到接近 4% 的红线。三个数不达标,就把这一轮的变量收回去,换个组合再来,绝不在一轮里连加变量。这套笨办法慢,但可复现,别人接手你的文件也能看懂每一步在干什么。
一个具体技巧:优化前先把当前版本另存一份带序号的 .len,跑完对比不满意就退回上一版,不要在同一条优化链上反复横跳。CODE V 的撤销链撑不了几十次迭代,序号存档才靠得住。
从那以后我每次接手别人留下的镜头文件,都强制先走一遍一阶数据、快速像差曲线、17 lp/mm 的 MTF 三件套,确认基准之后再动手,不确认就改等于蒙眼开车。希望帮到你。
本文还有配套的精品资源,点击获取