自动对焦标定流程图

AutoFoczool · CalibrationEngine.CalibrateWell · 生成于 2026-06-16 · 所有参数取自当前代码真实默认值

一、整体流程(一键全自动初始化)

开始:一键全自动初始化
扫描设备 → 连接舱室(相机+串口) → 勾选 well → 点击启动
相机分辨率 2592×1944 · 串口 9600 8N1 · 移动读超时 12000ms / 查询读超时 3000ms
开灯 + 准备
OpenLED() → 等待 200ms → 创建 CalibrationEngine
↓↓↓ 对每个勾选的 well 循环执行 ↓↓↓
读取该 well 的 EEPROM 参数
ReadWellHorizontalPos(well) → 水平位置;ReadWellFocusZero(well) → Z零点(仅记录,粗对焦不依赖它)
移到 EEPROM 水平位置 + 设中低曝光
HorizontalMoveTo(钳位后位置),失败重试最多 3 次;SetExposure(60)
水平钳位范围 [0, 220000] · 中低曝光 CenterScanExposure=60 (×100µs)
① 粗对焦
① 粗对焦(找大致焦面)
先移到扫描起点并额外停稳,再固定中心大窗口逐层扫描,中央40%ROI算清晰度(Tenengrad÷mean),取最高分层;每层分数落盘便于排查伪峰
中心 90000 · 半幅 ±30000 → 区间 [60000,120000] · 步距 2000 → 31层 · 每层等 350ms + 丢1帧 · 开扫前额外停稳 CoarseSettleMs=2000ms
② 水平居中
② 水平微调居中(优化Y偏移)
以EEPROM水平位为中心小范围扫描,检测well圆,选|Y偏移|最小且完整的位置
半幅 ±2000 (远小于well间距9000的一半) · 9步 → 步距≈500 · 每步等800ms · 居中容差 |Y|<12%
③ 曝光
③ 曝光二分(well内ROI测光)
二分搜索曝光值,使well盘面亮度适中(不过曝/不死黑),按 Over/Good/Under 判定
曝光范围 [10, 800] (×100µs) · 每次设曝光后等 max(200, e/5)ms + 丢1帧
④ 精对焦
④ 精对焦(围绕粗焦点细扫 + 平滑插值)
围绕粗对焦Z小范围密扫,well圆内0.95r ROI(未检出降级中央40%),3点平滑+抛物线插值求峰顶
半幅 ±6000 · 步距 500 → 25层 · 中心=粗对焦Z · 每层等350ms+丢1帧 · Z钳位[0,125000]
移到最清晰Z + 存图 + 记录结果
VerticalMoveTo(focusZ);存标定后BMP;记录 水平/Y偏/曝光/focusZ/峰比
合格判定:|Y偏|<12% 且 检出圆 且 峰比(max/mean)>1.2
所有 well 完成
关灯 + 存档
CloseLED();写 calibration.json;刷新缓存(转well立即用新结果)

二、四个对焦阶段参数详表

阶段电机轴中心范围/半幅步距(脉冲)层数/步数每步延时ROI
①粗对焦垂直Z90000(固定)±30000200031350ms
(开扫前额外停稳2000ms)
中央40%
②水平居中水平EEPROM水平位±2000≈5009800mswell圆检测
③曝光二分[10,800]二分~log₂max(200,e/5)mswell内
④精对焦垂直Z粗对焦Z±600050025350mswell圆0.95r

三、电机行程限位(安全钳位)

下限上限说明
水平(皿孔旋转)0220000实测16个well EEPROM位置 70800~205800,间距约9000
垂直Z(对焦)0125000旧工程软上限;实测焦面集中在 86000~92000
所有 HorizontalMoveTo / VerticalMoveTo 调用前都经 ClampH / ClampZ 钳位,越界写日志并截断到边界,防止撞机械限位。

四、清晰度算法(Sharpness.Compute)

值/说明
主指标Tenengrad(Sobel梯度幅值平方和)
归一化sumSq / 像素数 / mean(除以亮度均值一次方)
峰值精修3点滑动平均平滑 + 抛物线插值峰顶
对焦质量峰比 max/mean,<1.2 判定弱峰(可能空well/对焦失败)并告警
注:归一化用 ÷mean 而非 ÷mean²。早期用 ÷mean² 会因 Z 增大时画面变亮而把清晰帧压垮,导致选错最暗最糊层。改 ÷mean 后峰值正确落在真实焦面。

五、串口协议关键参数

波特率9600 8N1
移动类命令读超时(CMD_MOTOR=0x05)12000ms(覆盖大行程移动到位耗时)
查询类命令读超时(握手/读EEPROM/读位置)3000ms
电机到位延时 MotorDelayMs默认1500ms(扫描时用更短的350/800ms提速)
移动命令是开环+固定延时:下位机回复只代表"收到指令",机械到位靠延时保证。大行程移动耗时随距离增长,故移动类读超时给到12秒。