|
|
@@ -63,6 +63,9 @@ namespace AutoFocusTool.Calib
|
|
|
public int ZCoarseHalf = 30000;
|
|
|
/// <summary>Z 粗对焦步距 → 约 31 层。</summary>
|
|
|
public int ZCoarseStep = 2000;
|
|
|
+ /// <summary>粗对焦开扫前的额外停稳等待(ms)。复位后Z大行程冲到起点需充分停稳,
|
|
|
+ /// 否则前几层抓到运动拖影帧形成伪峰。默认2000。</summary>
|
|
|
+ public int CoarseSettleMs = 2000;
|
|
|
|
|
|
// ── Z 精对焦(围绕粗峰)──
|
|
|
/// <summary>精对焦半幅(覆盖粗扫 ±2000 峰定位误差并留余量)。</summary>
|
|
|
@@ -342,6 +345,15 @@ namespace AutoFocusTool.Calib
|
|
|
// P0-6: 粗对焦使用中央40%区域ROI,避免背景干扰
|
|
|
var centerROI = CenterRoi40();
|
|
|
|
|
|
+ // 【偶发伪峰修复 2026-06-16】先移到扫描起点并额外等待,确保大行程移动停稳后再开扫。
|
|
|
+ // 根因:手动复位会把 Z 打到远端(2000),正式标定时 Z 要大行程冲到 lo(60000);
|
|
|
+ // 若直接逐层扫描,前几层在电机尚未停稳时抓到“运动拖影帧”,高频被放大成伪峰
|
|
|
+ // (实测 z=74000 拍到 5.30 伪峰,骗过粗对焦;精对焦回到同一 Z 仅 3.21 无峰)。
|
|
|
+ // 故开扫前先到位 + 额外停稳等待。(后续可改“轮询回读位置确认到位”更精准,暂用延时。)
|
|
|
+ _motor.VerticalMoveTo(ClampZ(lo), ScanDelayMs);
|
|
|
+ Thread.Sleep(CoarseSettleMs);
|
|
|
+ Grab(); // 丢弃到位前的残留帧
|
|
|
+
|
|
|
int layers = 0;
|
|
|
for (int z = lo; z <= hi; z += ZCoarseStep)
|
|
|
{
|